5 место Асинхронный Websocket для вас и ваших близких

WLDN

Client
Joined
Jul 9, 2015
Messages
357
Reaction score
564
Points
93
Здарова, братцы. :-)

Я так вдохновился вашими положительными отзывами на предыдущую статью, что решил поделиться ещё одной. :ay:

Предисловие.
В ноябре прошлого года у меня была одна удалённая работёнка, в которой мне потребовался ZennoPoster. Задача состояла в продвижении криптопроекта на ресурсах, где может находиться целевая аудитория. Одним из таких ресурсов был Discord, автоматизацию которого я стал реализовывать на стандартных кубиках. По сути с этого момента и началось моё изучение ZP.

Прошло несколько месяцев и от работы не осталось и следа, зато остался ZennoPoster с уже написанным Discord. Нужен был новый источник дохода, и после нескольких профитных тестов я решил реализовать регистратор и рассыльщик на запросах, дабы запустить больше потоков на паре моих ПК оставшихся после майнинга. Спустя некоторое время задача была реализована и трафик полился, а с ним и профит, но затем Discord стал запрашивать авторизацию, тут и началось моё изучение Websocket.

WebSocket — протокол связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и веб-сервером в режиме реального времени. (c)Википедия

WS в основном используется на ресурсах, где необходим активный обмен данными. Это могут быть мессенджеры, онлайн-игры, форексы и различные приложения, где важно обмениваться большим объёмом данных в режиме реального времени.
Клиент (браузер или приложение) с помощью WS подключается к серверу только один раз и внутри этого подключения обменивается данными.
За счет этого уменьшается объём передаваемого трафика, и тем самым WS имеет огромное преимущество перед обычными POST/GET запросами, где нужно постоянно устанавливать новые подключения и передавать заголовки.

По сути WS похож на обычный POST запрос, но чтобы его выполнить на ZP нам понадобится библиотека. В моём случае это была websocket-sharp.
О том как ей пользоваться я и опишу в этой статье. :df:


Sniffаем.
Проанализировать трафик WS можно разными способами, но самый простой и доступный это использование браузера на базе Chromium. В моём случае это SWIron.
  1. Заходим на discordapp.com
  2. Открываем DevTools нажатием на F12
  3. Переходим на вкладку Network -> WS -> Frames
  4. Регистрируем новый аккаунт и заходим
Должна отобразиться следующая картина:
45838


Разберёмся что здесь к чему.
В колонке Name при наведении отобразится ссылка для запроса, её можно скопировать к себе нажав на пр. кн. мыши и соответствующее меню: wss://gateway.discord.gg/?encoding=json&v=6&compress=zlib-stream
В колонке Data можно увидеть исходящие и поступающие запросы. Копируем себе первый исходящий запрос (это запрос, который мы должны отправить серверу для авторизации):
{"op":2,"d":{"token":"NjMwMTU2ODYzNDcxNjE2MDMw.Xe9SFw.GLgMR8R7vQPnHOmaD5KmHqU4vmk","properties":{"os":"Windows","browser":"Chrome","device":"","browser_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3650.0 Iron Safari/537.36","browser_version":"","os_version":"10","referrer":"","referring_domain":"","referrer_current":"","referring_domain_current":"","release_channel":"stable","client_build_number":50980,"client_event_source":null},"presence":{"status":"online","since":0,"activities":[],"afk":false},"compress":false}}

Теперь мы можем проверить будет ли работать наш WS на отдельном клиенте. Для этого можно использовать расширение Simple WebSocket Client.
  • Прописываем URL
  • Открываем Websocket нажатием на Open (в логах должно появиться первое сообщение с heartbeat_interval)
  • Вставляем тело исходящего запроса в поле Request и нажимаем Send. В логах мы получим ответ, что всё прошло успешно.
45856


Супер! :ay: Всё работает как надо, дело осталось за малым - реализовать тоже самое на ZennoPoster.:du:

Realизуем.
Для начала нам нужен сам websocket-sharp.dll. Качаем и вытаскиваем его с помощью WinRAR. Закидываем библиотеку в папку ExternalAssemblies. Добавляем его в наш проект с помощью блока "Ссылки из GAC" и прописываем using:
Директивы using и общий код:
using WebSocketSharp;
using WebSocketSharp.Server;
using WebSocketSharp.Net;
Сразу закинем тело запроса в переменную wss_data.
45971


Кстати, в тестовом шаблоне я использовал тело запроса от десктопной версии, поэтому просто можете закинуть свой токен в переменную для теста. (build number - версия клиента)
Если взглянуть на трафик в браузере, то можно заметить, что сокет не закрывается и принимает/отправляет периодично новые запросы, поэтому в коде мы должны будем использовать асинхронный метод, чтобы сам шаблон выполнялся, а сокет работал в фоновом режиме и не закрывался, пока мы его об этом не попросим.

В общем коде дописываем using:
using System.Threading.Tasks;
В общем коде в классе CommonCode пишем наш код:
Описываем методы для WSS:
public static void Wss(IZennoPosterProjectModel project) //определяем метод Wss
{
Random rnd = new Random(); //инициализация Random
string data = project.Variables["wss_data"].Value; //загружаем тело запроса из переменной
//подключаем прокси, если необходимо
//string ip = project.Variables["proxy_ip"].Value;
//string login = project.Variables["proxy_login"].Value;
//string pass = project.Variables["proxy_pass"].Value;

using (var ws = new WebSocket("wss://gateway.discord.gg/")) //определяем ссылку запроса
{
//ws.SetProxy (ip, login, pass); //устанавливаем прокси, если необходимо
//ws.SetCookie (new Cookie("__cfduid", project.Variables["cookies_value"].Value)); //устанавливаем куки, если необходимо
ws.Origin = "https://discordapp.com";

ws.OnMessage += (sender, e) => //объявляем, что будем получать сообщение
project.SendInfoToLog(e.Data); //пишем инфу в лог для наглядности
ws.Connect(); //подключаемся по wss
ws.Send (data); //отправляем тело запроса
System.Threading.Thread.Sleep(1000); //небольшая пауза
ws.Send ("{\"op\":4,\"d\":{\"guild_id\":null,\"channel_id\":null,\"self_mute\":true,\"self_deaf\":true,\"self_video\":false}}"); //отправляем тело второго запроса

int q = 0;

while (Convert.ToBoolean(project.Variables["wss_lock"].Value)) //пока переменная = true, цикл будет выполняться
    {
        Thread.Sleep(rnd.Next(40000, 43000));
        q = q + rnd.Next(4, 40);
        ws.Send ("{\"op\":1,\"d\":" + q + "}"); //отправляем тело запроса
     };
}
}

public static async Task WssAsync(IZennoPosterProjectModel project) //определяем асинхронный метод
{
        await Task.Run(() => Wss(project)); //запуск метода Wss
}
Если упрощенно, то сначала вы пишете в методе Wss код, который вы хотите выполнить, а потом в WssAsync указываете, что Wss нужно запустить асинхронно.

Вызвать асинхронный Wss можно с помощью C# кубика.
Подключаемся к Websocket:
CommonCode.WssAsync(project); //запускаем Wss асинхронно
После того как мы присвоим переменной wss_lock значение false через кубик "Обработка переменных", код успешно завершится и websocket закроется. А в Discord ваш аккаунт уйдёт в оффлайн. :bf:
Также завершить поток можно другими интересными и, возможно, более "правильными" способами, но я не сильно углублялся в эту тему.

Запускаем шаблон и проверяем лог в ProjectMaker.
46069


Вот и всё, наш Websocket готов!:bp:

Видео


Summary
В конечном итоге всё оказалось не так уж и сложно, но пришлось разбираться и потратить какое-то время. После чего я успешно возобновил трафик, а позже реализовал рассыльщик по чату в Reddit, там также используется wss. Вообще Websocket часто используют в авторизациях и мессенджерах, поэтому, думаю, эти знания вам пригодятся. ;-)

P.S. Асинхронный WSS гарантированно работает в версии 5.28. Если нужно заменить какие-то заголовки, то можно подредактировать некоторые файлы с Github (например User-Agent) и скомпилировать в VS измененный websocket-sharp.dll.
 
Тема статьи
Другое
Номер конкурса статей
Двенадцатый конкурс статей

Attachments

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Last edited by a moderator:

DenisK

Client
Joined
Jun 28, 2016
Messages
591
Reaction score
288
Points
63

Manfred

Client
Joined
Aug 6, 2019
Messages
37
Reaction score
17
Points
8
За вебсокеты спасибо, большущее!
 
  • Thank you
Reactions: WLDN

Sanekk

Client
Joined
Jun 24, 2016
Messages
988
Reaction score
388
Points
63
поэтому, думаю, эти знания вам пригодятся. ;-)
еще как пригодятся))) , за такие статьи люблю конкурсы 8-)
 
  • Thank you
Reactions: WLDN

prmaaq

Client
Joined
May 8, 2014
Messages
22
Reaction score
5
Points
3
Интересно, но пока не фига не понятно. :-)
 
  • Thank you
Reactions: Amigo and WLDN

WLDN

Client
Joined
Jul 9, 2015
Messages
357
Reaction score
564
Points
93
Интересно, но пока не фига не понятно. :-)
Постараюсь на днях записать видео для наглядности. :bf:
 

prmaaq

Client
Joined
May 8, 2014
Messages
22
Reaction score
5
Points
3
Я новичок, поэтому меня собственно говоря интересовала сама причина возникновения этой ситуации, для чего авторы ресурсов используют этот метод и как его диагностировать, определить, что он используется. На мой взгляд именно этой информации не хватает в статье для полноты решения.
 
Last edited:
  • Thank you
Reactions: PlayerT7 and WLDN

WLDN

Client
Joined
Jul 9, 2015
Messages
357
Reaction score
564
Points
93
Я новичок, поэтому меня собственно говоря интересовала сама причина возникновения этой ситуации, для чего авторы ресурсов используют этот метод и как его диагностировать определить, что он используется. На мой взгляд именно этой информации не хватает в статье для полноты решения.
Спасибо за полезное замечание, действительно думаю будет полезно добавить эту информацию. :-)
 

Oleg1987

Client
Joined
Aug 11, 2014
Messages
1,166
Reaction score
746
Points
113
Годнота!!!
 
  • Thank you
Reactions: WLDN

Dr.Pipetka

Client
Joined
Dec 12, 2017
Messages
1,252
Reaction score
811
Points
113
Крутяк. +
 
  • Thank you
Reactions: WLDN

AZANIR

Client
Joined
Jun 9, 2014
Messages
405
Reaction score
196
Points
43
Плюс в карму , класс !
 
  • Thank you
Reactions: WLDN

Supergrok

Client
Joined
Mar 5, 2019
Messages
171
Reaction score
156
Points
43
Пока еще не понял как я буду это применять у себя, буду разбираться и учиться. Спасибо, однозначно в копилку.
 
  • Thank you
Reactions: WLDN

Finiti

Новичок
Joined
Aug 27, 2017
Messages
25
Reaction score
19
Points
3
То что надо, плюсую.
 
  • Thank you
Reactions: WLDN

BAZAg

Client
Joined
Nov 8, 2015
Messages
1,767
Reaction score
2,414
Points
113
WSS уже давно должны были бы сделать стандартным функционалом Зеннопостера как кубики GET, POST, DELETE, OPTION, а также как работа с базой и FTP.
Спасибо за статью!
 

Babulia

Client
Joined
Nov 18, 2018
Messages
14
Reaction score
6
Points
3
спасибо!!!!!! теперь с биржами по битку можно работать)))))
 
  • Thank you
Reactions: Finiti and WLDN

Nike59

Client
Joined
Aug 5, 2011
Messages
122
Reaction score
121
Points
43
Отдельное спасибо за нестандартное (по крайней мере, для меня) использование SWIron в качестве сниффера.
 
  • Thank you
Reactions: WLDN

ibred

Client
Joined
Apr 4, 2015
Messages
3,835
Reaction score
3,545
Points
113
Добавлено видео (см. внизу статьи).
 
  • Thank you
Reactions: WLDN

frion-seo

Client
Joined
Feb 27, 2011
Messages
506
Reaction score
451
Points
63
Рили годно! :az:
 
  • Thank you
Reactions: WLDN

one

Client
Joined
Sep 22, 2015
Messages
6,793
Reaction score
1,264
Points
113
Вообще Websocket часто используют в авторизациях и мессенджерах, поэтому, думаю, эти знания вам пригодятся.
Еще как пригодяться! Спасибо за статью!
 
  • Thank you
Reactions: WLDN

64rus1

Client
Joined
Jun 13, 2016
Messages
80
Reaction score
15
Points
8
Спасибо
 
  • Thank you
Reactions: WLDN

Metrix

Client
Joined
Jan 3, 2014
Messages
343
Reaction score
272
Points
63
Полезная техническая статья, очень пригодится для того чтобы решать вопросы автоматизации на сокетах, ведь всё больше и больше ресурсов их используют. :ay:
 
  • Thank you
Reactions: WLDN

Чешир

Client
Joined
Jun 27, 2014
Messages
1,544
Reaction score
904
Points
113
Круто!
 
  • Thank you
Reactions: WLDN

dimanis

Client
Joined
Apr 16, 2016
Messages
195
Reaction score
110
Points
43
А как бы получить данные не в лог а в переменную? project.SendInfoToLog(e.Data); шлет в лог, а в переменную (e.Data) не кладется, ошибку выдает что нет переменной 'e' итд

Цепь событий пройти: отправить дата на аунтенификацию, получить ответ, если гуд то выпарсить данные и отправить другое тело и так далее. Может есть пример такой работы?
 
Last edited:

WLDN

Client
Joined
Jul 9, 2015
Messages
357
Reaction score
564
Points
93
А как бы получить данные не в лог а в переменную? project.SendInfoToLog(e.Data); шлет в лог, а в переменную (e.Data) не кладется, ошибку выдает что нет переменной 'e' итд

Цепь событий пройти: отправить дата на аунтенификацию, получить ответ, если гуд то выпарсить данные и отправить другое тело и так далее. Может есть пример такой работы?
Пришли сюда код, посмотрим.
Вообще если e.Data это тип string, то

project.Variables["peremennaya"].Value = e.Data;

должно работать.
 

dimanis

Client
Joined
Apr 16, 2016
Messages
195
Reaction score
110
Points
43

WLDN

Client
Joined
Jul 9, 2015
Messages
357
Reaction score
564
Points
93

dimanis

Client
Joined
Apr 16, 2016
Messages
195
Reaction score
110
Points
43
чудеса конечно, но заработало))
 
  • Thank you
Reactions: WLDN

dimanis

Client
Joined
Apr 16, 2016
Messages
195
Reaction score
110
Points
43
Пока включен сендинфотулог туда куча данных летит, а если переключить на переменную, то в нее попадает что то толи последнее то ли рандомное...

Может есть пример как цепь событий пройти? отправить дата на аунтенификацию, получить ответ, если гуд то выпарсить данные и отправить другое тело и так далее :bc:
 

leha52rus

Client
Joined
Jun 1, 2017
Messages
265
Reaction score
91
Points
28
Не совсем ясен момент с капчей, как её обойти работая с Websocket
 

WLDN

Client
Joined
Jul 9, 2015
Messages
357
Reaction score
564
Points
93
Не совсем ясен момент с капчей, как её обойти работая с Websocket
Не было подобных задач, поэтому не интересовался данным вопросом. А сайт какой?
 

Users Who Are Viewing This Thread (Total: 1, Members: 0, Guests: 1)