Имя: Пароль:
1C
1С v8
Не могу из 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