Парсинг данных из 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);
    }
}

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


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

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

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