Получить данные из GetTraffic в переменные

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
418
Благодарностей
156
Баллы
43
Кто нибудь разобрался как в новой версии получить данные из GetTraffic в переменные?
В этом примере выводиться только в лог.
Хотелось бы чтобы данные из каждой вкладки были в разных переменных как на картинке
 

Вложения

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
418
Благодарностей
156
Баллы
43
никто не знает?
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Кто нибудь разобрался как в новой версии получить данные из GetTraffic в переменные?
Так они там и так в переменных, точнее к ним можно доступ получить через соответствующие св-ва класса TrafficItem.

Вызываем метод GetTraffic(), получаем IEnumerable<TrafficItem> с ним и работаем.
Можно для удобства просмотра и для теста запихать в таблицу.

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);
}
TrafficItem.ResponseBody возвращает массив байтов, потом его надо "конвертнуть" в string. Но не всегда, если это картинка или какой то медиа файл, то этого делать не надо, т.е. надо работать с этим массивом байтов. Конвертить или нет, зависит от типа данных TrafficItem.ResponseContentType

 

Вложения

Последнее редактирование:

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
418
Благодарностей
156
Баллы
43
Спасибо! Особенно за TrafficItem.
Теперь стало намного понятнее.

P.S Но вопрос также и остался для меня открытым :-)
Как эти данные вывести в переменные? Вот сюда:
2333.jpg
 
Последнее редактирование:

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
418
Благодарностей
156
Баллы
43

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
P.S Но вопрос также и остался для меня открытым :-)
Как эти данные вывести в переменные? Вот сюда:
После вызова метода GetTraffic, мы получаем список объектов TrafficItem.
Т.е. надо уточнить, а для какого именно запроса(урла) нужны эти данные?

C#:
var traffic = instance.ActiveTab.GetTraffic();

var item = traffic.SingleOrDefault(t => t.Url == "Тут какая то ссылка");

if(item == null) return "";

var textContent = new List<string>(){"html", "javascript", "css"}; // набор слов по которым определяем что контент текстовый

project.Variables["Headers"].Value = item.ResponseHeaders;
project.Variables["Cookies"].Value = item.ResponseCookies;

if(item.ResponseBody == null)
{
   project.Variables["Body"].Value = "";
   return "";
}

if(textContent.Any(item.ResponseContentType.Contains))
{
   project.Variables["Body"].Value = Encoding.UTF8.GetString(item.ResponseBody, 0, item.ResponseBody.Length);
}
else
{
   project.Context["responseBody"] = item.ResponseBody;
}
Проверяем есть ли тело ответа, и что с ним делать. Конвертить в текст или оставлять массив байтов.
Признаки "текстовости" находятся в textContent, туда по необходимости можно еще добавить слова для поиска.

Если контент текстовый, используем обычную переменную. Если byte[], то используем project.Сontext.
Есть в зенке такая классная штука как project.Сontext, позволяющая использовать не только string переменные, но и любые объекты

Так получаем byte[], например картинку, из project.Сontext в любом нужном месте
C#:
var responseBody = (byte[])project.Context["responseBody"];
//что то делаем
 

up_lvl

Client
Регистрация
02.09.2014
Сообщения
131
Благодарностей
53
Баллы
28
Когда залогинен в аккаунт на десктопном facebook код возвращает кол-во элементов = 0. При этом во вкладке Траффик запросы есть. Попробовал для примера m.facebook.com, гугл и парочку других сайтов там всё ок >0. Но мне нужны конкретные параметры именно из десктопного фб. Версия 5.16.2.0 (пробовал на 5.22.1.0 - тоже самое, но вообще работает всё на 5.16.2.0)

Код
Код:
instance.UseTrafficMonitoring = true;
Tab tab = instance.ActiveTab;
// navigate to url
tab.Navigate("https://facebook.com/");
if (tab.IsBusy) tab.WaitDownloading();
System.Threading.Thread.Sleep(10000);
// get list of requests
var traffic = instance.ActiveTab.GetTraffic();
// print count of items, it will be more than 0
project.SendInfoToLog("First count of traffic elements = " + traffic.Count());
Есть какие-то костыли/альтернативы этому?
 

ol1ver

Client
Регистрация
29.08.2013
Сообщения
332
Благодарностей
82
Баллы
28
Знающие, помогите решением. То что сделал - работает, но как то кажется не лаконично.
Работа будет в 50-60 потоков, тупо ходим клацаем по элементам страницы, пишем в таблицу, парсим таблицу сохраняем в список (синхронизация в файл).
Сайтов нужно будет прочекать 200к, опять же кладу в список/дергаю. Не нравится то, что сохраняет(наснифанное) в один файл (напомню что синхронизация списка с файлом). Под середину/конец работы файл с отснифанным может содержать в себе уже пару миллионов строк, последующий поток будет пробовать это "переварить".
Может быть момент что старый поток "затрет" более новые данные? (на структуру/синхронизацию по барабану, главное чтобы все записывало).
Не обязательно работать со списками, имеет ли смысл сразу в файл писать? Имеет ли смысл отдельно создавать файл (под запись)где название - первая буква домена (пример site.com -> s.txt) ?

p.s Как зенно записывает(синхронизирует) cписок с файлом? Поток открывает файл, запирает ... все потоки ждут (один пишет) ?

Всё касаемо оптимизации и целесообразного расхода памяти.

upd. Железо
  • Processor Intel Core i7-8700K
  • Memory 32GB
  • Drives 1 x 250GB NVMe M.2
  • ssd диски
Cпасибо.
 

Вложения

Последнее редактирование:

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Работа будет в 50-60 потоков, тупо ходим клацаем по элементам страницы, пишем в таблицу, парсим таблицу сохраняем в список (синхронизация в файл).
Сайтов нужно будет прочекать 200к, опять же кладу в список/дергаю. Не нравится то, что сохраняет(наснифанное) в один файл (напомню что синхронизация списка с файлом)
Сохраняй в бд. Как вариант, сделай виртуальный диск в оперативке, и туда сохраняй инфу, с последующим пересохранением на винт.

Может быть момент что старый поток "затрет" более новые данные?
Нет. Если ты сам не накосячишь. Если через кубики зенки, то там по идее идет блокировка автоматом, если через код, то там ты уже сам за этим должен следить.

Имеет ли смысл отдельно создавать файл (под запись)где название - первая буква домена (пример site.com -> s.txt) ?
Теоретически да. Можешь даже больше, по первым двум буквам файлов наклепать.)) Все зависит от того что ты потом будешь делать с этим данными. Чем лучше они сразу упорядочены, тем проще потом с ними работать.

Как зенно записывает(синхронизирует) cписок с файлом? Поток открывает файл, запирает ... все потоки ждут (один пишет) ?
Есть файл на винте, есть его копия в памяти. Все изменения пишутся в память, раз в N секунд идет синхронизация с файлом на винте. Если бы каждый раз дергался физический файл, то при многопотоке это было бы пздц.))
Это легко проверить, сделай пустой список, добавь в него что то в зенке, и смотри через сколько времени размер файла с 0 изменится на какой то значение. Обычно где то 2-3 секунды.
 
  • Спасибо
Реакции: VadymS, ol1ver и bizzon

ol1ver

Client
Регистрация
29.08.2013
Сообщения
332
Благодарностей
82
Баллы
28
Если через кубики зенки, то там по идее идет блокировка автоматом, если через код, то там ты уже сам за этим должен следить.
не могли бы вы подсказать пример правильной записи в файл?
я буду брать две первые буквы (а то и три) домена.
решил отказаться от синхронизации списка с файлом.

теоретически разница есть если я буду записывать построчно в файл или string result= ""; цикл {result += data; } -> запись. (строчек будет 100-200)

спасибо.
 

Home_KreKer

Client
Регистрация
05.12.2016
Сообщения
156
Благодарностей
37
Баллы
28
Так они там и так в переменных, точнее к ним можно доступ получить через соответствующие св-ва класса TrafficItem.

Вызываем метод GetTraffic(), получаем IEnumerable<TrafficItem> с ним и работаем.
Можно для удобства просмотра и для теста запихать в таблицу.

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);
}
TrafficItem.ResponseBody возвращает массив байтов, потом его надо "конвертнуть" в string. Но не всегда, если это картинка или какой то медиа файл, то этого делать не надо, т.е. надо работать с этим массивом байтов. Конвертить или нет, зависит от типа данных TrafficItem.ResponseContentType

Почему то НЕ каждый раз собирает данные данный код. Не могу понять почему...
 
  • Спасибо
Реакции: bizzon и phoenixs

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113

Home_KreKer

Client
Регистрация
05.12.2016
Сообщения
156
Благодарностей
37
Баллы
28

Home_KreKer

Client
Регистрация
05.12.2016
Сообщения
156
Благодарностей
37
Баллы
28
Какие данные собираете? Ответы серверов?
все что в этом примере:
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);
}
 

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
все что в этом примере:
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);
}
Сейчас так не собирает ничерта (
 

ZennoCat

Client
Регистрация
06.01.2020
Сообщения
45
Благодарностей
14
Баллы
8

Jugador

Client
Регистрация
20.06.2016
Сообщения
35
Благодарностей
11
Баллы
8
Такая-же проблема.
Из доступных только .Url , .Method и .ResultCode
В остальных пусто.
При попытке обработать
Encoding.UTF8.GetString

Тип Время Сообщение
22:17:18 Компиляция кода Ошибка в действии "CS1503" "Argument 1: cannot convert from 'string' to 'byte[]'". [Строка: 41; Cтолбец: 30]

Подскажите, каким образом все-же получить данные. В мониторе трафика все данные есть
 
  • Спасибо
Реакции: Azakim

gomoney

Client
Регистрация
27.09.2009
Сообщения
124
Благодарностей
37
Баллы
28
Первый раз прошелся получил данные, а на втром круге была такая же ошибка, перезагрузил PM стало ок.
 

SlipDez

Client
Регистрация
18.07.2018
Сообщения
375
Благодарностей
70
Баллы
28
Так они там и так в переменных, точнее к ним можно доступ получить через соответствующие св-ва класса TrafficItem.

Вызываем метод GetTraffic(), получаем IEnumerable<TrafficItem> с ним и работаем.
Можно для удобства просмотра и для теста запихать в таблицу.

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);
}
TrafficItem.ResponseBody возвращает массив байтов, потом его надо "конвертнуть" в string. Но не всегда, если это картинка или какой то медиа файл, то этого делать не надо, т.е. надо работать с этим массивом байтов. Конвертить или нет, зависит от типа данных TrafficItem.ResponseContentType

Отличное решение не могли бы прокомментировать как это работает пытаюсь сделать тоже самое без таблицы чтобы вытащить только body но ничего не работает. В C# не силен.

Пытаюсь вытащить t.ResponseBody но меня закидывает ошибками. Что я делаю не так?

C#:
var traffic = instance.ActiveTab.GetTraffic();
TrafficItem t =traffic;
 t.ResponseBody == null ? "" : Encoding.UTF8.GetString(t.ResponseBody, 0, t.ResponseBody.Length)
 

molotok

Client
Регистрация
17.04.2015
Сообщения
733
Благодарностей
358
Баллы
63
Отличное решение не могли бы прокомментировать как это работает пытаюсь сделать тоже самое без таблицы чтобы вытащить только body но ничего не работает. В C# не силен.

Пытаюсь вытащить t.ResponseBody но меня закидывает ошибками. Что я делаю не так?

C#:
var traffic = instance.ActiveTab.GetTraffic();
TrafficItem t =traffic;
t.ResponseBody == null ? "" : Encoding.UTF8.GetString(t.ResponseBody, 0, t.ResponseBody.Length)


Это пример кода, который выводитит нужные Вам данные в лог. Далее уже сами решайте что ними делать.

C#:
var traffic = instance.ActiveTab.GetTraffic();

foreach(TrafficItem t in traffic)
{
 
    string respBody = t.RequestBody;
    project.SendInfoToLog(respBody);

}
 
  • Спасибо
Реакции: SlipDez

Azakim

Client
Регистрация
25.07.2021
Сообщения
165
Благодарностей
31
Баллы
28
Такая-же проблема.
Из доступных только .Url , .Method и .ResultCode
В остальных пусто.
При попытке обработать
Encoding.UTF8.GetString

Тип Время Сообщение
22:17:18 Компиляция кода Ошибка в действии "CS1503" "Argument 1: cannot convert from 'string' to 'byte[]'". [Строка: 41; Cтолбец: 30]

Подскажите, каким образом все-же получить данные. В мониторе трафика все данные есть
Удалось получить данные?
 

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