Перехват запросов с помощью js в zennoposter

kopc

Client
Регистрация
24.11.2011
Сообщения
146
Благодарностей
56
Баллы
28
115013


Js и зеннопостер в плане перехвата запросов. 2 вопроса. Как и нафига

Предлагаю на суд свою первую конкурсную статью. И так. К делу.

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

GetTraffic - что за зверь

Первым и основным с чем вы будете работать это метод GetTraffic
Cсылка на справку для самых неутомимых https://help.zennolab.com/en/v7/zennoposter/7.1.4/topic621.html
Позволяет дернуть из окошка трафика запрос и обработать его как отдельный элемент.

К примеру, у вас есть форма регистрации. Она ругается на регу и плюется в вас капчей. К счастью, зенка умеет обрабатывать кучу всяких разных капчей, а у рукапчи их еще больше.

Но что делать если по какой-то причине вам нужен токен этого сайта или реги?

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

Рассмотрим код из представленной справки более подробно.

Тут нас интересуют следующие строки

C#:
// дергаем последний запрос из вкладки «трафик»
var traffic = instance.ActiveTab.GetTraffic();
// получаем коллекцию содержащую в себе инфу о теле запроса, шапки и урлы
// В данном случае присваиваем переменной t поштучно значения из переменной трафик
foreach(var t in traffic)
//Туда сюда. Сендим в лог урлу, метод запроса и код ответа. Обращаться к ним можно используя свойства объекта t. Вроде это свойствами называется. 
//------------Короче жмакаете cntl+пробел и выбираете что вам нужно. Я так и не запомнил правильные названия всей этой теоретической движухи шарпа. Ну тут уже ничего не поделаешь. Или шашечки или ехать
project.SendInfoToLog(string.Format("Url: {0}\r\n Method: {1}\r\n Result: {2}", t.Url, t.Method, t.ResultCode));
// дергаем следующий запрос
traffic = instance.ActiveTab.GetTraffic();
Все это нереально круто пока внезапно вы не утыкаетесь в некоторую, не знаю как сказать, забагованность чтоли, этого метода. У него куча свистелок-перделок и ограничений. Например, для работы в теле объекта и раскидки его по переменным люди используют таблицы, как в этой теме
https://zennolab.com/discussion/threads/poluchit-dannye-iz-gettraffic-v-peremennye.46607/

Но у меня моральная травма от экселя, так что я предпочитаю собственные костили. По крайней мере потому, что я сам сломал ногу и сам их для себя выточил.

Собственно, переходим к заявленной в заголовке теме.

Предлагаю на суд сообщества следующий скрипт для работы с, например, джейсоном тела запроса

JavaScript:
(function() {
    var origOpen = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function() {
    this.addEventListener('load', function() {
    const obj = JSON.parse(this.responseText)
    const rates_now = [];
        
if(this.responseURL.includes("Нужная вам фигня"))
    {
        for (var i = 0; i < obj.data.length; i++)
        Обработка джейсона   
    {
}
}
    alert(результат обработки)
});
origOpen.apply(this, arguments);
};
})();

Первый вопрос, который у вас возникает? Чо это за фигня? А вот что.

Мы можем мониторить трафик напрямую из вкладки Трафик. В чем профит то? Не нужны токены, не нужно изобретать велосипед при работе с getTraffic. Особенно актуально для сайтов с автообновляемым контентом, разрабы которых почему-то решили не использовать websokket.
Второй профит намного более глобальный.

Эта херня фактически один поток. Т.е. вы можете запустить скрипт и работать дальше кубиками.

Но внимательный читатель спросит чем я упоролся зачем там алерт? А это 2я пара костылей. Удивительный мир программирования. Да
JavaScript:
alert(результат обработки)
Alert выводит окно с сообщением в браузере, а зенка умеет их читать. Ага. Этой переменной из вкладки окружения можно пользоваться.

{-Page.LastAlertText-}

Получает инфо от работы скрипта. Но только учитывайте, что оно имеет ограничения по количеству символов, так что впихнуть туда «Войну и Мир» не удастся. Так что не забывайте занулять ее. Именно для зануления алерт и вынесен за приделы обработки джейсона. Смотрите. Вам нужен запрос содержащий например слово "rait". Вы пишете слово рейт, но на сайте есть и другие запросы. Так что как только вы получите слово рейт и обработает его следующий увиденный скриптом запрос обновит содержимое переменно {-Page.LastAlertText-}

115014

На скрине представленная общая схема работы с этим скриптом.


Если будут вопрос, пишите в комментарии. Постараюсь ответить


Если доживу до следующего конкурса и мне будет не лень, то расскажу как по тому же принципу работать с сокетами, чтобы обойти систему генера токенов допуска в них.
 
Номер конкурса статей
Двадцатый конкурс статей

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

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

Регистрация
26.05.2020
Сообщения
461
Благодарностей
164
Баллы
43
Очень интересно, но них.йа не понятно. Лайку пульнул, ибо чую, что тема достойная )
 
  • Спасибо
Реакции: Roman*

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 657
Благодарностей
1 323
Баллы
113
Если будут вопрос, пишите в комментарии. Постараюсь ответить
Не хрена не понятно от слова совсем. Как то более подробней нужно с примерами какими то. А то выглядит как тяп ляп и готово. А как же новички? Они же вообще не поймут и пройдут мимо, открыл, увидел, не хрена не понял, закрыл, и дальше пошел.
 

kopc

Client
Регистрация
24.11.2011
Сообщения
146
Благодарностей
56
Баллы
28
Не хрена не понятно от слова совсем. Как то более подробней нужно с примерами какими то. А то выглядит как тяп ляп и готово. А как же новички? Они же вообще не поймут и пройдут мимо, открыл, увидел, не хрена не понял, закрыл, и дальше пошел.
Приветствую. Спасибо за ваше сообщение. Какой пример вы хотели бы увидеть?
Стоит учесть, что тема не совсем для новичков. Я когда начал осваивать зеннопостер, то на запросах шаблоны начал писать месяцев через 7-8 только.

Отпишитесь, что не понятно. Постараюсь вам объяснить
 
  • Спасибо
Реакции: samsonnn

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 657
Благодарностей
1 323
Баллы
113
Приветствую. Спасибо за ваше сообщение. Какой пример вы хотели бы увидеть?
Стоит учесть, что тема не совсем для новичков. Я когда начал осваивать зеннопостер, то на запросах шаблоны начал писать месяцев через 7-8 только.

Отпишитесь, что не понятно. Постараюсь вам объяснить
Вообще нечего не понятно, от слова совсем, вы пару примеров приведите, выложите со скринами, с описанием что да как, может видео снимите еще лучше будет.
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 165
Благодарностей
744
Баллы
113
Все это нереально круто пока внезапно вы не утыкаетесь в некоторую, не знаю как сказать, забагованность чтоли, этого метода. У него куча свистелок-перделок и ограничений. Например, для работы в теле объекта и раскидки его по переменным люди используют таблицы, как в этой теме
https://zennolab.com/discussion/threads/poluchit-dannye-iz-gettraffic-v-peremennye.46607/
В этой самой теме приведены примеры как разобрать ответ и получить нужные данные на кошерном C#. Зачем пилить велосипед на JS - непонятно.
 

oleg21621

Client
Регистрация
20.04.2016
Сообщения
753
Благодарностей
140
Баллы
43
нЕ ПОНЯЛ ТЕМУ
 
Последнее редактирование:

kopc

Client
Регистрация
24.11.2011
Сообщения
146
Благодарностей
56
Баллы
28
В этой самой теме приведены примеры как разобрать ответ и получить нужные данные на кошерном C#. Зачем пилить велосипед на JS - непонятно.
Ну в основной статье я дал ссылку на эту тему. Почему js может быть выгоден заместо снипета шарпа из тема.

Во-первых, это тот факт, что скрипт висит на, условно говоря, "пасиве". Следовательно, у вас пропадает необходимость использовать
instance.UseTrafficMonitoring.

Во-вторых, вам никто не мешает писать это все дело в список для последующего разбора. К примеру, это может понадобится для парсинга, когда вы собираете информации о торговых сделках. Не все сайты используют для этого сокеты

В-третьих, так как это формально "отдельный поток" вы можете обратиться к нему из любого места шаблона просто прочитав ласт алерт без необходимости использовать траффик монитор и гет траффик.

В-четвертых, вам не нужно работать с таблицей.

В качестве примера можно указать на динамические джейсоны. Предствим условную ситуацию, где вы получаете ответ капчи. В джейсоне может быть несколько вариантов. Процессинг, капча решена, капча не решена. Исходя из этого вам нужно постоянно обращаться к таблице, тащить из нее данные, разбирать их, потом выполнять действия. Ну это если вы новичок, то именно так и будет выглядеть логика.

Конечно, можно в сам снипет вписать десириалайз боди, потом подцепить нетонсофт либу, разобрать джейсон, потом сделать логику его обработки. Ну это если вы за шарп шарите. Во-всех остальных случаях добро пожаловать в миллион кубиков

Основное предназначение скрипта уйти от instance.UseTrafficMonitoring, который необходим, если вы будете парсить не один запрос, а постоянно один и тот же запрос
 

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 657
Благодарностей
1 323
Баллы
113
ТС где рабочий пример?
Шаблон с примером?
Скрины с примером?
Видео где?
 
  • Спасибо
Реакции: Ribas и djaga

slavyn8213

Client
Регистрация
28.10.2018
Сообщения
173
Благодарностей
39
Баллы
28
было б доходчиво-с примерами для новичков-однозначно за тебя проголосовал бы- а так читаю -интересно-но них... не понятно)) не у всех такие знания как у вас
 

ZennoLab Team

Super Moderator
Команда форума
Регистрация
22.01.2019
Сообщения
1 227
Благодарностей
3 373
Баллы
113
было б доходчиво-с примерами для новичков-однозначно за тебя проголосовал бы- а так читаю -интересно-но них... не понятно)) не у всех такие знания как у вас
@kopc подсказывают вам идею для следующего конкурса статей. Адаптируйте текущий материал для новичков.
 

Tony80

Client
Регистрация
21.07.2021
Сообщения
173
Благодарностей
43
Баллы
28
А как же новички? Они же вообще не поймут и пройдут мимо, открыл, увидел, не хрена не понял, закрыл, и дальше пошел.
Проголосую руками и ногами за того автора, кто вместо отдельной авторской темы сделает одно очень важное для Зенно сообщества дело - это составит подробный roadmap -> какими знаниями и в каким областях нужно обладать, чтобы понимать те или иные решения/примеры.

Я вот открыл - интуитивно понял, что к чему относится, но тут же понял, что cамостоятельно я такое использовать не смогу.

p.s. При этом я ещё молчу, что доходчиво и понятно излагать - отдельный навык :-)
 

DiXakMan

Client
Регистрация
17.09.2018
Сообщения
90
Благодарностей
15
Баллы
8
Еще прикол данного подхода, getTraffic работает корректно только для CEF браузера, для Chromium не работает, особенно если запрос "защищен", это когда рядом с запросом шестеренка иконка, тогда тело не получить
 

Roman*

Client
Регистрация
25.09.2013
Сообщения
1 651
Благодарностей
655
Баллы
113
Только я обрадовался, что будет обход клауда новым способон, но так нифига и не понял, увы, про парсинг трафика итак были сниппеты на сишарпе без наворотов. Тем кто все таки ищет как обойти клауд, принцип тот же, браузерно прогружаем клауд, берем куки клауда и уже на запросах пуляем все остальное, например вход в аккаунты или что то другое, прокся при этом должна быть одна и та же в браузере и запросах.
P.S. Но лайк все равно поставил)
 
  • Спасибо
Реакции: Live9up и rol

marushin

Client
Регистрация
12.01.2015
Сообщения
187
Благодарностей
55
Баллы
28
Тоже не втыкаю - то ли обуздали яву и сами генерим токены на отправку, тем самым избавляемся от браузера и катаемся на запросах - это крутяк. Или просто парсим ответ с токеном полученным обычным http - тогда в чём соль?
 

ZennoCat

Client
Регистрация
06.01.2020
Сообщения
35
Благодарностей
8
Баллы
8
Как раз на днях использовал такой подход, чтобы не тратить тысячелетия на разбор гугловского js кода просто сделал гибридный шаблон и в ответ забирал токен далее его подставлял в post/get запросы и получал необходимые ответы)). Только я использовал код c#, нужно будет попробовать ваш метод через js
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
564
Баллы
93
К слову в C# и на "пассиве" можно сделать и таблицу можно не использовать. Метод не "забагован" и работает нормально. Просто немного надо прокачать навыки кодинга. А вот вебсокет он ловить не умеет - это точно.
 

Arkadash

Client
Регистрация
23.02.2019
Сообщения
35
Благодарностей
7
Баллы
8
интересно, но них.йа не понятно
Вероятно автор просто усложнил схему:
1. Включаем браузер
C#:
instance.Launch(ZennoLab.InterfacesLibrary.Enums.Browser.BrowserType.Chrome, true);
2. Берём из куки-контейнера нужные токены
C#:
return Encoding.UTF8.GetString(project.Profile.CookieContainer.Export());
3. Выключаем браузер
C#:
instance.Launch(ZennoLab.InterfacesLibrary.Enums.Browser.BrowserType.WithoutBrowser, true);
4. Работаем на запросах с готовыми куками
 
Регистрация
26.05.2020
Сообщения
461
Благодарностей
164
Баллы
43
4. Работаем на запросах с готовыми куками
Как долго? Все эти 4 строки кода в одном кубике можно юзать? Подставлять перед каждым запросом этот кубик?
Все же нехватает доброго примера в виде шаблона на подобные штуки )
 

Arkadash

Client
Регистрация
23.02.2019
Сообщения
35
Благодарностей
7
Баллы
8

frion-seo

Client
Регистрация
27.02.2011
Сообщения
506
Благодарностей
451
Баллы
63
С алертом это прикольно придумано . Я когда делал подобное поднимал локальный wss сервер и на него передавал через js перехваченные данные
120408
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)