Winhttp + https

1. Intercititude 12.03.20 17:10 Сейчас в теме
Доброе время суток!
Управление торговлей (10.3.18.1 ) Конфа (8.2.16.362)

Есть необходимость подключиться к сайту http:/ /edi.kontur.ru/ и получить оттуда данные после авторизации разумеется.

Собственно код попытки :

	Сервер = "http://edi.kontur.ru/";
	Логин =  Login";
	Пароль = "password";
	Путь = КаталогВременныхФайлов() + "details.html";
	
	WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1"); 
	
	WinHttp.Open("GET",Сервер,0);
	WinHttp.SetCredentials(Логин,Пароль,0);
	WinHttp.send();
	
	Сообщить(WinHttp.GetAllResponseHeaders());
	
	ФайлОтвета = Новый ЗаписьТекста(Путь,КодировкаТекста.UTF8);
	ФайлОтвета.Записать(WinHttp.ResponseText);
	ФайлОтвета.Закрыть();
	
	ЧтениеHTML = Новый ЧтениеHTML;
	ЧтениеHTML.ОткрытьФайл(Путь, "UTF-8");
	ПостроительDOM = Новый ПостроительDOM;
	ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
Показать


текст GetAllResponseHeaders() :
Cache-Control: no-cache, no-store, must-revalidate
Connection: keep-alive
Date: Thu, 12 Mar 2020 14:00:35 GMT
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Expires: 0
Set-Cookie: Sticky=048c2207-1683-44ac-b19e-35ab369c303e; domain=auth.kontur.ru; path=/; samesite=lax; httponly
Set-Cookie: AntiForgery=9de517fe-f35f-429c-94e7-7ac7ae1d04bc; path=/
Set-Cookie: ngtoken=LhHL+l5qQIN9iFjIBF/BAg==; expires=Wed, 07-Dec-22 14:00:35 GMT; domain=.kontur.ru; path=/
X-Singular-Replica: http://dtl-singular4/
X-Kontur-Trace-Id: afd34d37372d45e5a3b8a887e9f8ba97
Context-Globals: FwAAAHZvc3Rvay5yZXF1ZXN0LnByaW9yaXR5CAAAAE9yZGluYXJ5FgAAAHZv­c3Rvay50cmFjaW5nLmNvbnRleHRJAAAAYWZkMzRkMzctMzcyZC00NWU1LWEz­YjgtYTg4N2U5ZjhiYTk3OzE2MDdhMGVkLWFjZmMtNGZmMy04MGIwLTNkYTAz­ZWMzOTM5ZA==
X-Kontur-Dont-Retry: True
Dont-Retry: True
X-Singular-Backend: http://sd2-auth-hst2:11354/
Показать



При открытии полученного временного файла details.html в браузере открывается страница (скрин 1). Возможно стоит подключаться не к http://edi.kontur.ru/ а к https://auth.kontur.ru/ ?
Поддержка контура не помогают,внутренняя информация мол.

Подскажите что делаю не так, возможно литература есть какая то, в гугле ничего толкового не нашёл.
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. Xershi 1551 13.03.20 09:12 Сейчас в теме
(1)8.2 не умеет работать по безорасному протоколу. Ставьте 8.3 и работайте.
portwein; +1 Ответить
6. mushdaj 13.03.20 09:18 Сейчас в теме
(5) через WinHttp вполне себе умеет
7. Xershi 1551 13.03.20 10:48 Сейчас в теме
(6) возможно, не пользуюсь данным костылем.
В теории конечно должен, но это не кросплатформенно как минимум.
13. Intercititude 13.03.20 13:13 Сейчас в теме
(6) Документации для 1с к сожалению нету.
14. mushdaj 13.03.20 13:34 Сейчас в теме
(13) если уж делать то через API. вот здесь вся необходимая документация http://docs.edi.kontur.ru/en/latest/ примеров на 1с конечно не будет, лучший пример на 1С это сам интеграционный модуль контура. Зачем играть в угадайку с GET если есть подробное описание API
16. starik-2005 3092 15.03.20 12:42 Сейчас в теме
(14)
Зачем играть в угадайку с GET если есть ...
Да вообще в угадайку играть не надо - есть F12, а там есть все запросы, которые генерятся с клиента к серверу. Я, кстати, ко многим площадкам так подключался (правда, на 8.3 и стандартными методами) без АПИ...

С другой стороны, если есть АПИ (а веб-клиент, по-сути, это АПИ и использует), то, как говорится, сам Бог велел...
8. Intercititude 13.03.20 12:21 Сейчас в теме
(5)
ставьте 8.3
- Звучит неплохо. Боюсь столкнусь с кучей проблем и оптимизацией.
10. Xershi 1551 13.03.20 12:37 Сейчас в теме
(8) ну недельку пооптимизируете и все пройдет. Для начала на тесте поставьте.
3. SyachinS 12.03.20 22:31 Сейчас в теме
Делайте через API, работать с сайтом программно не то что бы невозможно, но очень и очень неудобно, особенно если сайт хоть как то защищён от ботов.
4. Intercititude 12.03.20 23:19 Сейчас в теме
(3)а можно подробнее? Где об этом можно почитать
11. пользователь 13.03.20 12:39
Сообщение было скрыто модератором.
...
9. user1307593 13.03.20 12:28 Сейчас в теме
А к серверу банка ВТБ у вас нет стремления подключиться?
12. Intercititude 13.03.20 13:08 Сейчас в теме
(9) А пойти погулять со своими язвами у Вас нет стремления ?
15. sedoygul 15.03.20 11:12 Сейчас в теме
А чем вас интеграция с 1С самого контура не устроила? Также у них есть апи с документацией к нему, но для работы с ним, вам нужен ключ разработчика, который тоже платный, как и интеграция. Подключиться к сайту как к веб сервису у вас наврятли получиться, там ведь тоже не дураки сидят.
17. starik-2005 3092 15.03.20 12:44 Сейчас в теме
(15)
там ведь тоже не дураки сидят.
Если система работает из браузера, то наивно полагать, что нельзя прикрутить к ней "эмулятор браузера". Я как-то писал про сайт со списком ломбардов - там тоже далеко не дураки сидели, но от F12 их это не спасло...

https://infostart.ru/public/1031620/
18. sedoygul 15.03.20 13:26 Сейчас в теме
(17)
Не, ну это то понятно, вот только вопрос, стоит ли это потраченого времени? Допустим, прикрутит он "эмулятор браузера", потратит на это прорву времени, а они возьмут и сменят алгоритмы запросов, что тогда? Все переделывать?
19. starik-2005 3092 15.03.20 16:36 Сейчас в теме
(18)
а они возьмут и сменят алгоритмы запросов, что тогда? Все переделывать?
Так и АПИ не предполагает, что алгоритмы не поменяются. С другой стороны, веб-страница - это тоже приложение, и оно работает с системой через то самое АПИ, так что если поменяется само веб-приложение, но не поменяется АПИ, то все будет работать и в режиме "эмуляции" веб-приложения.
20. Intercititude 16.03.20 12:19 Сейчас в теме +1 $m
(15) Вообще мне нужны данные о количестве всего лишь, а именно то количество которое запрашивал партнёр при создании заказа. По итогу сделать хочу отчёт,который будет показывать эту разницу в количестве.
У них в Api не нашёл такой информации. Не знаю даже как лучше быть ?
21. sedoygul 16.03.20 18:39 Сейчас в теме
(20) Смотри, если нужно именно через WinHttp, то должно быть что-то вроде(насчет обязательности всех заголовков не уверен):

WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
//Делаем коннект без заголовков, нам нужно будет из кук выдернуть нужные нам данные
WinHttp.Open("GET","https://auth.kontur.ru/?tabs=1,1,0,0&customize=edi&back=https%3A%2F%2Fedi.kontur.ru%2FSelectParty%3Freason%3Dlogout",0);
WinHttp.send();	
//собственно сами куки	
cookies = WinHttp.getAllResponseHeaders();
//выбираем нужные данные	
токен = Сред(cookies,СтрНайти(cookies, "AntiForgery=")+12, 36);  //без этой гадости сервер нам будет китайскую поэму высылать
Stiky = Сред(cookies,СтрНайти(cookies, "Sticky=")+7, 36);
ntoken= Сред(cookies,СтрНайти(cookies, "ngtoken=")+8, 24); 
//Теперь собственно сама авторизация	
WinHttp.Open("POST",Сервер,0);
WinHttp.SetRequestHeader("Connection", "keep-alive"); 
WinHttp.SetRequestHeader("Host", "auth.kontur.ru");
WinHttp.SetRequestHeader("Accept", "application/json, text/plain, */*");
WinHttp.SetRequestHeader("Accept-Encoding", "gzip, deflate, br");
WinHttp.SetRequestHeader("Origin", "https://auth.kontur.ru");
WinHttp.SetRequestHeader("Referer","https://auth.kontur.ru/tabs=1,1,0,0&customize=edi&back=https%3A%2F%2Fedi.kontur.ru%2FSelectParty%3Freason%3Dlogout");
WinHttp.SetRequestHeader("TE", "Trailers");
WinHttp.SetRequestHeader("Upgrade-Insecure-Requests", "1");
WinHttp.SetRequestHeader("Cookie", Stiky+"; "+токен+"; "+ntoken);
WinHttp.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; W…) Gecko/20100101 Firefox/73.0");
WinHttp.SetRequestHeader("Accept-Language", "ru-RU,ru");
WinHttp.SetRequestHeader("X-CSRF-Token", токен);
WinHttp.SetRequestHeader("Content-Length", "72");
WinHttp.SetRequestHeader("Content-Type", "application/json;charset=utf-8");

WinHttp.send("{""Login"":""ЗдесьПишимЛогин"",""Password"":""ЗдесьПарольСоответственно"",""Remember"":false}");
//Забираем токен для подключения из куков
CookiNew = WinHttp.getAllResponseHeaders();
ТокенРабочий = Сред(CookiNew,СтрНайти(CookiNew, "token=")+6, 128);
АвтСид = Сред(CookiNew,СтрНайти(CookiNew, "auth.sid=")+9, 64);
 //Получаем список последних сообщений
WinHttp.Open("POST","https://edi.kontur.ru/internal-api/message-monitoring-2/messages/search/new",0);
WinHttp.SetRequestHeader("Connection", "keep-alive"); 
WinHttp.SetRequestHeader("Accept", "*/*");
WinHttp.SetRequestHeader("Accept-Encoding", "gzip, deflate, br");
WinHttp.SetRequestHeader("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
WinHttp.SetRequestHeader("Cache-Control", "no-cache, no-store");
WinHttp.SetRequestHeader("TE", "Trailers");
WinHttp.SetRequestHeader("Cookie", ntoken+"; "+ТокенРабочий+"; "+АвтСид);
WinHttp.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; W…) Gecko/20100101 Firefox/73.0");
WinHttp.SetRequestHeader("Host", "edi.kontur.ru");
WinHttp.SetRequestHeader("Origin", "https://edi.kontur.ru");
WinHttp.SetRequestHeader("Pragma", "no-cache");
WinHttp.SetRequestHeader("Content-Length", "527");
WinHttp.SetRequestHeader("Content-Type", "text/plain;charset=UTF-8");

WinHttp.send("{""query"":{""senderIdExpression"":null,""senderProviderIdExpression"":null,""recipientIdExpression"":null,""recipientProviderIdExpression"":null,""deliveryPartyGlnExpression"":null,""number"":null,""orderNumber"":null,""errorsQueryString"":null,""receivedTimeRange"":{""lowerBound"":""2020-02-15T21:00:00.000Z"",""upperBound"":null},""senderMessageFormats"":[],""recipientMessageFormats"":[],""senderTransportTypes"":[],""recipientTransportTypes"":[],""messageTypes"":[],""documentTypes"":[],""messageMonitoringDocumentStates"":[],""skip"":0,""take"":20}}");

Показать


Но при работе через WinHttp может быть засада,последний запрос может вернуть крякозябры, почитал в инете, проблема распространенная, решения не нашел. При это такая же конструкция, через Новый HTTPСоединение спокойно вернула мне список в читабельно формате:

СоединениеHTTP = Новый HTTPСоединение("auth.kontur.ru", , , , , Истина);
HTTPЗапрос = Новый HTTPЗапрос("?tabs=1,1,0,0&customize=edi&back=https%3A%2F%2Fedi.kontur.ru%2FSelectParty%3Freason%3Dlogout");
АдресЗапроса = "?tabs=1,1,0,0&customize=edi&back=https%3A%2F%2Fedi.kontur.ru%2FSelectParty%3Freason%3Dlogout";
Ответ = СоединениеHTTP.ОтправитьДляОбработки(HTTPЗапрос);

Cookieхттп = Ответ.Заголовки["Set-Cookie"];
ЦСРФТокен = Сред(Cookieхттп,СтрНайти(Cookieхттп, "AntiForgery=")+12, 36);
Stiky = Сред(Cookieхттп,СтрНайти(Cookieхттп, "Sticky=")+7, 36);
ntoken= Сред(Cookieхттп,СтрНайти(Cookieхттп, "ngtoken="), 32);
	
	
HTTPЗапрос = Новый HTTPЗапрос("/api/authentication/password/auth-by-password");
HTTPЗапрос.Заголовки.Вставить("Connection", "keep-alive");
HTTPЗапрос.Заголовки.Вставить("Host", "auth.kontur.ru");
HTTPЗапрос.Заголовки.Вставить("Accept", "application/json, text/plain, */*");
HTTPЗапрос.Заголовки.Вставить("Accept-Encoding", "gzip, deflate, br");
HTTPЗапрос.Заголовки.Вставить("Origin", "https://auth.kontur.ru");
HTTPЗапрос.Заголовки.Вставить("Referer", "https://auth.kontur.ru/?tabs=1,1,0,0&customize=edi&back=https%3A%2F%2Fedi.kontur.ru%2FSelectParty%3Freason%3Dlogout");
HTTPЗапрос.Заголовки.Вставить("TE", "Trailers");
HTTPЗапрос.Заголовки.Вставить("Upgrade-Insecure-Requests", "1");
HTTPЗапрос.Заголовки.Вставить("Cookie", Cookieхттп);
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
HTTPЗапрос.Заголовки.Вставить("X-CSRF-Token", ЦСРФТокен);
HTTPЗапрос.Заголовки.Вставить("Content-Length", "72");
HTTPЗапрос.Заголовки.Вставить("Accept-Language", "ru-RU,ru");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json;charset=utf-8");
HTTPЗапрос.УстановитьТелоИзСтроки("{""Login"":""ЗдесьЛогин"",""Password"":""ЗдесьПароль"",""Remember"":false}", КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
	
//Передаем куки в новый запрос
Ответ = СоединениеHTTP.ОтправитьДляОбработки(HTTPЗапрос);
Cookieхттп2 = Ответ.Заголовки["Set-Cookie"];
ТокенРабочий = Сред(Cookieхттп2,СтрНайти(Cookieхттп2, "token="), 134);
АвтСид = Сред(Cookieхттп2,СтрНайти(Cookieхттп2, "auth.sid="), 73);
	
СоединениеHTTP1 = Новый HTTPСоединение("edi.kontur.ru", , , , , Истина);
HTTPЗапрос.Заголовки.Вставить("Cookie", ntoken + "; " +АвтСид + "; " +ТокенРабочий);
HTTPЗапрос.УстановитьТелоИзСтроки("{""query"":{""senderIdExpression"":null,""senderProviderIdExpression"":null,""recipientIdExpression"":null,""recipientProviderIdExpression"":null,""deliveryPartyGlnExpression"":null,""number"":""498011508"",""orderNumber"":null,""errorsQueryString"":null,""receivedTimeRange"":{""lowerBound"":""2020-02-15T21:00:00.000Z"",""upperBound"":null},""senderMessageFormats"":[],""recipientMessageFormats"":[],""senderTransportTypes"":[],""recipientTransportTypes"":[],""messageTypes"":[],""documentTypes"":[],""messageMonitoringDocumentStates"":[],""skip"":0,""take"":20}}", КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ = СоединениеHTTP1.ОтправитьДляОбработки(HTTPЗапрос);
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот