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

  • Автор темы Автор темы AdamSmith
  • Дата начала Дата начала

AdamSmith

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

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

Вложения

  • Безымянный.png
    Безымянный.png
    273,3 KB · Просмотры: 990
Вставляете 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, содержимое которого Вы хотите получить.
 
Нашёл, делается это так, через этот код 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: этот способ в тысячу раз лучше. Спасибо!
 
Я обычно пишу сюда если уже всё испробовал, и вот реально уже очень долго не могу понять почему у меня не получается чтобы этот код заработал
Код:
Развернуть Свернуть Копировать
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, я честно перечитывал Ваше сообщение очень много раз, пытался понять что и где я не так делаю. Открыл ваш шаблон, да, всё работает, возвращает он код страницы и я понимаю что это и есть 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 так? Так почему когда я подставляю урл который мне нужен, он не работает.

Мой ответ который я получаю когда делаю "Копировать ответ" в трафике выглядит примерно так же как яндексовский.
 
Подставил под урл домен яндекса, и он опять ничего не нашёл.
Потому что должно быть точное совпадение URL, если параметры в адресе каждый раз меняются, то код ничего не найдет.
Нужно менять на регулярку в таком случае, но без конкретного примера - это вилами по воде.
 
пробовал так:
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.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

можно ещё через 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
Всем привет, это нормально что если я 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));
        
        
    }
}
 
Всем привет, это нормально что если я 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));
        
        
    }
}
После вызова трафик сам очищается.
 
Тоже пытался по примерам выше, но что - то не выходит, этот код работает, но тоже нужно сохранение в переменную ((
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
Тоже пытался по примерам выше, но что - то не выходит, этот код работает, но тоже нужно сохранение в переменную ((
вы хотите всю таблицу в переменную запихать, или же какой-то отдельный запрос?

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
вы хотите всю таблицу в переменную запихать, или же какой-то отдельный запрос?

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, // тело запроса"
 
Добрый день, пользуюсь вашим методом получения трафика
но на выходе пустой массив
Хотя все делаю как у вас в примере!
Посмотреть вложение 74137
Иногда бывает не срабатывает с первого раза. У меня в одном шаблоне 15 попыток лимит на получение запроса.
 
Иногда бывает не срабатывает с первого раза. У меня в одном шаблоне 15 попыток лимит на получение запроса.
а есть разница какая версия зеннопстера 5 или 7 ?
 
Иногда бывает не срабатывает с первого раза. У меня в одном шаблоне 15 попыток лимит на получение запроса.
при вызове instance.ActiveTab.GetTraffic(); очищается весь монитор трафика
 
Не понял прикола, чего он очищается то?( instance.ActiveTab.GetTraffic(); );-);-)
Неудобненько:bh:
 
  • Спасибо
Реакции: devffy
Вставляете 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 запроса , подскажите пожалуйста как это сделать ?
 
Добрый день этот код срабатывает и я получаю тело запроса. а мне нужно получить URL запроса , подскажите пожалуйста как это сделать ?
Вместо System.Text.Encoding.UTF8.GetString(t.ResponseBody) использовать t.Url
 
  • Спасибо
Реакции: nikatin72
Вставляете 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"
 
Последнее редактирование:
Вместо https://zennolab.com/ru/ указываем полный URL, содержимое которого Вы хотите получить.
А как быть если полный URL имеет постоянно разный вид?
Типа: https://zennolab.com/ru?4848023511
Знаки после запятой могут быть любыми
Я понимаю что нужно использовать регулярное выражение, Но как конкретно не понимаю
 
Я понимаю что нужно использовать регулярное выражение, Но как конкретно не понимаю
Да, решение под использование регулярки есть выше:

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

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