Як відправляти GET запит програмою ZennoPoster

GET запити – це дуже ефективний інструмент, яким однозначно потрібно навчитись працювати. Але чомусь, коли я починав вивчати ZennoPoster, мені здавалось що це складно, що це мені не потрібно, що спочатку я буду робити як вмію, а колись мабуть вивчу. Зараз я розумію, що мої проєкти могли працювати в десятки разів ефективніше, якщо я просто потратив би декілька днів на вивчення документації.

В мене колись в далекому 2015-2016 році всі проєкти керували браузером за допомогою програми ZennoPoster. А до цього часу я використовував iMacros, який виконувався всередині браузера FireFox. Так от, цей iMacros в якийсь час з’їдав всю оперативну пам’ять на ком’ютері, і керувати декількома копіями було складним завданням. Тому і перейшов я на використання ZennoPoster. І от, в якийсь момент я використовував дешеві проксі, частина з них були не працюючими. Запуск браузера в ZennoPoster займав приблизно від 15 до 60 секунд. І коли в цей момент виявлялось що проксі не працюють – браузер закривався, і відкривався уже використовуючи наступний проксі сервер. Ефективність використання ресурсів ком’ютера була не оптимальною. Приблизно в той час мені прийшлось вивчати що таке GET запит і як його відправляти.

Виявляється, що можна оптимізувати роботу проєкта, якщо побудувати його логіку наступним чином:
Беремо з текстового списку рядок з проксі сервером
Відправляємо GET запит на будь-який сайт
Одержавши відповідь – вважаємо що проксі працюючий
Якщо відповідь не одержали – проксі не працює
Після чого вже є можливіть або одержати наступний проксі, або продовжити роботу в браузері.
Власне такий підхід і допоміг мені працювати ефективніше – практично кожний запущений браузер одержував гарантовано робочий проксі сервер і міг виконувати роботу, тобто запуски браузерів які нічого не можуть робити припинились.

Перш ніж відправляти GET запити, потрібно знати, що відповідь від сайта до якого ми звертаємось завжди приходить у вигляді заголовків і контенту. Заголовки можуть бути різними, і сам контент може бути різним. Власне в заголовках і міститься інформація про те, яким буде контент. Заголовки відповіді на запит від контенту розділяються двома порожніми рядками. Але, щоб спростити для користувачів роботу, в програмі ZennoPoster розробники заклали можливість одержувати декілька варіацій – самі заголовки, контент, заголовки і контент, файл, файл і заголовки. В залежності від потреби використовується необхідний варіант налаштуваннь.

Також, щоб відправити GET потрібно попередньо підготувати вхідні дані. Я маю на увазі сам URL, на який буде відправлено запит, також якщо потрібно щоб сервер бачив цей запит з іншого IP потрібно мати проксі. Можливо, що для отримання відповіді потрібно передати якісь специфічні заголовки, наприклад токен JWT чи cookie, в яких часто можуть находитись дані сессії авторизованого користувача. Підготовка в цьому випадку означає приведення даних до того вигляду, в якому вони повинні бути використані для відправки запиту. Після чого власне відправляється сам запит, результатом його виконання буде відповідь від сервера у вигляді, який ми самостійно вибрали.

Самий простий код, який швидко набрати на клавіатурі для відправки GET запитів може виглядати так:

string url = "https://nghttp2.org/httpbin/get";
string text = ZennoPoster.HttpGet(url);
return text;

В ньому в першому рядку вказаний URL, на який він буде відправлений.
В другому рядку власне сама інструкція, яка відправить GET запит на указаний URL і одержить результат.
І третьому рядку цей результат буде повернуто з блоку наприклад у якусь змінну проєкту.

Як бачимо, ми підготували тільки URL, а вище по тексту я писав, що потрібно підготувати багато різних вхідних даних.
Так от ZennoPoster в момент запуску проєкта генерує всі значення самостійно згідно налаштуваннь які були зроблені в ProjectMaker.
І так як у більшості випадків достатньо одержати тільки дані які приходять у відповідь без заголовків – тому саме у такому вигляді повертається результат, який зберігаємо у змінній для подальшої роботи з ним.

Але, коли нам потрібно використовувати проксі, і вказати інший тип представлення відповіді, тоді потрібно підготувати дані у змінних, і використовувати приблизно такий код:

string url = "https://nghttp2.org/httpbin/get?key1=value1&key2=value2";
string proxy = string.Empty;
string encoding =Encoding.UTF8.WebName;
var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly;
string text = ZennoPoster.HttpGet(url, proxy, encoding, type);
return text;

Цей фрагмент коду поверне точно такий самий результат, як і попередній (тому що попередній не використовував проксі, і тут проксі у вигляді пустого рядка, тобто не будуть використовуватись, в попередньому запиті у відповідь поверталось тільки тіло відповіді сервера – тут також параметр встановлений в BodyOnly що означає те саме, в попередньому коді кодування даних відбувається у UTF8, в цього разу це просто вказано явно). Тепер просто в цьому фрагменті достатньо замінити проксі, URL чи тип повернення результату, і можна використовувати його для запитів, які не потребують специфічних заголовків чи cookie.

Параметр який відповідає за тип результату, який буде повернено може мати такі значення:

var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderOnly; // Тільки заголовки
var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly; // Тільки дані
var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody; // Заголовки і дані
var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File; // Файл
var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.FileAndHeaders; // Заголовки і файл

В випадку з File – буде повернено шлях до файлу, який був збережений у тимчасову папку.
У випадку з FileAndHeaders – буде повернено заголовки і через два порожні рядки шлях до файлу в тимчасовій папці.

Нижче приведений фрагмент коду, в якому видно які саме параметри можна добавити в інструкцію яка відправляє GET запит:

string url = "https://nghttp2.org/httpbin/get?key1=value1&key2=value2";
string proxy = string.Empty;
var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly; // Тільки дані
string cookie = "key_1=value_1;key_2=value_2";
string [] header =  new[]{"Key: Value","Key2: Value2","Key3: Value3"};

string text = ZennoPoster.HttpGet(
url, // Куди відправляємо запит
proxy, // З якого IP відправляємо запит
"UTF-8", // У якому кодуванні відправляєтсья запит
type, // У якому вигляді повернути результат
30000, // Скільки мілісекунд очікувати результат від сервера
cookie, // Добавити заголовок з cookie до запиту
project.Profile.UserAgent, // Який UserAgent використовувати для цього запиту
false, // Чи слідувати php переадресаціям
5, // Якщо слідувати переадресаціям, то скільки максимум обробляти
header, // Які додатково заголовки добавити до запиту
null, // Шлях до папки в яку зберегти файл з результатом
true // Не переводити параметри URL в UrlEncode
);
return text;

Власне приблизно в такому вигляді можна копіювати код, вставляти його у свої проєкти і використовувати.
Але, потрібно розуміти, що ZennoPoster постійно змінюється, добавляється додатковий функціонал.
Код який був вище працював добре для мене з 2015 року.
Проте, у деяких випадках він змінював url, додаючи туди якісь лишні символи.
Також крім заголовків, які вказувались явно добавляв свої лишні заголовки.

Розробники ZennoPoster в якийсь час вирішили написати новий код, який повинен був як мінімум не мати тих проблем, про які користувачі писали на форумі. Проте, виявилось, що нова версія також поводить себе по різному. У деяких випадках приходиться використовувати устарівший код, а у деяких випадках – новий код (я приведу його нижче). А коли нічого не допомогає, тоді потрібно використовувати відправку запитів через Curl, чи робити запити стандартним кодом C# чи навіть використовувати сторонні бібліотеки на кшталт RestSharp. Випадки коли це буде необхідно виявити не важко – відправляється запит, у відповідь одержується необхідний результат. Якщо такого не відбувається – пробуємо відправляти запит з тими самими даними іншим способом. Якщо один із способів повертає те, що необхідно – його власне і використовуємо у цьому випадку.

Ось приклад нового коду, який відправляє запити методом GET:

string url = "https://nghttp2.org/httpbin/get?key1=value1&key2=value2";
string proxy = string.Empty;
string encoding =Encoding.UTF8.WebName;
var type = ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly;
var method = ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.GET;
string cookie = "key_1=value_1;key_2=value_2";
string UserAgent = project.Profile.UserAgent;
string [] headers =  new[]{"Key: Value","Key2: Value2","Key3: Value3"};
var CookieContainer = project.Profile.CookieContainer;

string text = ZennoPoster.HTTP.Request(
method: method, // метод яким буде відправлено запит
url: url,// по якому адресу буде відправлено запит
content: string.Empty, // які дані буде відправляти запит
contentPostingType: string.Empty, // який тип контенту буде відправляти запит
proxy: proxy, // з якого IP відправляти запит
Encoding: encoding, // в якому кодуванні відправляти запит
respType: type, // в якому вигляді повернути результат
Timeout: 30000, // скільки часу очікувати результат
Cookies: cookie, // використовувати додаткові cookie
UserAgent: UserAgent, // використовувати вказаний UserAgent
UseRedirect: false, // включити слідування переадресаціям
MaxRedirectCount: 0, // слідувати php переадресаціям
AdditionalHeaders: headers, // добавити заголовки до цього запиту
DownloadPath: null, // шлях до папки для збереження результату
UseOriginalUrl: true, // не змінювати параметри запиту
throwExceptionOnError: true, // генерувати помилку якщо не одержали результат
cookieContainer: CookieContainer, // використання контейнера для cookie
removeDefaultHeaders: true // видалення стандартних заголовків
);

return text;

Як бачимо аргументів, які потрібно передавати стало більше.
Якщо ми якісь не вказуємо, то ZennoPoster підставить туди якісь дані автоматично.
Тому, часто необхідно все таки вказувати всі, щоб явно розуміти що саме буде відправлено.
Хоча, виявилось що і у такому вигляді не завжди відправляються запити корректно (що я писав вище).
І розробники ZennoPoster добавили в налаштуваннях вибір між Стандартним і Альтернативним способом відправки запитів.
Суть в тому, що Стандартний – це використання способу, який був раніше (під капотом бібліотека Chilkat.NET).
А Альтернативний – це на скільки я зрозумів реалізація уже від розробників ZennoLab.

Користуюсь я зазвичай звичайним, Стандартним методом.
Хоча інколи, коли є проблема приходиться використовувати Альтернативний.
Одне радує, що код не потрібно міняти, а тільки налаштування в ProjectMaker.

Одна думка про “Як відправляти GET запит програмою ZennoPoster”

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *