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

  • Автор темы Автор темы AdamSmith
  • Дата начала Дата начала
а почему только с первого запроса ответ сохряняется в переменную? у меня их около 20 получается при загрузке одного урл
потому что.... фиг знает почему.... 100500 причин. например потому что переменная одна и выход по ретурну стоит? это я в хрустальный шар подглядел за чужим кодом :ca:
 
потому что.... фиг знает почему.... 100500 причин. например потому что переменная одна и выход по ретурну стоит? это я в хрустальный шар подглядел за чужим кодом :ca:
для Вас шутка, а для меня темный лес(
 
я к тому, что без примера кода, нельзя определить ПОЧЕМУ !
80350


вверху его взял
 
а почему только с первого запроса ответ сохряняется в переменную? у меня их около 20 получается при загрузке одного урл
В коде стоит возврат значения (return) при первом успешном нахождении.
 
  • Спасибо
Реакции: serg1208
В коде стоит возврат значения (return) при первом успешном нахождении.
подскажите, как сделать чтобы они сумировалиссь в одну переменную ? все ответы из запросов. Спасибо
 
80351


ну убрать return System.Text.Encoding.UTF8.GetString(t.ResponseBody);
в самом начале завести локалку var temp = "";
вместо ретурна temp = temp + System.Text.Encoding.UTF8.GetString(t.ResponseBody);
вместо return "Ничего не нашли"; поставить return temp ;
 
  • Спасибо
Реакции: serg1208
Посмотреть вложение 80351

ну убрать return System.Text.Encoding.UTF8.GetString(t.ResponseBody);
в самом начале завести локалку var temp = "";
вместо ретурна temp = temp + System.Text.Encoding.UTF8.GetString(t.ResponseBody);
вместо return "Ничего не нашли"; поставить return temp ;
1626958212256.png

Сделал, но отдает то же кол-во строк (с первого запроса)
 
надо --> temp = temp + System.Text.Encoding.UTF8.GetString(t.ResponseBody);

а не --> return temp = temp + System.Text.Encoding.UTF8.GetString(t.ResponseBody);
 
  • Спасибо
Реакции: serg1208
Видимо невнимательно следовали инструкциям, что я оставил в прошлом сообщении.
Здравствуйте. Сейчас разбираюсь с тем, чтобы получить headers страницы. Но есть проблемы - не на всех сайтах могу получить полный список URL. Взял ваш пример из вложения, выполнил - все ок.
Заменяю на другой домен, который не все URL отдает, например на http://vrn.best-city.ru/ или http://interesnoe.info/ - ничего не получаю, даже если потом запускаю с URL https://zennolab.com/ru/ и выполняю с ним - пустой ответ пока не перезапущу весь проект сначала.

Такое впечатление, что зенопостер ловит глюк в ответе от этих сайтов.
 
Здравствуйте. Сейчас разбираюсь с тем, чтобы получить headers страницы. Но есть проблемы - не на всех сайтах могу получить полный список URL. Взял ваш пример из вложения, выполнил - все ок.
Заменяю на другой домен, который не все URL отдает, например на http://vrn.best-city.ru/ или http://interesnoe.info/ - ничего не получаю, даже если потом запускаю с URL https://zennolab.com/ru/ и выполняю с ним - пустой ответ пока не перезапущу весь проект сначала.

Такое впечатление, что зенопостер ловит глюк в ответе от этих сайтов.
Да, есть такая проблема. Перенесли Вашу тему в багтрекер.
 
Вставляете 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, содержимое которого Вы хотите получить.
Добрый день,интересно как можно взять POST запрос вместо GET

Благодарю
 
Всем привет!
В PM все четко работает, а в ZP выдает ошибку:

Выполнение действия CSharp OwnCode: RequestBody. Массив не может быть неопределенным.
Имя параметра: bytes


В чем может быть дело?
 
Вставляете 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, содержимое которого Вы хотите получить.
Как можно сразу получить в переменную ResponseBody + RequestBody ?
Пробую вот так:
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) + t.RequestBody;
    }
}

return "Ничего не нашли";
В PM все работает, в ZP не хочет
 
Последнее редактирование:
  • Спасибо
Реакции: Roman1992
Добрый день. Задача получить POST запрос. URL не меняется. Необходимо в переменную получить значения из "Параметры". А так же из "Заголовки". Подскажите пожалуйста какой код получится в таком случае.
 

Вложения

  • 1.png
    1.png
    12 KB · Просмотры: 188
Добрый день. Задача получить POST запрос. URL не меняется. Необходимо в переменную получить значения из "Параметры". А так же из "Заголовки". Подскажите пожалуйста какой код получится в таком случае.
Что-то типа такого
C#:
Развернуть Свернуть Копировать
var traffic = instance.ActiveTab.GetTraffic();
foreach (var t in traffic)
{
    if (t.Url == "https://zennolab.com/ru/") //Как будем искать нужный запрос
    {
        var body = t.RequestBody; //Параметры
        var headers = t.RequestHeaders; //Заголовки
    }
}
 
Я пробовал другие варианты с форума и они не работали для получения ответа POST запроса.
Составил такой код который выполнял эту задачу...

C#:
Развернуть Свернуть Копировать
var traffic = instance.ActiveTab.GetTraffic();
string desiredUrl = "https://zennolab.com/";
string postData = string.Empty;
string requestHeaders = string.Empty;
string postResponse = string.Empty;

foreach (var t in traffic)
{
    if (t.Url == desiredUrl && t.Method == "POST")
    {
        postResponse = Encoding.UTF8.GetString(t.ResponseBody); // Преобразование массива байтов в строку
        postData = t.RequestBody; // Параметры
        requestHeaders = t.RequestHeaders; // Заголовки
        break;
    }
}

// Сохраняю содержимое ответа в переменную Zennoposter
project.Variables["ResponseCode"].Value = postResponse;

Предварительно нужно создать еще один кубик на C# который запустил мониторинг трафика. Добавляем до того как начнутся открываться нужные страницы в браузере
C#:
Развернуть Свернуть Копировать
instance.UseTrafficMonitoring = true;
 
  • Спасибо
Реакции: j2082192
Немного апну темку ))) В целом все работает исходя из предложенного @ibred варианта тут.
Но у меня есть проблема. В мониторе два запроса, приходящие с одного урла. Запросы POST, поэтому найти нужный можно только отфильтровав по определенному тексту, который есть в теле самого запроса.
В итоге, как из этих двух автоматом выбрать тот, который либо содержит определенный текст, либо, наоборот, не содержит?
Или только через получение обоих ответов (тогда как получить все, если этот код записывает только первый попавшийся вариант), и дальнейшей обработкой уже полученных данных?
 
Немного апну темку ))) В целом все работает исходя из предложенного @ibred варианта тут.
Но у меня есть проблема. В мониторе два запроса, приходящие с одного урла. Запросы POST, поэтому найти нужный можно только отфильтровав по определенному тексту, который есть в теле самого запроса.
В итоге, как из этих двух автоматом выбрать тот, который либо содержит определенный текст, либо, наоборот, не содержит?
Или только через получение обоих ответов (тогда как получить все, если этот код записывает только первый попавшийся вариант), и дальнейшей обработкой уже полученных данных?
C#:
Развернуть Свернуть Копировать
var traffic = instance.ActiveTab.GetTraffic();
foreach (var t in traffic)
{
    if (t.Url == "https://zennolab.com/ru/") //Ищем запрос по урл
    {
        if (t.ResponseBody == "нужное нам условие") //Ищем нужный запрос по телу ответа
        {
            return t.    //Возвращаем что нам надо
        }
    }
}
 
  • Спасибо
Реакции: Moonwalker
C#:
Развернуть Свернуть Копировать
var traffic = instance.ActiveTab.GetTraffic();
foreach (var t in traffic)
{
    if (t.Url == "https://zennolab.com/ru/") //Ищем запрос по урл
    {
        if (t.ResponseBody == "нужное нам условие") //Ищем нужный запрос по телу ответа
        {
            return t.    //Возвращаем что нам надо
        }
    }
}
За направление спасибо, буду копать. Не совсем подходящий вариант. Как минимум, надо искать не по телу ответа, а по телу запроса. Но там поменять просто на RequestBody. Ну и надо будет, скорее, conatains, потому как тело постоянно разное, есть просто один тригер, который делает ответ ненужным ))) Плюс в моем случае еще как раз и надо не содержит, а "не содержит".
В общем, получить ответ на запросе, в теле запроса которого нет волшебного слова )) Вечером дома покручу. За логику спасибо, дальше уже регулярки, все найдем ))
 
За направление спасибо, буду копать. Не совсем подходящий вариант. Как минимум, надо искать не по телу ответа, а по телу запроса. Но там поменять просто на RequestBody. Ну и надо будет, скорее, conatains, потому как тело постоянно разное, есть просто один тригер, который делает ответ ненужным ))) Плюс в моем случае еще как раз и надо не содержит, а "не содержит".
В общем, получить ответ на запросе, в теле запроса которого нет волшебного слова )) Вечером дома покручу. За логику спасибо, дальше уже регулярки, все найдем ))
Можно даже в 1 иф запихать

C#:
Развернуть Свернуть Копировать
var traffic = instance.ActiveTab.GetTraffic();
foreach (var t in traffic)
{
    if (t.Url == "https://zennolab.com/ru/" && t."еще условие") //Условия для получения запроса
    {
        return t.    //Возвращаем что нам надо
    }
}

Или через linq еще проще сделать :df:
C#:
Развернуть Свернуть Копировать
var traffic = instance.ActiveTab.GetTraffic();

var result = traffic
    .Where(x => x.Url == "урл запроса")
    .Where(x => !x.RequestBody.Contains("Не содержит"))
    .First();
 
Последнее редактирование:
Можно даже в 1 иф запихать

C#:
Развернуть Свернуть Копировать
var traffic = instance.ActiveTab.GetTraffic();
foreach (var t in traffic)
{
    if (t.Url == "https://zennolab.com/ru/" && t."еще условие") //Условия для получения запроса
    {
        return t.    //Возвращаем что нам надо
    }
}

Или через linq еще проще сделать :df:
C#:
Развернуть Свернуть Копировать
var traffic = instance.ActiveTab.GetTraffic();

var result = traffic
    .Where(x => x.Url == "урл запроса")
    .Where(x => !x.RequestBody.Contains("Не содержит"))
    .First();
Да, уже сам разобрался )))
В итоге вот такой код получился (пусть останется тут, вдруг кому еще пригодится):

C#:
Развернуть Свернуть Копировать
var traffic = instance.ActiveTab.GetTraffic();
foreach (var t in traffic)
{
    if (t.Url == "https://ссылка") //Ищем запрос по урл
    {
        if (!t.RequestBody.Contains("ненужный текст")) //Ищем нужный запрос по телу ответа
        {
            return System.Text.Encoding.UTF8.GetString(t.ResponseBody);  //Возвращаем что нам надо
        }
    }
}
 
  • Спасибо
Реакции: Hannes
Вставляете 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, содержимое которого Вы хотите получить.

А можешь подсказать как быть если значение кончной ссылки в каждом запросе всегда денамическое? спасибо
 
А можешь подсказать как быть если значение кончной ссылки в каждом запросе всегда денамическое? спасибо
Возможно так:
C#:
Развернуть Свернуть Копировать
var traffic = instance.ActiveTab.GetTraffic();
foreach(var t in traffic) {
    if (t.Url.Contains("https://zennolab.com/ru/")) {
        return System.Text.Encoding.UTF8.GetString(t.ResponseBody);
    }
}
return "Ничего не нашли";
 

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