Парсинг данных из WebSocket через webbrowser - C#
Формулировка задачи:
Добрый день!, решите за меня помогите разобраться или подпихните в какую сторону копать?
Создаю браузер, открываю сайт и вижу постоянно обновляющуюся информацию, так вот как ее оттуда достать?
С помощью ГуглХрома достаю инструментами разработчика:
Network => в списке нахожу websocket => и уже в нём смотрю во вкладке frames пробегающие сообщения.
Голову сломал, как перехватить этот поток и вывести для просмотра программным методом..
Добавлю немного кода..
using System; using System.Windows.Forms; namespace Browser { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } //Добавляем обычные для броузера кнопки (старт, рефреш, назад, вперед...) void StartClick(object sender, EventArgs e) { wBrowser.Navigate(adress.Text); } void HomeClick(object sender, EventArgs e) { wBrowser.Navigate("Сайт с потоком"); } void RefreshClick(object sender, EventArgs e) { wBrowser.Refresh(); } void ForwardClick(object sender, EventArgs e) { wBrowser.GoForward(); } void BackClick(object sender, EventArgs e) { wBrowser.GoBack(); } void Button2Click(object sender, EventArgs e) // Кнопка, чтоб ТекстБокс чистить { showLog.Text = ""; } void Button1Click(object sender, EventArgs e) // По клику записываем данные из потока в ТекстБокс. { HtmlWindow hwin = wBrowser.Document.Window; if (hwin.Frames.Count > 0) { foreach (var text in hwin.Frames) { showLog.Text += text.ToString(); // сохраняем значение в ТекстБокс // И вот тут-то порылась собака.. // Он мне честно сообщает в текстбокс "System.Windows.Forms.HtmlWindow" // Вместо того, чтоб порадовать сообщениями из потока //MessageBox.Show("OK!"); } } } } }
Решение задачи: «Парсинг данных из WebSocket через webbrowser»
textual
Листинг программы
//stackoverflow.com/questions/2064641/is-there-a-websocket-client-implemented-for-net using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Sockets; using System.Text; public class WebSocket { private Uri mUrl; private TcpClient mClient; private NetworkStream mStream; private bool mHandshakeComplete; private Dictionary<string, string> mHeaders; public WebSocket(Uri url) { mUrl = url; string protocol = mUrl.Scheme; if (!protocol.Equals("ws") && !protocol.Equals("wss")) throw new ArgumentException("Unsupported protocol: " + protocol); } public void SetHeaders(Dictionary<string, string> headers) { mHeaders = headers; } public void Connect() { string host = mUrl.DnsSafeHost; string path = mUrl.PathAndQuery; string origin = "http://" + host; mClient = CreateSocket(mUrl); mStream = mClient.GetStream(); int port = ((IPEndPoint)mClient.Client.RemoteEndPoint).Port; if (port != 80) host = host + ":" + port; StringBuilder extraHeaders = new StringBuilder(); if (mHeaders != null) { foreach (KeyValuePair<string, string> header in mHeaders) extraHeaders.Append(header.Key + ": " + header.Value + "\r\n"); } string request = "GET " + path + " HTTP/1.1\r\n" + "Upgrade: WebSocket\r\n" + "Connection: Upgrade\r\n" + "Host: " + host + "\r\n" + "Origin: " + origin + "\r\n" + extraHeaders.ToString() + "\r\n"; byte[] sendBuffer = Encoding.UTF8.GetBytes(request); mStream.Write(sendBuffer, 0, sendBuffer.Length); StreamReader reader = new StreamReader(mStream); { string header = reader.ReadLine(); if (!header.Equals("HTTP/1.1 101 Web Socket Protocol Handshake")) throw new IOException("Invalid handshake response"); header = reader.ReadLine(); if (!header.Equals("Upgrade: WebSocket")) throw new IOException("Invalid handshake response"); header = reader.ReadLine(); if (!header.Equals("Connection: Upgrade")) throw new IOException("Invalid handshake response"); } mHandshakeComplete = true; } public void Send(string str) { if (!mHandshakeComplete) throw new InvalidOperationException("Handshake not complete"); byte[] sendBuffer = Encoding.UTF8.GetBytes(str); mStream.WriteByte(0x00); mStream.Write(sendBuffer, 0, sendBuffer.Length); mStream.WriteByte(0xff); mStream.Flush(); } public string Recv() { if (!mHandshakeComplete) throw new InvalidOperationException("Handshake not complete"); StringBuilder recvBuffer = new StringBuilder(); BinaryReader reader = new BinaryReader(mStream); byte b = reader.ReadByte(); if ((b & 0x80) == 0x80) { // Skip data frame int len = 0; do { b = (byte)(reader.ReadByte() & 0x7f); len += b * 128; } while ((b & 0x80) != 0x80); for (int i = 0; i < len; i++) reader.ReadByte(); } while (true) { b = reader.ReadByte(); if (b == 0xff) break; recvBuffer.Append(b); } return recvBuffer.ToString(); } public void Close() { mStream.Dispose(); mClient.Close(); mStream = null; mClient = null; } private static TcpClient CreateSocket(Uri url) { string scheme = url.Scheme; string host = url.DnsSafeHost; int port = url.Port; if (port <= 0) { if (scheme.Equals("wss")) port = 443; else if (scheme.Equals("ws")) port = 80; else throw new ArgumentException("Unsupported scheme"); } if (scheme.Equals("wss")) throw new NotImplementedException("SSL support not implemented yet"); else return new TcpClient(host, port); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д