[РЕШЕНО]Помогите с созданием http запроса

Модератор: Модераторы

[РЕШЕНО]Помогите с созданием http запроса

Сообщение java73 » 27.07.2018 10:49:11

Добрый день.

*** Модули с готовым решением на битбукете ***

Я впервые сталкиваюсь с необходимостью работы с интернет-компонентами в lazarus, поэтому прошу отнестись как к новичку. Есть сайт налоговой для просмотра сведений ЕГРЮЛ. Хочу автоматизировать получение pdf файлов результирующих и приправить этим свое приложение для ведения юрлиц.
Сайт здесь: https://egrul.nalog.ru/
на сайте имеется форма, на которой мне важны следуюище поля:
1: <input type="text" name="ogrninnul" maxlength="13" id="ogrninnul" class="txt-m txt-decimal"> - это поле, в которое вписывается ОГРН или ИНН юрлица для поиска
2: <input type="text" name="captcha" id="captcha" class="txt-m txt-numeric" maxlength="6" autocomplete="off"> - это поле, в которое вписывается цифровая капча, сгенерированная страницей с помощью следующих двух полей
3: <input type="hidden" name="captchaToken" value="5F73FC3789F5D8D214D925E21084B095BD7FA5C04B6E5A89FF25A78C41A3C29DB83DF7B7E7917521D4AE652E6CECAD717162217284F929467E36E037A7CE3387"> - по этому скрытому полю идентифицируется капча
4: <img src="/static/captcha.html?a=5F73FC3789F5D8D214D925E21084B095BD7FA5C04B6E5A89FF25A78C41A3C29DB83DF7B7E7917521D4AE652E6CECAD717162217284F929467E36E037A7CE3387&amp;version=2"> - здесь по идентификатору капчи формируется ее изображение, которое мне нужно показать пользователю, чтоб он ввел капчу ручками
5: <button type="submit" class="float-right btn-ok btn-xl">Найти</button> - соответственно сабмит кнопка
после того, как запрос отправлен, на странице заполняется таблицей контейнер с названием resultContent
6:<div id="resultContent"><table><tbody><tr><td><a href="download/4C3542D259F189B3F90F804E217FC4CEA030F0235879C690D45C399523E931EB773EB8309A38C721142B137DADD76D25C521108E855669E8B8CBEEFEE7F54CF73CF9B2D3615DDC517631CBC1B76D7EDF" class="vypPdf" target="_blank">ОБЩЕСТВО</table></div>

Поскольку по правильному ИНН/ОГРН будет только один результат, мне нужно выцепить сформированную ссылку формата "download/4C3542D259F189B3F90F804E217FC4CEA030F0235879C690D45C399523E931EB773EB8309A38C721142B137DADD76D25C521108E855669E8B8CBEEFEE7F54CF73CF9B2D3615DDC517631CBC1B76D7EDF" и по ней получить с сервера pdf файл.

Вот собственно задача, подскажите, как мне её начать решать.

<!!! вы находитесь здесь !!!>
Последний раз редактировалось java73 30.07.2018 15:23:22, всего редактировалось 4 раз(а).
java73
постоялец
 
Сообщения: 231
Зарегистрирован: 21.11.2013 09:08:10

Re: Помогите с созданием http запроса для вытаскивания PDF

Сообщение Снег Север » 27.07.2018 11:30:14

synapse library - TFTPSend
пример http://forum.lazarus.freepascal.org/index.php?topic=29927.0

Или использовать chromium, компоненты уже входят в codetyphon
Аватара пользователя
Снег Север
энтузиаст
 
Сообщения: 1329
Зарегистрирован: 27.11.2007 16:14:47

Re: Помогите с созданием http запроса для вытаскивания PDF

Сообщение Ichthyander » 27.07.2018 12:12:12

Почему TFTPSend? HTTPSend + OpenSSL
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 442
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Помогите с созданием http запроса для вытаскивания PDF

Сообщение java73 » 27.07.2018 15:49:56

Спасибо за наводку Ichthyander
Дошел почти до конца. Получаю страницу с сайта, читаю поля, в том числе captchaToken, получаю картинку капчи, но при попытке отправить методом POST:
Код: Выделить всё
         Params:='ogrninnul='+IDEdit.Text+'&captcha='+CaptchaEdit.Text;
         WriteStrToStream(HTTPSender.Document,Params);
         HTTPSender.MimeType := 'application/x-www-form-urlencoded';
         HTTPSender.HTTPMethod('POST',URLEdit.Text);

в ответ получаю страницу с ошибкой 400 Bad request

Как понять, как страница формирует пакет для отправки введенных значений?

Добавлено спустя 28 минут 40 секунд:
попробовал с помощью live headers в браузере понять, что страница передает при нажатии сабмит, но ничего не понял))

HTTP Headers
Request https://egrul.nalog.ru/
Method POST
Status HTTP/1.1 200 OK

Request HTTP Headers
Accept application/json, text/javascript, */*; q=0.01
Origin https://egrul.nalog.ru
X-Requested-With XMLHttpRequest
User-Agent Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Content-Type application/x-www-form-urlencoded
Referer https://egrul.nalog.ru/
Accept-Encoding gzip, deflate, br
Accept-Language ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Cookie _ym_uid=15319180292663754; _ym_d=1531918029; _ga=GA1.2.331128699.1531918822; _ym_isad=1; last_visit=1532660015138::1532674415138; _gid=GA1.2.1121915249.1532674415; _ym_visorc_23729197=b; JSESSIONID=06E3E30DA734908B4BB31C0690B8F420

Response HTTP Headers
Server nginx/1.10.3
Date Fri, 27 Jul 2018 12:15:43 GMT
Content-Type application/json
Transfer-Encoding chunked
Connection keep-alive

Добавлено спустя 5 минут 31 секунду:
вот заготовка для тестирования
java73
постоялец
 
Сообщения: 231
Зарегистрирован: 21.11.2013 09:08:10

Re: Помогите с созданием http запроса для вытаскивания PDF

Сообщение Ichthyander » 27.07.2018 16:51:28

Даже не заглядывая пока в заготовку. Причин много может быть.
1. Вы заголовки очищали после запроса перед новым запросом? HTTPSender.Headers.Clear;
2. А так да, скорее всего Вы не смогли обойти защиту сайта от автоматических запросов. Нужно думать. Может капчу все-таки не проходите? Может ява скрипты какие на страницы генерируют что-то в заголовке или скорее всего в кукис. Это нужно разобраться и отправлять при запросе. Если не получится понять, можете попробовать поискать PHP аналоги для работы с этим сайтом. Мне кажется такие есть, потому как достаточно полезный ресурс.

Добавлено спустя 3 минуты 8 секунд:
3. Анализ заголовков действительно Вам также может помочь. Не знаю что такое live headers, но даже в Firefox без плагинов есть инструменты для просмотра заголовков запроса и ответа. Исследовать элемент => Сеть. Выполняем запрос, выделяем основую страницу и смотрим, что отправлено, что пришло
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 442
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Помогите с созданием http запроса для вытаскивания PDF

Сообщение java73 » 27.07.2018 17:14:00

В куках как видно полезный только JSESSIONID, остальные это идентификаторы яндекса и гугла аналитикс. Я вот думаю, если заголовок очистить, то не сбросится ли токен капчи? Судя по анализу страницы при каждом обновлении запроса приходит новый токен капчи, поэтому иногда даже при использовании самой страницы картинка капчи старая, а токен уже новый и приходит ошибка. Пока не пойму в чем проблема.
java73
постоялец
 
Сообщения: 231
Зарегистрирован: 21.11.2013 09:08:10

Re: Помогите с созданием http запроса для вытаскивания PDF

Сообщение Ichthyander » 27.07.2018 17:27:28

Сбросить заголовок и установить те, что нужно. Я не помню точно, но на заре у меня были из-за этого проблемы какие-то. Кукис не нужно сбрасывать. Я именно про заголовки.
P.S. Да, и еще делайте задержки между запросами и присвойте юзерагент какого-нибудь реального браузера. Если делаете массово, то чтобы еще периодически менялоась. Я в свое время делал рандомные задержки и рандомно подставлял юзерагенты и у меня даже капчи не появлялись при парсинге там где у скриптов-скрапперов появлялись
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 442
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Помогите с созданием http запроса для вытаскивания PDF

Сообщение java73 » 27.07.2018 17:45:23

В общем судя по анализу из браузера при нажатии submit запрос оформляется таким способом (с реальными данными к примеру):
kind=ul&srchUl=ogrn&ogrninnul=1147328003998&namul=&regionul=&srchFl=ogrn&ogrninnfl=&fam=&nam=&otch=&region=&captcha=877821&captchaToken=EE9C7F3DBAAF6C63CE4D494D7B40AB257CA8E07C8B6D6D2587CD057EDC941C5C72F60A90D7278A9CB3E9B85CD821FEDD288A54FD85985A291BE947A0ED6954C4

Я формирую его аналогично с своем методе:
Код: Выделить всё
HTTPSender.Headers.Clear;
         Params :='kind=ul&srchUl=ogrn&ogrninnul='+IDEdit.Text;
         Params +='&namul=&regionul=&srchFl=ogrn&ogrninnfl=&fam=&nam=&otch=&region=&captcha='+CaptchaEdit.Text;
         Params +='&captchaToken='+captchaToken;
         WriteStrToStream(HTTPSender.Document,Params);
         HTTPSender.MimeType := 'application/x-www-form-urlencoded';
         HTTPSender.HTTPMethod('POST',URLEdit.Text);

На выходе опять Bad request...

Заголовок из браузера:
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Content-Length: 264
Content-Type: application/x-www-form-urlencoded
Cookie: _ym_uid=15319180292663754; _ym_d=1531918029; _ga=GA1.2.331128699.1531918822; _ym_isad=1; last_visit=1532660015138::1532674415138; _gid=GA1.2.1121915249.1532674415; _ym_visorc_23729197=b; JSESSIONID=3553C7ECFE34B14D333D7E1297029E91
Host: egrul.nalog.ru
Origin: https://egrul.nalog.ru
Referer: https://egrul.nalog.ru/
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
X-Requested-With: XMLHttpRequest


Что из этого можно программно поставить?
java73
постоялец
 
Сообщения: 231
Зарегистрирован: 21.11.2013 09:08:10

Re: Помогите с созданием http запроса для вытаскивания PDF

Сообщение Ichthyander » 27.07.2018 17:54:08

Что из этого можно программно поставить?
Да, вообщем-то все
Кстати, а я вот не вижу url-кодирования перед запросом. Хотя нет и символов соответствующих в запросе. Но попробовать стоит. Стандарт велит по крайней мере

Добавлено спустя 2 минуты 47 секунд:
ٌК примеру
Код: Выделить всё
  HTTP.UserAgent:='Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.307.9 Safari/532.9';
  HTTP.MimeType:='application/x-www-form-urlencoded; charset=UTF-8';
  HTTP.Cookies.Add(Cookie);
  HTTP.Cookies.Add('MYLANGID=ru');
  HTTP.Headers.Add('Accept: application/json, text/javascript, */*'); 

Заголовки покажите, которые отправляете программно. Показать можно вот так
Код: Выделить всё
    HTTPSend.Headers.SaveToFile('debug_headers.txt');
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 442
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Помогите с созданием http запроса для вытаскивания PDF

Сообщение java73 » 27.07.2018 18:17:42

Решил задачу, правда, нужно было немного заголовков вставить, и главным образом HTTPSender.Protocol:='1.1';
теперь еще результат в JSON разбирать))
java73
постоялец
 
Сообщения: 231
Зарегистрирован: 21.11.2013 09:08:10

Re: [РЕШЕНО]Помогите с созданием http запроса

Сообщение Ichthyander » 27.07.2018 18:23:30

:D молодец. А что за JSON результат? Квест не закончен?
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 442
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: [РЕШЕНО]Помогите с созданием http запроса

Сообщение java73 » 27.07.2018 18:55:41

Возвращает массив 'rows' если даже одна запись, внутри массива мне нужно выдернуть значение ключа 'T'
java73
постоялец
 
Сообщения: 231
Зарегистрирован: 21.11.2013 09:08:10

Re: [РЕШЕНО]Помогите с созданием http запроса

Сообщение java73 » 30.07.2018 15:27:24

В общем, всю задачу порешал, модуль, готовый к использованию (с единичным, но работоспособным функционалом на текущий момент), встроен в базу данных юрлиц. Нерешаемая на данный момент задача только одна: автоматическое распознавание капчи))))) для ручного решения вынес в параметры вызова основного метода callback для функции, решающей капчу. То есть методу основному плевать, как решается капча, зато все остальное он делает как надо.
java73
постоялец
 
Сообщения: 231
Зарегистрирован: 21.11.2013 09:08:10

Re: [РЕШЕНО]Помогите с созданием http запроса

Сообщение Ichthyander » 30.07.2018 15:49:58

Код: Выделить всё
Нерешаемая на данный момент задача только одна: автоматическое распознавание капчи))))
А не нужно ее решать. Просто подключить сервис антикапчи через их API.

Добавлено спустя 1 минуту 32 секунды:
За выложенный репозитарий респект. Может так случится, что пригодится и мне. В таком случае могу и подключится к либе для ее доработок
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 442
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: [РЕШЕНО]Помогите с созданием http запроса

Сообщение java73 » 31.07.2018 10:13:58

Ichthyander писал(а):А не нужно ее решать. Просто подключить сервис антикапчи через их API.

Ну у меня немного не в промышленных масштабах это дело, чтобы пользоваться платными сервисами распознавания капч (а бесплатных с подходящим api я не нашел). Смысл в том, что имеется морда для управления базой юрлиц для консалтинговой компании, конкретная задача - чтоб пользователь не утруждал себя лазанием на сайт налоговой, а просто на карточке юрлица кликнул "скачать выписку", и она скачалась, ну при этом вот придется дополнительно ему самому набрать капчу во всплывающем окошке, но это все проще, чем лезть на сайт, вписывать параметры поиска.
В класс дописал метод, возвращающий еще коллекцию объектов при поиске по названию организации. Кстати, вот я уже вижу, что без подробного описания тех схем данных, которые выдает ФНС, очень трудно вся интеграция происходить будет, поскольку при разных видах поиска, набор данных в возвращаемом json совершенно отличается. С такой же ерундой сталкивался, когда интегрировался с ФИАС базой, чтоб адреса подставлять по-взрослому.
java73
постоялец
 
Сообщения: 231
Зарегистрирован: 21.11.2013 09:08:10


Вернуться в Сети

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru