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

fri-lancer

Client
Joined
Oct 1, 2013
Messages
419
Reaction score
160
Points
43
Кто нибудь разобрался как в новой версии получить данные из GetTraffic в переменные?
В этом примере выводиться только в лог.
Хотелось бы чтобы данные из каждой вкладки были в разных переменных как на картинке
 

Attachments

fri-lancer

Client
Joined
Oct 1, 2013
Messages
419
Reaction score
160
Points
43
никто не знает?
 

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
824
Points
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

 

Attachments

Last edited:

fri-lancer

Client
Joined
Oct 1, 2013
Messages
419
Reaction score
160
Points
43
Спасибо! Особенно за TrafficItem.
Теперь стало намного понятнее.

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

Astraport

Client
Joined
May 1, 2015
Messages
5,002
Reaction score
4,468
Points
113
Как эти данные вывести в переменные? Вот сюда:
Может просто там же в C# - project.Variables["Body"].Value = и присваиваете.
 

fri-lancer

Client
Joined
Oct 1, 2013
Messages
419
Reaction score
160
Points
43
Может просто там же в C# - project.Variables["Body"].Value = и присваиваете.
Даже вообще не представляю как это сделать...
 

Moadip

Client
Joined
Sep 26, 2015
Messages
509
Reaction score
824
Points
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
Joined
Sep 2, 2014
Messages
133
Reaction score
54
Points
28
Когда залогинен в аккаунт на десктопном facebook код возвращает кол-во элементов = 0. При этом во вкладке Траффик запросы есть. Попробовал для примера m.facebook.com, гугл и парочку других сайтов там всё ок >0. Но мне нужны конкретные параметры именно из десктопного фб. Версия 5.16.2.0 (пробовал на 5.22.1.0 - тоже самое, но вообще работает всё на 5.16.2.0)

Код
Code:
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
Joined
Aug 29, 2013
Messages
332
Reaction score
82
Points
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пасибо.
 

Attachments

Last edited:

Moadip

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

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

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

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

ol1ver

Client
Joined
Aug 29, 2013
Messages
332
Reaction score
82
Points
28
Если через кубики зенки, то там по идее идет блокировка автоматом, если через код, то там ты уже сам за этим должен следить.
не могли бы вы подсказать пример правильной записи в файл?
я буду брать две первые буквы (а то и три) домена.
решил отказаться от синхронизации списка с файлом.

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

спасибо.
 

Home_KreKer

Client
Joined
Dec 5, 2016
Messages
164
Reaction score
37
Points
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

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

Yuriy Zymlex

Moderator
Staff member
Joined
Oct 24, 2016
Messages
6,559
Reaction score
3,388
Points
113
Почему то НЕ каждый раз собирает данные данный код. Не могу понять почему...
Какие данные собираете? Ответы серверов?
 

Home_KreKer

Client
Joined
Dec 5, 2016
Messages
164
Reaction score
37
Points
28
Какие данные собираете? Ответы серверов?
Для теста пробовал код - написанный выше.
Из всех данных, что собирал код - мне нужны были только данные "url"
 

Home_KreKer

Client
Joined
Dec 5, 2016
Messages
164
Reaction score
37
Points
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
Joined
May 30, 2019
Messages
480
Reaction score
200
Points
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
Joined
Jan 6, 2020
Messages
46
Reaction score
14
Points
8
Сейчас так не собирает ничерта (
у меня работает этот код, собирает все запросы из "трафика"
 

Jugador

Client
Joined
Jun 20, 2016
Messages
36
Reaction score
11
Points
8
Такая-же проблема.
Из доступных только .Url , .Method и .ResultCode
В остальных пусто.
При попытке обработать
Encoding.UTF8.GetString

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

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

gomoney

Client
Joined
Sep 27, 2009
Messages
124
Reaction score
37
Points
28
Первый раз прошелся получил данные, а на втром круге была такая же ошибка, перезагрузил PM стало ок.
 

SlipDez

Client
Joined
Jul 18, 2018
Messages
453
Reaction score
86
Points
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
Joined
Apr 17, 2015
Messages
742
Reaction score
366
Points
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);

}
 
  • Thank you
Reactions: SlipDez

Azakim

Client
Joined
Jul 25, 2021
Messages
165
Reaction score
31
Points
28
Такая-же проблема.
Из доступных только .Url , .Method и .ResultCode
В остальных пусто.
При попытке обработать
Encoding.UTF8.GetString

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

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

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