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

AdamSmith

Client
Регистрация
28.05.2018
Сообщения
28
Благодарностей
4
Баллы
3
Такая проблема. Кликаю на кнопку, идёт пост запрос на сервер, там уже получаю ответ засчитали ли мой голос или нет. Не могу это сделать Post так как при post один из данных который передаётся это токен с recaptcha 3, не могу ее заранее сгенироровать так как токен генерируется в момент клика.

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

Вложения

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 535
Баллы
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
Регистрация
28.05.2018
Сообщения
28
Благодарностей
4
Баллы
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
Регистрация
28.05.2018
Сообщения
28
Благодарностей
4
Баллы
3
Я обычно пишу сюда если уже всё испробовал, и вот реально уже очень долго не могу понять почему у меня не получается чтобы этот код заработал
Код:
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 "Ничего не нашли";
Но работает этот код
Код:
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
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 535
Баллы
113
Но с этим кодом мне тяжело работать так как приходится использовать таблицу, а она при скоростях что то начинает глючить. Товарищи, пожалуйста помогите чтобы или первый код заработал или второй сохранял в переменную. Проблема с первым кодом даже если в трафике имеется инфа по той ссылке которую я вставляю, всё равно говорит, что ничего не найдено.
Видимо невнимательно следовали инструкциям, что я оставил в прошлом сообщении.
 

Вложения

AdamSmith

Client
Регистрация
28.05.2018
Сообщения
28
Благодарностей
4
Баллы
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
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 535
Баллы
113
Подставил под урл домен яндекса, и он опять ничего не нашёл.
Потому что должно быть точное совпадение URL, если параметры в адресе каждый раз меняются, то код ничего не найдет.
Нужно менять на регулярку в таком случае, но без конкретного примера - это вилами по воде.
 

bizzon

Client
Регистрация
08.09.2015
Сообщения
1 075
Благодарностей
125
Баллы
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
Регистрация
30.03.2012
Сообщения
8 601
Благодарностей
4 586
Баллы
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 "Ничего не нашли";
 
  • Спасибо
Реакции: Hannes, bizzon и one

dozeido

Client
Регистрация
10.12.2019
Сообщения
3
Благодарностей
4
Баллы
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("фиаско");
 
  • Спасибо
Реакции: bizzon

Porosenok

Client
Регистрация
26.09.2010
Сообщения
1 278
Благодарностей
96
Баллы
48
Всем привет, это нормально что если я 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
Регистрация
12.12.2017
Сообщения
1 198
Благодарностей
782
Баллы
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
Регистрация
13.06.2011
Сообщения
33
Благодарностей
9
Баллы
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);
}
 
  • Спасибо
Реакции: artur23

dozeido

Client
Регистрация
10.12.2019
Сообщения
3
Благодарностей
4
Баллы
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; // при неудаче продолжит перебирать запросы
        }
    }
}
надеюсь, это поможет
 
  • Спасибо
Реакции: iicemaster и RoyalBank

Seobeo

Client
Регистрация
13.06.2011
Сообщения
33
Благодарностей
9
Баллы
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, // тело запроса"
 

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
Добрый день, пользуюсь вашим методом получения трафика
но на выходе пустой массив
Хотя все делаю как у вас в примере!
Посмотреть вложение 74137
Иногда бывает не срабатывает с первого раза. У меня в одном шаблоне 15 попыток лимит на получение запроса.
 

Misha

Client
Регистрация
23.10.2016
Сообщения
237
Благодарностей
70
Баллы
28
Иногда бывает не срабатывает с первого раза. У меня в одном шаблоне 15 попыток лимит на получение запроса.
а есть разница какая версия зеннопстера 5 или 7 ?
 

Norim

Client
Регистрация
17.10.2017
Сообщения
292
Благодарностей
53
Баллы
28
Иногда бывает не срабатывает с первого раза. У меня в одном шаблоне 15 попыток лимит на получение запроса.
при вызове instance.ActiveTab.GetTraffic(); очищается весь монитор трафика
 

devffy

Client
Регистрация
16.03.2019
Сообщения
540
Благодарностей
188
Баллы
43
Не понял прикола, чего он очищается то?( instance.ActiveTab.GetTraffic(); );-);-)
Неудобненько:bh:
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 535
Баллы
113
  • Спасибо
Реакции: devffy

nikatin72

Client
Регистрация
16.12.2016
Сообщения
123
Благодарностей
18
Баллы
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
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 535
Баллы
113
Добрый день этот код срабатывает и я получаю тело запроса. а мне нужно получить URL запроса , подскажите пожалуйста как это сделать ?
Вместо System.Text.Encoding.UTF8.GetString(t.ResponseBody) использовать t.Url
 
  • Спасибо
Реакции: nikatin72

loka23

Client
Регистрация
02.08.2019
Сообщения
127
Благодарностей
10
Баллы
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"
 
Последнее редактирование:
Регистрация
23.03.2015
Сообщения
1 113
Благодарностей
632
Баллы
113
Вместо https://zennolab.com/ru/ указываем полный URL, содержимое которого Вы хотите получить.
А как быть если полный URL имеет постоянно разный вид?
Типа: https://zennolab.com/ru?4848023511
Знаки после запятой могут быть любыми
Я понимаю что нужно использовать регулярное выражение, Но как конкретно не понимаю
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 535
Баллы
113
Я понимаю что нужно использовать регулярное выражение, Но как конкретно не понимаю
Да, решение под использование регулярки есть выше:

Регулярное выражение необходимо положить в переменную url_patern.
В данном примере, что-то вроде:
zennolab\.com/ru\?\d+
 
  • Спасибо
Реакции: KolkaPetkinSyn

serg1208

Client
Регистрация
17.04.2018
Сообщения
331
Благодарностей
15
Баллы
18
Видимо невнимательно следовали инструкциям, что я оставил в прошлом сообщении.
а почему только с первого запроса ответ сохряняется в переменную? у меня их около 20 получается при загрузке одного урл
 

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