Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
8 / 8 / 4
Регистрация: 09.10.2015
Сообщений: 37

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

12.03.2016, 14:59. Показов 5463. Ответов 3

Студворк — интернет-сервис помощи студентам
Добрый день!
Форумчане, решите за меня помогите разобраться или подпихните в какую сторону копать?
Создаю браузер, открываю сайт и вижу постоянно обновляющуюся информацию, так вот как ее оттуда достать?
С помощью ГуглХрома достаю инструментами разработчика:
Network => в списке нахожу websocket => и уже в нём смотрю во вкладке frames пробегающие сообщения.
Голову сломал, как перехватить этот поток и вывести для просмотра программным методом..

Добавлено через 52 минуты
Добавлю немного кода..

C#
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
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!");
                    }
                    
                }
        }
        
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.03.2016, 14:59
Ответы с готовыми решениями:

Парсинг через WebBrowser
Вопрос банальный, но все же. С рейтинговой системы ТО мне нужно спарсить значения. Например -...

Парсинг с сайта через WebBrowser
Нужно спарсить прокси с одного сайта. Там стоит похоже защита от DDOS поэтому обычными методами не работает. Получается получить список...

Почему не работает многопоточный парсинг через webbrowser?
Привет всем. Я честно говоря фигею. Не пойму что происходит и в чем причина . Делаю программу, которая заходит на поиск, вводит запрос,...

3
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
12.03.2016, 17:24
qficer, через webbrowser наверное никак. Я бы попробовал подключаться напрямую с помощью классов из пространства имен System.Net.WebSockets (нужен .NET 4.5 и выше)
1
8 / 8 / 4
Регистрация: 09.10.2015
Сообщений: 37
13.03.2016, 19:21  [ТС]
OwenGlendower, благодарю за идею!
На стеке нашел код, который должен вполне подойти, но еще не пробовал (оставлю здесь (под спойлером), вдруг кому поможет)
Кликните здесь для просмотра всего текста

C#
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
//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);
    }
}
0
0 / 0 / 0
Регистрация: 03.01.2017
Сообщений: 5
03.01.2017, 18:41
qficer, Привет qficer, скажи пожалуйста, получилось ли у тебя спарсить websocket?. У меня аналогичная задача. Конечно можно подключится js через webbrowser, но тогда хозяин сокет сервера спалит, что его парсят. У меня задача спарсиь websocket, посылав ему определенные заголовки, чтоб на сервере не определили, что сокет запучен не из оригинальной страници.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.01.2017, 18:41
Помогаю со студенческими работами здесь

Отправка данных через websocket
Всем доброго времени суток. Возник такой вот вопрос: Есть сервер, он получает от клиента его ID сессии и никнейм, мне необходимо добавить...

Большое потребление ресурсов процессора WebBrowser и WebSocket JS
Добрый день. Подключаюсь к серверу через веб сокет таким образом: public void Connect(WebBrowser wb) { ...

Перехват POST данных через WebBrowser
Доброго времени суток обитатели форума! Необходима помощь по Delphi. Необходимо сохранить в переменную данные, введенные в поле в...

Ввод данных через WebBrowser, зная информацию об элементах управления
Как через WebBrowser ввести текст? &lt;input type=&quot;сity&quot; class=&quot;&quot; spellcheck=&quot;false&quot; value=&quot;&quot; placeholder=&quot;Город&quot; name=&quot;City&quot;...

Парсинг данных полученных от Arduino через виртуальный COM порт
Добрый день уважаемые софорумчане,при реализации моего проекта возникла необходимость получать данные с блютуз устройства,задачу эту я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru