После написания предыдущей статьи про отслеживание одного трек кода (//infostart.ru/public/649861/) произошло три события:
— Сервис http://services.ukrposhta.ua/bardcodesingle/ перешел в режим нетрудоспособности, встречая своих посетителей обнадеживающей надписью о том, что в ближайшее врем все опять будет работать.
— УкрПочта запустила новый сервис по адресу http://ukrposhta.ua/ua/vidslidkuvati-forma-poshuku и добавила изюминку в виде "невидимой" рекапчи от Google ("невидимый" режим — это отсутствие какого-либо намека на ввод капчи (даже банальной галочки "Я не робот") до тех пор пока Google не считает Вас ботом. Если считает — то всплывает капча).
— Мы наконец-то доделали возможность проверять последний статус групповым запросом (до 240 треков за раз), используя сервис по адресу http://services.ukrposhta.ua/barcodestatistic Скорость работы одного такого запроса на 240 записей намного больше чем аналогичные 240 запросов по одному треку.
Как и в прошлый раз, при помощи программы Fiddler подсматриваем протокол общения и внедряем его у себя.
Изначально запрос GET идет первый раз без указания файла на страницу http://services.ukrposhta.ua/barcodestatistic/default.aspx, в которой мы узнаем Cookies и значения переменных hiddenSessionGuid и VIEWSTATE. Формируем запрос и отправляем его по тому же адресу, но уже методом POST. Собственно, сами функции (в качестве параметра функции ОтслеживаниеПосылкиУкрПочта — массив со списком трек номеров).
Функция RegExp_Exec(Текст,ШаблонРегВыр)
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Ложь;
RegExp.Global = Истина;
RegExp.MultiLine = Ложь;
Текст_ = Новый ТекстовыйДокумент;
Текст_.ДобавитьСтроку(текст);
Для а=0 по текст_.КоличествоСтрок() Цикл
строка = Текст_.ПолучитьСтроку(а);
RegExp.Pattern = ШаблонРегВыр;
Matches=RegExp.Execute(строка);
ЧислоВхождений=Matches.Count();
Если ЧислоВхождений>0 Тогда
Match = Matches.Item(0);
Значение = Match.Submatches.Item(0);
Прервать;
КонецЕсли;
КонецЦикла;
Возврат СокрЛ(Значение);
КонецФункции
Функция ОтслеживаниеПосылкиУкрПочта(Знач Данные)
Соединение = Новый HTTPСоединение("services.ukrposhta.ua");
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Host", "services.ukrposhta.ua");
ЗаголовокHTTP.Вставить("Upgrade-Insecure-Requests", "1");
ЗаголовокHTTP.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36");
ЗаголовокHTTP.Вставить("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
ЗаголовокHTTP.Вставить("Accept-Encoding", "deflate");
ЗаголовокHTTP.Вставить("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
Запрос = Новый HTTPЗапрос("/barcodestatistic/Default.aspx",ЗаголовокHTTP);
Ответ = Соединение.Получить(Запрос);
ОтветВВидеСтроки = Ответ.ПолучитьТелоКакСтроку();
Cookie = ответ.Заголовки.Получить("Set-Cookie");
поз = Найти(Cookie,";");
Если поз>0 тогда
Cookie=Лев(Cookie,поз-1);
КонецЕсли;
ЗначениеVIEWSTATE = RegExp_exec(ОтветВВидеСтроки,"<input type=""hidden"" name=""__VIEWSTATE"" id=""__VIEWSTATE"" value=[#k8SjZc9Dxk>](.*)"" />");
ЗначениеhiddenSessionGuid = RegExp_exec(ОтветВВидеСтроки, "<input type=""hidden"" name=""ctl00$centerContent$hiddenSessionGuid"" id=""ctl00_centerContent_hiddenSessionGuid"" value=[#k8SjZc9Dxk>](.*)"" />");
Boundary ="----WebKitFormBoundaryLQSVHmY12nEZdO0l";
ЗаписьТекста=("--" + Boundary);
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("Content-Disposition: form-data; name=""__VIEWSTATE""" + Символы.ВК + Символы.ПС);
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+(ЗначениеVIEWSTATE);
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("--" + Boundary);
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("Content-Disposition: form-data; name=""__VIEWSTATEGENERATOR""" + Символы.ВК + Символы.ПС);
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("0D589B25");
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("--" + Boundary);
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("Content-Disposition: form-data; name=""ctl00$centerContent$hiddenSessionGuid""" + Символы.ВК + Символы.ПС);
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+(ЗначениеhiddenSessionGuid);
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("--"+Boundary);
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("Content-Disposition: form-data; name=""ctl00$centerContent$fileUploadXmlBarcodes""; filename=""re.txt""");
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("Content-Type: text/plain");
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС;
Для тмп=0 по Данные.Количество()-1 Цикл
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+(Данные.Получить(тмп));
КонецЦикла;
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("--" + Boundary);
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("Content-Disposition: form-data; name=""ctl00$centerContent$btnUpload""" + Символы.ВК + Символы.ПС);
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("Пошук");
ЗаписьТекста=ЗаписьТекста+Символы.ВК + Символы.ПС+("--" + Boundary+"--")+Символы.ВК + Символы.ПС;
РазмерФайлаОтправки = Формат(СтрДлина(ЗаписьТекста)+3,"ЧГ=");
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить("Host", "services.ukrposhta.ua");
ЗаголовокHTTP.Вставить("Cache-Control", "max-age=0");
ЗаголовокHTTP.Вставить("Origin", "http://services.ukrposhta.ua");
ЗаголовокHTTP.Вставить("Upgrade-Insecure-Requests", "1");
ЗаголовокHTTP.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36");
ЗаголовокHTTP.Вставить("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
ЗаголовокHTTP.Вставить("Referer", "http://services.ukrposhta.ua/barcodestatistic/Default.aspx");
ЗаголовокHTTP.Вставить("Accept-Encoding", "deflate");
ЗаголовокHTTP.Вставить("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
ЗаголовокHTTP.Вставить("Cookie", Cookie);
ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
ЗаголовокHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
Запрос = Новый HTTPЗапрос("/barcodestatistic/Default.aspx",ЗаголовокHTTP);
Запрос.УстановитьТелоИзСтроки(ЗаписьТекста,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ОтветВВидеСтроки = Ответ.ПолучитьТелоКакСтроку();
ЧтениеHTML = Новый ЧтениеHTML;
ЧтениеHTML.УстановитьСтроку(ОтветВВидеСтроки,"UTF-8");
тз = НОвый ТаблицаЗначений;
тз.Колонки.Добавить("Номер");
тз.Колонки.Добавить("Дата_");
тз.Колонки.Добавить("Код_");
тз.Колонки.Добавить("Описание");
ПостроительDOM = Новый ПостроительDOM;
ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
всякое = ДокументHTML.ПолучитьЭлементыПоИмени("td");
индекс = 0;
Пока индекс < всякое.Количество() Цикл
НС = тз.Добавить();
НС.Номер = СокрЛП(всякое.Элемент(индекс).ТекстовоеСодержимое);
НС.Дата_ = СокрЛП(всякое.Элемент(индекс+2).ТекстовоеСодержимое);
НС.Код_ = СокрЛП(всякое.Элемент(индекс+3).ТекстовоеСодержимое);
НС.Описание = СокрЛП(всякое.Элемент(индекс+4).ТекстовоеСодержимое);
индекс = индекс + 6;
КонецЦикла;
ЧтениеHTML.Закрыть();
ВОЗВРАТ тз;
КонецФункции
А зачем дважды
RegExp.IgnoreCase = Ложь;
RegExp.Global = Истина;
RegExp.MultiLine = Ложь;
(1) Без злого умысла. Опечатка. Спасибо. Исправил.