Парсинг данных из WebSocket через webbrowser - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день!, решите за меня помогите разобраться или подпихните в какую сторону копать? Создаю браузер, открываю сайт и вижу постоянно обновляющуюся информацию, так вот как ее оттуда достать? С помощью ГуглХрома достаю инструментами разработчика: Network => в списке нахожу websocket => и уже в нём смотрю во вкладке frames пробегающие сообщения. Голову сломал, как перехватить этот поток и вывести для просмотра программным методом..
Добавлю немного кода..
Листинг программы
  1. using System;
  2. using System.Windows.Forms;
  3. namespace Browser
  4. {
  5. public partial class MainForm : Form
  6. {
  7. public MainForm()
  8. {
  9. InitializeComponent();
  10. }
  11. //Добавляем обычные для броузера кнопки (старт, рефреш, назад, вперед...)
  12. void StartClick(object sender, EventArgs e)
  13. {
  14. wBrowser.Navigate(adress.Text);
  15. }
  16. void HomeClick(object sender, EventArgs e)
  17. {
  18. wBrowser.Navigate("Сайт с потоком");
  19. }
  20. void RefreshClick(object sender, EventArgs e)
  21. {
  22. wBrowser.Refresh();
  23. }
  24. void ForwardClick(object sender, EventArgs e)
  25. {
  26. wBrowser.GoForward();
  27. }
  28. void BackClick(object sender, EventArgs e)
  29. {
  30. wBrowser.GoBack();
  31. }
  32. void Button2Click(object sender, EventArgs e) // Кнопка, чтоб ТекстБокс чистить
  33. {
  34. showLog.Text = "";
  35. }
  36. void Button1Click(object sender, EventArgs e) // По клику записываем данные из потока в ТекстБокс.
  37. {
  38. HtmlWindow hwin = wBrowser.Document.Window;
  39. if (hwin.Frames.Count > 0)
  40. {
  41. foreach (var text in hwin.Frames)
  42. {
  43. showLog.Text += text.ToString(); // сохраняем значение в ТекстБокс
  44. // И вот тут-то порылась собака..
  45. // Он мне честно сообщает в текстбокс "System.Windows.Forms.HtmlWindow"
  46. // Вместо того, чтоб порадовать сообщениями из потока
  47. //MessageBox.Show("OK!");
  48. }
  49. }
  50. }
  51. }
  52. }

Решение задачи: «Парсинг данных из WebSocket через webbrowser»

textual
Листинг программы
  1. //stackoverflow.com/questions/2064641/is-there-a-websocket-client-implemented-for-net
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Net;
  6. using System.Net.Sockets;
  7. using System.Text;
  8.  
  9. public class WebSocket
  10. {
  11.     private Uri mUrl;
  12.     private TcpClient mClient;
  13.     private NetworkStream mStream;
  14.     private bool mHandshakeComplete;
  15.     private Dictionary<string, string> mHeaders;
  16.  
  17.     public WebSocket(Uri url)
  18.     {
  19.         mUrl = url;
  20.  
  21.         string protocol = mUrl.Scheme;
  22.         if (!protocol.Equals("ws") && !protocol.Equals("wss"))
  23.             throw new ArgumentException("Unsupported protocol: " + protocol);
  24.     }
  25.  
  26.     public void SetHeaders(Dictionary<string, string> headers)
  27.     {
  28.         mHeaders = headers;
  29.     }
  30.  
  31.     public void Connect()
  32.     {
  33.         string host = mUrl.DnsSafeHost;
  34.         string path = mUrl.PathAndQuery;
  35.         string origin = "http://" + host;
  36.  
  37.         mClient = CreateSocket(mUrl);
  38.         mStream = mClient.GetStream();
  39.  
  40.         int port = ((IPEndPoint)mClient.Client.RemoteEndPoint).Port;
  41.         if (port != 80)
  42.             host = host + ":" + port;
  43.  
  44.         StringBuilder extraHeaders = new StringBuilder();
  45.         if (mHeaders != null)
  46.         {
  47.             foreach (KeyValuePair<string, string> header in mHeaders)
  48.                 extraHeaders.Append(header.Key + ": " + header.Value + "\r\n");
  49.         }
  50.  
  51.         string request = "GET " + path + " HTTP/1.1\r\n" +
  52.                          "Upgrade: WebSocket\r\n" +
  53.                          "Connection: Upgrade\r\n" +
  54.                          "Host: " + host + "\r\n" +
  55.                          "Origin: " + origin + "\r\n" +
  56.                          extraHeaders.ToString() + "\r\n";
  57.         byte[] sendBuffer = Encoding.UTF8.GetBytes(request);
  58.  
  59.         mStream.Write(sendBuffer, 0, sendBuffer.Length);
  60.  
  61.         StreamReader reader = new StreamReader(mStream);
  62.         {
  63.             string header = reader.ReadLine();
  64.             if (!header.Equals("HTTP/1.1 101 Web Socket Protocol Handshake"))
  65.                 throw new IOException("Invalid handshake response");
  66.  
  67.             header = reader.ReadLine();
  68.             if (!header.Equals("Upgrade: WebSocket"))
  69.                 throw new IOException("Invalid handshake response");
  70.  
  71.             header = reader.ReadLine();
  72.             if (!header.Equals("Connection: Upgrade"))
  73.                 throw new IOException("Invalid handshake response");
  74.         }
  75.  
  76.         mHandshakeComplete = true;
  77.     }
  78.  
  79.     public void Send(string str)
  80.     {
  81.         if (!mHandshakeComplete)
  82.             throw new InvalidOperationException("Handshake not complete");
  83.  
  84.         byte[] sendBuffer = Encoding.UTF8.GetBytes(str);
  85.  
  86.         mStream.WriteByte(0x00);
  87.         mStream.Write(sendBuffer, 0, sendBuffer.Length);
  88.         mStream.WriteByte(0xff);
  89.         mStream.Flush();
  90.     }
  91.  
  92.     public string Recv()
  93.     {
  94.         if (!mHandshakeComplete)
  95.             throw new InvalidOperationException("Handshake not complete");
  96.  
  97.         StringBuilder recvBuffer = new StringBuilder();
  98.  
  99.         BinaryReader reader = new BinaryReader(mStream);
  100.         byte b = reader.ReadByte();
  101.         if ((b & 0x80) == 0x80)
  102.         {
  103.             // Skip data frame
  104.             int len = 0;
  105.             do
  106.             {
  107.                 b = (byte)(reader.ReadByte() & 0x7f);
  108.                 len += b * 128;
  109.             } while ((b & 0x80) != 0x80);
  110.  
  111.             for (int i = 0; i < len; i++)
  112.                 reader.ReadByte();
  113.         }
  114.  
  115.         while (true)
  116.         {
  117.             b = reader.ReadByte();
  118.             if (b == 0xff)
  119.                 break;
  120.  
  121.             recvBuffer.Append(b);          
  122.         }
  123.  
  124.         return recvBuffer.ToString();
  125.     }
  126.  
  127.     public void Close()
  128.     {
  129.         mStream.Dispose();
  130.         mClient.Close();
  131.         mStream = null;
  132.         mClient = null;
  133.     }
  134.  
  135.     private static TcpClient CreateSocket(Uri url)
  136.     {
  137.         string scheme = url.Scheme;
  138.         string host = url.DnsSafeHost;
  139.  
  140.         int port = url.Port;
  141.         if (port <= 0)
  142.         {
  143.             if (scheme.Equals("wss"))
  144.                 port = 443;
  145.             else if (scheme.Equals("ws"))
  146.                 port = 80;
  147.             else
  148.                 throw new ArgumentException("Unsupported scheme");
  149.         }
  150.  
  151.         if (scheme.Equals("wss"))
  152.             throw new NotImplementedException("SSL support not implemented yet");
  153.         else
  154.             return new TcpClient(host, port);
  155.     }
  156. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут