В C# есть два WebBrowser, один в пространстве имен System.Windows.Controls.WebBrowser, а другой в System.Windows.Forms.WebBrowser.
Похоже первый браузер который есть в WPF а это System.Windows.Controls.WebBrowser он вроде по функционалу слабенький для парсеров и ботов, поэтому мы будем использовать webbrowser System.Windows.Forms.WebBrowser.
чтобы не выводились ошибки сценария JavsScript добавим
1 |
webBrowser.ScriptErrorsSuppressed = true; |
1. Подключение WebBrowser к WPF
И так для начала нам нужно подключить веббраузер. По умолчанию у нас подключен System.Windows.Controls.WebBrowser. Его использовать не составляет труда, но потому что он убогий по функционалу, мы будем использовать другой из WondowsForm. Для того чтобы использовать пространство имен System.Windows.Forms нужно в менеджере ссылок его подключить. Заходим в проект и добавляем ссылки System.Windows.Forms , а также нужно еще добавить ссылку WindowsFormsIntegration. Все мы можем использовать браузер.
Чтобы браузер было виндо нужно его встроить на страницу
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<Window x:Class="Test_fl.ru.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Test_fl.ru" xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" mc:Ignorable="d" Title="MainWindow" Height="489.577" Width="860.586"> <Grid Margin="0,0,2,-21"> <Button x:Name="button" Content="Start" HorizontalAlignment="Left" Margin="718,24,0,0" VerticalAlignment="Top" Width="75" Click="button_Click" IsDefault="True"/> <TextBox x:Name="url" HorizontalAlignment="Left" Height="23" Margin="38,24,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="600"/> <WindowsFormsHost Margin="38,24,189,57"> <forms:WebBrowser x:Name="webBrowser"></forms:WebBrowser> </WindowsFormsHost> </Grid> </Window> |
этой строчкой мы указываем ссылку на формы
1 |
xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" |
а эти строчки встраивают браузер на страницу
1 2 3 |
<WindowsFormsHost Margin="38,24,189,57"> <forms:WebBrowser x:Name="webBrowser"></forms:WebBrowser> </WindowsFormsHost> |
2. Прочитать текст из WebBrowser
Просто так нельзя присвоить, потому что если сайт будет в cp1251 или другой кодировке отличной от utf8, то при записи в файл будут крякозябры
1 |
string text = webBrowser.DocumentText; |
Нужно делать так через потоки
1 2 3 4 5 |
Stream stream = webBrowser.DocumentStream; StreamReader sr = new StreamReader(stream, Encoding.Default); string text = sr.ReadToEnd(); stream.Close(); textBox.Text = text; |
3. Удалить cookie из webbrowser
Подключаем wininet.dll
1 2 3 4 5 6 |
[DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern bool InternetSetOption( IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength); |
не забываем добавить в самом начале файла
1 |
using System.Runtime.InteropServices; |
И сам код
1 2 3 4 5 6 7 8 |
//logOut private void button_logout_Click(object sender, RoutedEventArgs e) { if(InternetSetOption(IntPtr.Zero, 42, IntPtr.Zero, 0)) { System.Diagnostics.Process.Start("cmd.exe", "/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255"); } } |
Отключить вывод ошибко в webbrowser
1 |
webBrowser.ScriptErrorsSuppressed = true; |
Дождаться конца загрузки страницы DocumentCompleted
1 2 3 4 5 6 7 8 9 |
//событие на загрузку страницы private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.AbsolutePath != (sender as System.Windows.Forms.WebBrowser).Url.AbsolutePath) return; m_flag = false; m_timer.Stop(); } |
webbrower шаблон для winforms
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace BotForSteam { public partial class Form1 : Form { public System.Windows.Forms.Timer m_timer;//таймер public int m_count; public bool m_flag; public Form1() { InitializeComponent(); //инициализация таймера m_timer = new System.Windows.Forms.Timer();//таймер m_timer.Tick += new EventHandler(f_timer);//подписка на событие m_timer.Interval = 1000;//1 секунда webBrowser.ScriptErrorsSuppressed = true; webBrowser.Navigate("http://google.ru"); } private void button_Start_Click(object sender, EventArgs e) { MyNavigate("http://fl.ru"); } private void button_Logout_Click(object sender, EventArgs e) { } //таймер private void f_timer(object sender, EventArgs e) { m_count--; textBox.AppendText(Convert.ToString(m_count, 10) + "\n"); if (m_count < 0) { m_flag = false;//выход из цикла } } //функция для загрузки страницы private void MyNavigate(string url) { m_flag = true; m_count = 10;//секунд m_timer.Start();//запуск таймера webBrowser.Navigate(url); while (m_flag) { System.Windows.Forms.Application.DoEvents(); //задержка 0.1 сек System.Threading.Thread.Sleep(TimeSpan.FromSeconds(0.1)); } m_timer.Stop();//остановка таймера } //событие на загрузку страницы private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.AbsolutePath != (sender as System.Windows.Forms.WebBrowser).Url.AbsolutePath) return; m_flag = false; m_timer.Stop(); } } } |
еще один
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices;//для подключения длл namespace BotForSteam { public partial class Form1 : Form { public System.Windows.Forms.Timer m_timer;//таймер public int m_count; public bool m_flag; [DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)] private static extern bool InternetSetOption( IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength); public Form1() { InitializeComponent(); //инициализация таймера m_timer = new System.Windows.Forms.Timer();//таймер m_timer.Tick += new EventHandler(f_timer);//подписка на событие m_timer.Interval = 1000;//1 секунда webBrowser.ScriptErrorsSuppressed = true; webBrowser.Navigate("http://google.ru"); } private void button_Start_Click(object sender, EventArgs e) { MyNavigate("http://fl.ru"); } private void button_Logout_Click(object sender, EventArgs e) { if (InternetSetOption(IntPtr.Zero, 42, IntPtr.Zero, 0)) { System.Diagnostics.Process.Start("cmd.exe", "/C RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255"); } } //таймер private void f_timer(object sender, EventArgs e) { m_count--; textBox.AppendText(Convert.ToString(m_count, 10) + "\n"); if (m_count < 0) { m_flag = false;//выход из цикла m_timer.Stop();//останавливаем таймер } } //функция для загрузки страницы private void MyNavigate(string url) { m_flag = true; m_count = 10;//секунд m_timer.Start();//запуск таймера webBrowser.Navigate(url); while (m_flag) { System.Windows.Forms.Application.DoEvents(); //задержка 0.1 сек System.Threading.Thread.Sleep(TimeSpan.FromSeconds(0.1)); } m_timer.Stop();//остановка таймера } //событие на загрузку страницы private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.AbsolutePath != (sender as System.Windows.Forms.WebBrowser).Url.AbsolutePath) return; m_flag = false;//выход из цикла m_timer.Stop();//останавливаем таймер } private void button_Set_Click(object sender, EventArgs e) { } } } |
запись в файл текста из webbrowser в той кодировке в которой он есть
1 2 3 4 5 6 7 8 |
// 2. проверяем была ли авторизация Stream stream = webBrowser.DocumentStream; StreamReader sr = new StreamReader(stream, Encoding.Default); string text = sr.ReadToEnd(); stream.Close(); //textBox.Text = text; //сохраняем в файл с кодировкой по умолчанию File.WriteAllText("data.html", text, Encoding.Default); |