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

  • Автор темы Автор темы fri-lancer
  • Дата начала Дата начала

fri-lancer

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

Вложения

  • Untitled-3.jpg
    Untitled-3.jpg
    15,5 KB · Просмотры: 944
  • Untitled-3.jpg
    Untitled-3.jpg
    15,5 KB · Просмотры: 1 217
никто не знает?
 
Кто нибудь разобрался как в новой версии получить данные из 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

 

Вложения

Последнее редактирование:
Спасибо! Особенно за TrafficItem.
Теперь стало намного понятнее.

P.S Но вопрос также и остался для меня открытым :-)
Как эти данные вывести в переменные? Вот сюда:
2333.jpg
 
Последнее редактирование:
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"];
//что то делаем
 
Когда залогинен в аккаунт на десктопном 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());

Есть какие-то костыли/альтернативы этому?
 
Знающие, помогите решением. То что сделал - работает, но как то кажется не лаконично.
Работа будет в 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пасибо.
 

Вложения

  • getTraffic.png
    getTraffic.png
    61 KB · Просмотры: 811
Последнее редактирование:
Работа будет в 50-60 потоков, тупо ходим клацаем по элементам страницы, пишем в таблицу, парсим таблицу сохраняем в список (синхронизация в файл).
Сайтов нужно будет прочекать 200к, опять же кладу в список/дергаю. Не нравится то, что сохраняет(наснифанное) в один файл (напомню что синхронизация списка с файлом)
Сохраняй в бд. Как вариант, сделай виртуальный диск в оперативке, и туда сохраняй инфу, с последующим пересохранением на винт.

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

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

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

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

спасибо.
 
Так они там и так в переменных, точнее к ним можно доступ получить через соответствующие св-ва класса 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
Какие данные собираете? Ответы серверов?
все что в этом примере:
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);
}
 
все что в этом примере:
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);
}

Сейчас так не собирает ничерта (
 
Такая-же проблема.
Из доступных только .Url , .Method и .ResultCode
В остальных пусто.
При попытке обработать
Encoding.UTF8.GetString

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

Подскажите, каким образом все-же получить данные. В мониторе трафика все данные есть
 
  • Спасибо
Реакции: Azakim
Так они там и так в переменных, точнее к ним можно доступ получить через соответствующие св-ва класса 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)
 
Отличное решение не могли бы прокомментировать как это работает пытаюсь сделать тоже самое без таблицы чтобы вытащить только 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
Такая-же проблема.
Из доступных только .Url , .Method и .ResultCode
В остальных пусто.
При попытке обработать
Encoding.UTF8.GetString

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

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

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