Ответ из трафика в переменную

AdamSmith

Client
Joined
May 28, 2018
Messages
28
Reaction score
4
Points
3
Такая проблема. Кликаю на кнопку, идёт пост запрос на сервер, там уже получаю ответ засчитали ли мой голос или нет. Не могу это сделать Post так как при post один из данных который передаётся это токен с recaptcha 3, не могу ее заранее сгенироровать так как токен генерируется в момент клика.

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

Attachments

ibred

Client
Joined
Apr 4, 2015
Messages
3,835
Reaction score
3,564
Points
113
Вставляете C# экшен с кодом в место, откуда требуется начать запись запросов, например в самое начало:
C#:
instance.UseTrafficMonitoring = true;
Совершаете переходы по нужным страницам, а далее запускаете сбор данных из трафика:
C#:
var traffic = instance.ActiveTab.GetTraffic();
foreach(var t in traffic) {
    if (t.Url=="https://zennolab.com/ru/") {
        return System.Text.Encoding.UTF8.GetString(t.ResponseBody);
    }
}
return "Ничего не нашли";
Вместо https://zennolab.com/ru/ указываем полный URL, содержимое которого Вы хотите получить.
 

AdamSmith

Client
Joined
May 28, 2018
Messages
28
Reaction score
4
Points
3
Нашёл, делается это так, через этот код return string.Join("\r\n", instance.MainTab.GetTraffic()); а потом регуляркой

Вставляете C# экшен с кодом в место, откуда требуется начать запись запросов, например в самое начало:
C#:
instance.UseTrafficMonitoring = true;
Совершаете переходы по нужным страницам, а далее запускаете сбор данных из трафика:
C#:
var traffic = instance.ActiveTab.GetTraffic();
foreach(var t in traffic) {
    if (t.Url=="https://zennolab.com/ru/") {
        return System.Text.Encoding.UTF8.GetString(t.ResponseBody);
    }
}
return "Ничего не нашли";
Вместо https://zennolab.com/ru/ указываем полный URL, содержимое которого Вы хотите получить.
Update: этот способ в тысячу раз лучше. Спасибо!
 

AdamSmith

Client
Joined
May 28, 2018
Messages
28
Reaction score
4
Points
3
Я обычно пишу сюда если уже всё испробовал, и вот реально уже очень долго не могу понять почему у меня не получается чтобы этот код заработал
Code:
var traffic = instance.ActiveTab.GetTraffic();
foreach(var t in traffic) {
    if (t.Url=="https://zennolab.com/ru/") {
        return System.Text.Encoding.UTF8.GetString(t.ResponseBody);
    }
}
return "Ничего не нашли";
Но работает этот код
Code:
var traffic = instance.ActiveTab.GetTraffic();
var tt = project.Tables["trafficTable"];

tt.AddRow(new List<string>()
{
   "Url",
   "ResponseBody"
});

foreach(TrafficItem t in traffic)
{
   var row = new List<string>()
   {
     t.Url,
     t.ResponseBody == null ? "" : Encoding.UTF8.GetString(t.ResponseBody, 0, t.ResponseBody.Length)
   };

   tt.AddRow(row);
}
Но с этим кодом мне тяжело работать так как приходится использовать таблицу, а она при скоростях что то начинает глючить. Товарищи, пожалуйста помогите чтобы или первый код заработал или второй сохранял в переменную. Проблема с первым кодом даже если в трафике имеется инфа по той ссылке которую я вставляю, всё равно говорит, что ничего не найдено.
 

ibred

Client
Joined
Apr 4, 2015
Messages
3,835
Reaction score
3,564
Points
113
Но с этим кодом мне тяжело работать так как приходится использовать таблицу, а она при скоростях что то начинает глючить. Товарищи, пожалуйста помогите чтобы или первый код заработал или второй сохранял в переменную. Проблема с первым кодом даже если в трафике имеется инфа по той ссылке которую я вставляю, всё равно говорит, что ничего не найдено.
Видимо невнимательно следовали инструкциям, что я оставил в прошлом сообщении.
 

Attachments

AdamSmith

Client
Joined
May 28, 2018
Messages
28
Reaction score
4
Points
3
Видимо невнимательно следовали инструкциям, что я оставил в прошлом сообщении.
ibred, я честно перечитывал Ваше сообщение очень много раз, пытался понять что и где я не так делаю. Открыл ваш шаблон, да, всё работает, возвращает он код страницы и я понимаю что это и есть t.ResponseBody.

Но вот я решил тогда зайти в трафик и посмотреть с какими страница zenno обменивается, увидел что есть mc.yandex.ru и ответ его выглядит примерно так {"settings":{"pcs":"0","webvisor":{"arch_type":"none","date":"2018-12-07 15:25:16","forms":1,"recp":"1.00000","urls":"regexp:.*"},"eu":0},"userData":{}} . Подставил под урл домен яндекса, и он опять ничего не нашёл. Ответ от POST в json ведь тоже считается как t.ResponseBody так? Так почему когда я подставляю урл который мне нужен, он не работает.

Мой ответ который я получаю когда делаю "Копировать ответ" в трафике выглядит примерно так же как яндексовский.
 

ibred

Client
Joined
Apr 4, 2015
Messages
3,835
Reaction score
3,564
Points
113
Подставил под урл домен яндекса, и он опять ничего не нашёл.
Потому что должно быть точное совпадение URL, если параметры в адресе каждый раз меняются, то код ничего не найдет.
Нужно менять на регулярку в таком случае, но без конкретного примера - это вилами по воде.
 

bizzon

Client
Joined
Sep 8, 2015
Messages
1,120
Reaction score
135
Points
63
Нужно менять на регулярку в таком случае
Пожалуйста, покажите как можно сюда завести регулярку?
 

bizzon

Client
Joined
Sep 8, 2015
Messages
1,120
Reaction score
135
Points
63
пробовал так:
C#:
string url = project.Variables["url_patern"].Value;
var traffic = instance.ActiveTab.GetTraffic();

foreach(var t in traffic) {
    if (System.Text.RegularExpressions.Regex.Match(t.Url, url_patern).Value) {
        return System.Text.Encoding.UTF8.GetString(t.ResponseBody);
    }
}
return "Ничего не нашли";
Не работает:
Компиляция кода Ошибка в действии "CS0029" "Cannot implicitly convert type 'string' to 'bool'". [Строка: 4; Cтолбец: 9]
 

doc

Client
Joined
Mar 30, 2012
Messages
8,685
Reaction score
4,652
Points
113
пробовал так:
C#:
string url = project.Variables["url_patern"].Value;
var traffic = instance.ActiveTab.GetTraffic();

foreach(var t in traffic) {
    if (System.Text.RegularExpressions.Regex.Match(t.Url, url_patern).Value) {
        return System.Text.Encoding.UTF8.GetString(t.ResponseBody);
    }
}
return "Ничего не нашли";
Не работает:
Компиляция кода Ошибка в действии "CS0029" "Cannot implicitly convert type 'string' to 'bool'". [Строка: 4; Cтолбец: 9]
C#:
string url = project.Variables["url_patern"].Value;
var traffic = instance.ActiveTab.GetTraffic();

foreach(var t in traffic) {
    if (System.Text.RegularExpressions.Regex.IsMatch(t.Url, url_patern)) {
        return System.Text.Encoding.UTF8.GetString(t.ResponseBody);
    }
}
return "Ничего не нашли";
 

dozeido

Client
Joined
Dec 10, 2019
Messages
3
Reaction score
4
Points
3
пробовал
можно ещё через Contains, берёт первое совпадение, с выходом по красной, если ничего не найдёт

C#:
string url_pattern = "mc.yandex.ru/watch/"; // string url_pattern = project.Variables["url_pattern"].Value;
var traffic = instance.ActiveTab.GetTraffic();
foreach(TrafficItem t in traffic)
{
    if (t.Url.Contains(url_pattern)&&t.Method=="POST") // в урл есть "mc.yandex.ru/watch/" и это POST-запрос
    {
        project.Variables["var1"].Value = System.Text.Encoding.UTF8.GetString(t.ResponseBody);
        project.SendInfoToLog("успех", false);
        return 0;
    }
}
throw new Exception("фиаско");
 
  • Thank you
Reactions: bizzon

Porosenok

Client
Joined
Sep 26, 2010
Messages
1,289
Reaction score
113
Points
63
Всем привет, это нормально что если я 1 раз выполняю код чтобы получить ответы со сниффера все норм делается, а второй раз уже все, пустота?
Код такой
C#:
var traffic = instance.ActiveTab.GetTraffic();
foreach(var t in traffic) {
    if(t.Url.Contains("cors")){
        
        
project.SendInfoToLog(System.Text.Encoding.UTF8.GetString(t.ResponseBody));
        
        
    }
}
 

Dr.Pipetka

Client
Joined
Dec 12, 2017
Messages
1,469
Reaction score
990
Points
113
Всем привет, это нормально что если я 1 раз выполняю код чтобы получить ответы со сниффера все норм делается, а второй раз уже все, пустота?
Код такой
C#:
var traffic = instance.ActiveTab.GetTraffic();
foreach(var t in traffic) {
    if(t.Url.Contains("cors")){
        
        
project.SendInfoToLog(System.Text.Encoding.UTF8.GetString(t.ResponseBody));
        
        
    }
}
После вызова трафик сам очищается.
 

Seobeo

Client
Joined
Jun 13, 2011
Messages
37
Reaction score
13
Points
8
Тоже пытался по примерам выше, но что - то не выходит, этот код работает, но тоже нужно сохранение в переменную ((
C#:
var traffic = instance.ActiveTab.GetTraffic();
var tt = project.Tables["trafficTable"]; // Как таблицу заменить на переменную в этом коде?

tt.AddRow(new List<string>()
{
    "Method",
    "ResultCode",
    "Url",
    "ContentType",
    "RequestHeaders",
    "RequestCookies",
    "RequestBody",
    "ResponseHeaders",
    "ResponseCookies",
    "ResponseBody"
});

foreach(TrafficItem t in traffic)
{
    var row = new List<string>()
    {
        t.Method,
        t.ResultCode.ToString(),
        t.Url,
        t.ResponseContentType,
        t.RequestHeaders,
        t.RequestCookies,
        t.RequestBody,
        t.ResponseHeaders,
        t.ResponseCookies,
        t.ResponseBody == null ? "" : Encoding.UTF8.GetString(t.ResponseBody, 0, t.ResponseBody.Length)
    };
    
    tt.AddRow(row);
}
 
  • Thank you
Reactions: artur23

dozeido

Client
Joined
Dec 10, 2019
Messages
3
Reaction score
4
Points
3
Тоже пытался по примерам выше, но что - то не выходит, этот код работает, но тоже нужно сохранение в переменную ((
вы хотите всю таблицу в переменную запихать, или же какой-то отдельный запрос?

C#:
var traffic = instance.ActiveTab.GetTraffic();
var tt = project.Tables["trafficTable"]; // эта строка инициализирует таблицу проекта, для работы с переменными она не нужна

tt.AddRow(new List<string>()
{
    "Method",
    "ResultCode",
    "Url",
    "ContentType",
    "RequestHeaders",
    "RequestCookies",
    "RequestBody",
    "ResponseHeaders",
    "ResponseCookies",
    "ResponseBody"
}); // добавляет в указанную таблицу строку с заголовками

foreach(TrafficItem t in traffic) // это цикл, который обрабатывает все полученные запросы
{
    var row = new List<string>() // формируется строка для добавления в таблицу
    {
        t.Method, // метод запроса (get, post etc.)
        t.ResultCode.ToString(), // код запроса (200, 404 etc.)
        t.Url, // думаю, это не нужно объяснять
        t.ResponseContentType, // тип контента ответа
        t.RequestHeaders, // заголовки запроса
        t.RequestCookies, // куки запроса
        t.RequestBody, // тело запроса
        t.ResponseHeaders, // заголовки ответа
        t.ResponseCookies, // куки ответа
        t.ResponseBody == null ? "" : Encoding.UTF8.GetString(t.ResponseBody, 0, t.ResponseBody.Length) // тело ответа, тип указывается в ResponseContentType
    };
    
    tt.AddRow(row); // добавляет вышесобранную строку в таблицу
}
если задача - получить данные из запроса, можно использовать такой способ:
C#:
var traffic = instance.ActiveTab.GetTraffic(); 
foreach(TrafficItem t in traffic) // производим операции в цикле
{
    if (t.Url.Contains("api/v3/users/") && t.Url.Contains("/fingerprint") && t.Method=="POST") // здесь уточняем запросы, которые нам нужны
    {
        project.Variables["Cookies"].Value = t.RequestCookies; // при нахождении подходящего запроса берём куки в переменную проекта
        project.Json.FromString(t.RequestBody); // десериализуем json тело запроса в словарь проекта
        try
        {
            project.Variables["csrfToken"].Value = project.Json.csrfToken;  // пробуем получить нужные данные
            project.Variables["apiKey"].Value = project.Json.apiKey;
            return "success"; // в случае успеха вернёт 'success'
        }
        catch
        {
            continue; // при неудаче продолжит перебирать запросы
        }
    }
}
надеюсь, это поможет
 

Seobeo

Client
Joined
Jun 13, 2011
Messages
37
Reaction score
13
Points
8
вы хотите всю таблицу в переменную запихать, или же какой-то отдельный запрос?

C#:
var traffic = instance.ActiveTab.GetTraffic();
var tt = project.Tables["trafficTable"]; // эта строка инициализирует таблицу проекта, для работы с переменными она не нужна

tt.AddRow(new List<string>()
{
    "Method",
    "ResultCode",
    "Url",
    "ContentType",
    "RequestHeaders",
    "RequestCookies",
    "RequestBody",
    "ResponseHeaders",
    "ResponseCookies",
    "ResponseBody"
}); // добавляет в указанную таблицу строку с заголовками

foreach(TrafficItem t in traffic) // это цикл, который обрабатывает все полученные запросы
{
    var row = new List<string>() // формируется строка для добавления в таблицу
    {
        t.Method, // метод запроса (get, post etc.)
        t.ResultCode.ToString(), // код запроса (200, 404 etc.)
        t.Url, // думаю, это не нужно объяснять
        t.ResponseContentType, // тип контента ответа
        t.RequestHeaders, // заголовки запроса
        t.RequestCookies, // куки запроса
        t.RequestBody, // тело запроса
        t.ResponseHeaders, // заголовки ответа
        t.ResponseCookies, // куки ответа
        t.ResponseBody == null ? "" : Encoding.UTF8.GetString(t.ResponseBody, 0, t.ResponseBody.Length) // тело ответа, тип указывается в ResponseContentType
    };
   
    tt.AddRow(row); // добавляет вышесобранную строку в таблицу
}
если задача - получить данные из запроса, можно использовать такой способ:
C#:
var traffic = instance.ActiveTab.GetTraffic();
foreach(TrafficItem t in traffic) // производим операции в цикле
{
    if (t.Url.Contains("api/v3/users/") && t.Url.Contains("/fingerprint") && t.Method=="POST") // здесь уточняем запросы, которые нам нужны
    {
        project.Variables["Cookies"].Value = t.RequestCookies; // при нахождении подходящего запроса берём куки в переменную проекта
        project.Json.FromString(t.RequestBody); // десериализуем json тело запроса в словарь проекта
        try
        {
            project.Variables["csrfToken"].Value = project.Json.csrfToken;  // пробуем получить нужные данные
            project.Variables["apiKey"].Value = project.Json.apiKey;
            return "success"; // в случае успеха вернёт 'success'
        }
        catch
        {
            continue; // при неудаче продолжит перебирать запросы
        }
    }
}
надеюсь, это поможет
В целом спасибо, но что-то не выходит - пустые переменные (( . Нужны по факту данные только из
"t.RequestBody, // тело запроса"
 

Misha

Client
Joined
Oct 23, 2016
Messages
302
Reaction score
79
Points
28
Добрый день, пользуюсь вашим методом получения трафика
но на выходе пустой массив
Хотя все делаю как у вас в примере!
74137
 

molotok

Client
Joined
Apr 17, 2015
Messages
755
Reaction score
409
Points
63
Добрый день, пользуюсь вашим методом получения трафика
но на выходе пустой массив
Хотя все делаю как у вас в примере!
View attachment 74137
Иногда бывает не срабатывает с первого раза. У меня в одном шаблоне 15 попыток лимит на получение запроса.
 

Misha

Client
Joined
Oct 23, 2016
Messages
302
Reaction score
79
Points
28
Иногда бывает не срабатывает с первого раза. У меня в одном шаблоне 15 попыток лимит на получение запроса.
а есть разница какая версия зеннопстера 5 или 7 ?
 

molotok

Client
Joined
Apr 17, 2015
Messages
755
Reaction score
409
Points
63
а есть разница какая версия зеннопстера 5 или 7 ?
Я только 7 пользуюсь
 

Norim

Client
Joined
Oct 17, 2017
Messages
329
Reaction score
85
Points
28
Иногда бывает не срабатывает с первого раза. У меня в одном шаблоне 15 попыток лимит на получение запроса.
при вызове instance.ActiveTab.GetTraffic(); очищается весь монитор трафика
 

devffy

Client
Joined
Mar 16, 2019
Messages
544
Reaction score
189
Points
43
Не понял прикола, чего он очищается то?( instance.ActiveTab.GetTraffic(); );-);-)
Неудобненько:bh:
 

ibred

Client
Joined
Apr 4, 2015
Messages
3,835
Reaction score
3,564
Points
113
  • Thank you
Reactions: devffy

nikatin72

Client
Joined
Dec 16, 2016
Messages
123
Reaction score
18
Points
18
Вставляете C# экшен с кодом в место, откуда требуется начать запись запросов, например в самое начало:
C#:
instance.UseTrafficMonitoring = true;
Совершаете переходы по нужным страницам, а далее запускаете сбор данных из трафика:
C#:
var traffic = instance.ActiveTab.GetTraffic();
foreach(var t in traffic) {
    if (t.Url=="https://zennolab.com/ru/") {
        return System.Text.Encoding.UTF8.GetString(t.ResponseBody);
    }
}
return "Ничего не нашли";
Вместо https://zennolab.com/ru/ указываем полный URL, содержимое которого Вы хотите получить.
Добрый день этот код срабатывает и я получаю тело запроса. а мне нужно получить URL запроса , подскажите пожалуйста как это сделать ?
 

ibred

Client
Joined
Apr 4, 2015
Messages
3,835
Reaction score
3,564
Points
113
Добрый день этот код срабатывает и я получаю тело запроса. а мне нужно получить URL запроса , подскажите пожалуйста как это сделать ?
Вместо System.Text.Encoding.UTF8.GetString(t.ResponseBody) использовать t.Url
 
  • Thank you
Reactions: nikatin72

loka23

Client
Joined
Aug 2, 2019
Messages
135
Reaction score
10
Points
18
Вставляете C# экшен с кодом в место, откуда требуется начать запись запросов, например в самое начало:
C#:
instance.UseTrafficMonitoring = true;
Совершаете переходы по нужным страницам, а далее запускаете сбор данных из трафика:
C#:
var traffic = instance.ActiveTab.GetTraffic();
foreach(var t in traffic) {
    if (t.Url=="https://zennolab.com/ru/") {
        return System.Text.Encoding.UTF8.GetString(t.ResponseBody);
    }
}
return "Ничего не нашли";
Вместо https://zennolab.com/ru/ указываем полный URL, содержимое которого Вы хотите получить.
Выполнение действия CSharp OwnCode: stranica. Массив не может быть неопределенным.
Имя параметра: bytes

Не подскажешь что это такое? В projectmaker всё нормально, а вот в зенно ошибка такая проходит. В версии 5 такого не было, насколько помню. а на 7 ловлю...

Дополню:
В трафике выводятся 2 запроса по одному url. Один GET, второй OPTIONS. Возможно из за того что он берёт ответ из запроса типа OPTIONS? А он как раз пустой... Если это так, как бы приписать определенный тип

Решение:
Моё предположение оказалось верное.
t.Url=="https://google.com" && t.Method=="GET"
 
Last edited:
Joined
Mar 23, 2015
Messages
1,301
Reaction score
848
Points
113
Вместо https://zennolab.com/ru/ указываем полный URL, содержимое которого Вы хотите получить.
А как быть если полный URL имеет постоянно разный вид?
Типа: https://zennolab.com/ru?4848023511
Знаки после запятой могут быть любыми
Я понимаю что нужно использовать регулярное выражение, Но как конкретно не понимаю
 

ibred

Client
Joined
Apr 4, 2015
Messages
3,835
Reaction score
3,564
Points
113
Я понимаю что нужно использовать регулярное выражение, Но как конкретно не понимаю
Да, решение под использование регулярки есть выше:

Регулярное выражение необходимо положить в переменную url_patern.
В данном примере, что-то вроде:
zennolab\.com/ru\?\d+
 
  • Thank you
Reactions: KolkaPetkinSyn
Joined
Mar 23, 2015
Messages
1,301
Reaction score
848
Points
113

serg1208

Client
Joined
Apr 17, 2018
Messages
333
Reaction score
15
Points
18
Видимо невнимательно следовали инструкциям, что я оставил в прошлом сообщении.
а почему только с первого запроса ответ сохряняется в переменную? у меня их около 20 получается при загрузке одного урл
 

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