|
Не могу из 1С скачать и обработать файл | ☑ | ||
---|---|---|---|---|
0
BenDiget
05.01.23
✎
20:20
|
Привет! Есть ссылка: https://doc.nlmk.shop/api/v1/views/certificates/17jT47KKpj9Y4Aq/scans при нажатии на нее файл тут же скачивается. Также из 1С, через команду запуститьприложение("https://doc.nlmk.shop/api/v1/views/certificates/17jT47KKpj9Y4Aq/scans"); Тоже запускается и скачивается. Но мне надо на просто скачать, а обработать скачанные файлы. То есть ссылок несколько!
Например команда ПолучениеФайловИзИнтернета.СкачатьФайлВоВременноеХранилище("https://doc.nlmk.shop/api/v1/views/certificates/17jT47KKpj9Y4Aq/scans", ПараметрыПолучения) - не сработает, пока сначала вручную не перейдешь по ссылке. Пример другой ссылки: https://doc.nlmk.shop/api/v1/views/certificates/17yfNzpasnQrGCx/scans Может есть какое то решение через запуститьПриложение отловить файлы? Как видно из ссылки - это ссылка не на конкретный файл, а видимо на команду "Скачать!" |
|||
1
Сергиус
05.01.23
✎
22:20
|
(0)Скорее всего, надо через http запросы делать.
|
|||
2
NorthWind
05.01.23
✎
22:22
|
Там, скорее всего, в ответ на запрос приходит не сам файл, а редирект на ссылку, по которой надо файл утащить. Браузер в такой ситуации автоматом переходит по новой ссылке и стягивает файл, а если вы будете делать через HTTPСоединение, то нужно делать в два приема - сначала посылать запрос, потом разбирать заголовки ответа и уже качать по полученной ссылке.
|
|||
3
NorthWind
06.01.23
✎
10:21
|
Вот так работает:
HTTP = Новый HTTPСоединение ("doc.nlmk.shop",,,,,Истина,Новый ЗащищенноеСоединениеOpenSSL()); Запрос = Новый HTTPЗапрос ("/api/v1/views/certificates/17jT47KKpj9Y4Aq/scans"); Ответ = HTTP.Получить (Запрос); ДД = Ответ.ПолучитьТелоКакДвоичныеДанные(); ДД.Записать("D:\1.pdf"); следует иметь в виду что это предельно черновой и очень примитивный код, где вообще ничего касательно ответа сервера не проверяется. Если вебмастера что-то изменят касательно процесса скачивания, он перестанет работать. |
|||
4
BenDiget
07.01.23
✎
11:43
|
(3) Привет! Я попробовал, у меня сохранились файлами размером 1кб, а внутри это:
<html> <head><title>302 Found</title></head> <body> <center><h1>302 Found</h1></center> <hr><center>nginx</center> </body> </html> |
|||
5
BenDiget
07.01.23
✎
11:45
|
(3) и может это важно, у вас тут параметр Истина передается в поле таймаут, там число должно быть, но может я что-то не так понял: HTTP = Новый HTTPСоединение ("doc.nlmk.shop",,,,,Истина,Новый ЗащищенноеСоединениеOpenSSL());
У вас работало на компе? |
|||
6
BenDiget
07.01.23
✎
11:56
|
(3) А еще у меня в ответе: реквизит: "location" принимает значение: "http://doc.nlmk.shop/error/406".
И кодСостояния = 302 Вот еще пара ссылок для примера: https://doc.nlmk.shop/api/v1/views/certificates/17FlPx3K4aMdufi/scans https://doc.nlmk.shop/api/v1/views/certificates/170aD8s7lgwurCE/scans |
|||
7
NorthWind
07.01.23
✎
12:38
|
Так... Насчет Истины вы правы. Хотя работать это будет - потому что Число (Истина)=1, т.е. такое указание соответствует таймауту 1 секунда. Маловато, но для примера почему бы и нет :)
И сегодня код дейстивительно перестал работать, но вместе с ним перестала работать и скачка через браузер. Происходит следующее: https://imgur.com/a/2BE8xVm то есть магазин перестал отдавать эти паспорта без авторизации, отсюда и страничка в поле Location. |
|||
8
NorthWind
07.01.23
✎
12:40
|
хотя, кажется, последняя ссылка из (6) рабочая. Сейчас попробую подсунуть данные от нее.
|
|||
9
NorthWind
07.01.23
✎
12:51
|
HTTP = Новый HTTPСоединение ("doc.nlmk.shop",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос ("/api/v1/views/certificates/170aD8s7lgwurCE/scans"); Ответ = HTTP.Получить (Запрос); ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.ОткрытьФайл("D:\Headers.xml", "UTF-8"); СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Ответ.Заголовки); ЗаписьXML.Закрыть (); Сообщить (Ответ.КодСостояния); ДД = Ответ.ПолучитьТелоКакДвоичныеДанные(); ДД.Записать("D:\1.pdf"); Когда все отрабатывает правильно - код состояния 200, файл записывается, а хидеры выглядят вот так: <pair> <Key xsi:type="xs:string">server</Key> <Value xsi:type="xs:string">nginx</Value> </pair> <pair> <Key xsi:type="xs:string">x-xss-protection</Key> <Value xsi:type="xs:string">1; mode=block</Value> </pair> <pair> <Key xsi:type="xs:string">date</Key> <Value xsi:type="xs:string">Sat, 07 Jan 2023 09:48:56 GMT</Value> </pair> <pair> <Key xsi:type="xs:string">transfer-encoding</Key> <Value xsi:type="xs:string">chunked</Value> </pair> <pair> <Key xsi:type="xs:string">content-disposition</Key> <Value xsi:type="xs:string">attachment; filename=170aD8s7lgwurCE_2023-01-07_09:39:17.696.pdf</Value> </pair> <pair> <Key xsi:type="xs:string">x-content-type-options</Key> <Value xsi:type="xs:string">nosniff</Value> </pair> <pair> <Key xsi:type="xs:string">pragma</Key> <Value xsi:type="xs:string">no-cache</Value> </pair> <pair> <Key xsi:type="xs:string">expires</Key> <Value xsi:type="xs:string">0</Value> </pair> <pair> <Key xsi:type="xs:string">cache-control</Key> <Value xsi:type="xs:string">no-cache, no-store, max-age=0, must-revalidate</Value> </pair> <pair> <Key xsi:type="xs:string">x-frame-options</Key> <Value xsi:type="xs:string">DENY</Value> </pair> <pair> <Key xsi:type="xs:string">set-cookie</Key> <Value xsi:type="xs:string">86fc141ba6e76b83e4f7b60c8aec38c7=e7db7f7704a098f56b460ff8e2921c77; path=/; HttpOnly; Secure; SameSite=None, NSC_ESNS=12bc43c2-4008-13b9-9678-00e0ed69f5d2_2217098849_0121204873_00000000013198265623; Path=/; Expires=Sat, 07-Jan-2023 09:49:11 GMT</Value> </pair> но почему-то это происходит не всегда. Скорее всего, есть какие-то особенности работы API/магазина. |
|||
10
BenDiget
07.01.23
✎
13:10
|
(9) Вы правы, это происходит не всегда. Однако переход по ссылке вручную - всегда(в 95%) отрабатывает корректно: скачивает файл.
Но если попытаться HTTP соединением или Стандартной библиотекой скачать файл, он качается в основном тогда, когда его сначала качнули по ссылке вручную. Не могу разобраться никак. Вы выше писали, что сначала надо посылать запрос, потом разбирать заголовки. И вот что рекомендуют на 1С. Вырезка: // Обрабатываем перенаправление Если Результат.КодСостояния >= 300 и Результат.КодСостояния < 400 Тогда Сообщить("Код статуса больше 3XX, Перенаправление. Код статуса: " + Результат.КодСостояния); Если Результат.КодСостояния = 302 Тогда Сообщить("Код статуса 302, Постоянное перенаправление."); АдресРесурса = Результат.Заголовки.Получить("Location"); Если АдресРесурса <> Неопределено Тогда Сообщить("Выполняю запрос по новому адресу " + АдресРесурса); ВыполнитьHTTPЗапрос(АдресРесурса); Иначе Сообщить("Сервер не сообщил адрес ресурса!"); КонецЕсли; КонецЕсли; КонецЕсли; Прикол в том, что у меня вот здесь АдресРесурса = Результат.Заголовки.Получить("Location"); всегда: "http://doc.nlmk.shop/error/406" |
|||
11
NorthWind
07.01.23
✎
13:33
|
(10) ссылки, которые вы постите, то работают, то не работают. Когда код ответа на запрос оказывается 302, в браузере эта ссылка тоже не открывается, наблюдается картинка https://imgur.com/a/2BE8xVm. Вам нужно каким-то образом разобраться с работоспособностью ссылок, или делать механизм, который будет периодически во все это тыркаться и скачивать, пока не скачает. Я несколько раз запускал один и тот же код и получал ответ то 302 (при этом в локейшене страница ошибки авторизации), то 200, и файл скачивался.
|
|||
12
Сергиус
07.01.23
✎
22:51
|
(11)Нужно делать обработку кода ответа - если 200, то качаем, если 302, то переход куда просит и там уже качать.
|
|||
13
NorthWind
07.01.23
✎
22:56
|
(12) что я и предложил, правда, есть нюанс - если 302, то оно переходит на бессмысленную страницу, откуда скачать уже ничего нельзя. Правда, оно плавает на довольно продолжительных периодах - по много минут или даже десятков минут. Поэтому мне думается, что там для начала нужно бы изучить API и понять, откуда берутся ссылки на паспорта и сколько они существуют.
|
|||
14
ДедМорроз
07.01.23
✎
23:49
|
Не забываем,что браузер может передавать ключи cookie, чтобы та сторона поняла,кто к ней обращается.
В браузере можно включить мониторинг сети и посмотреть,что происходит при скачивании,а уже потом пытаться повторить в 1с. По крайней мере,такой метод очень редко подводит. |
|||
15
ДедМорроз
07.01.23
✎
23:50
|
Еще про поле Referrer не забываем,так как проверить,что нажали ссылку на странице можно еще и по нему.
|
|||
16
BenDiget
10.01.23
✎
16:21
|
(15) Начал копать, а что с ним делать? Через мониторинг посмотрел. Мне надо такие же куки запихнуть в соединение 1С? А что с Referrer делать? Браузер не показыват через мониторинг значение. Но понятно, что стоит политика: trict-origin-when-cross-origin
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |