Имя: Пароль:
1C
 
Не получается скачать pdf
0 John83
 
25.06.25
02:31
На сайте
https://roszdravnadzor.gov.ru/services/turnover
вводятся сведения о лекарственном средстве, выводится список найденных.
Задача состоит в том, чтобы скачать этот список в pdf. На странице имеется соответствующая кнопка.
Смотрел в бразузере параметры запроса, заголовки. Сделал под 1С, но скачивается только страница html поиска, упакованная в архив.
Что не так делаю?

    ИмяФайла = "Выписка.zip";
    ПолныйПутьФайла = КаталогДокументов() + ИмяФайла;
    Сообщить(ПолныйПутьФайла);
    
    ТелоЗапроса = Новый Структура;
    ТелоЗапроса.Вставить("q_label", "244857651");
    ТелоЗапроса.Вставить("dt_from", "01.01.2025");
    ТелоЗапроса.Вставить("dt_to", "");
    ТелоЗапроса.Вставить("q_type_ls", "");
    ТелоЗапроса.Вставить("q_org", "");
    ТелоЗапроса.Вставить("q_dt_ru_from", "");
    ТелоЗапроса.Вставить("q_dt_ru_to", "");
    ТелоЗапроса.Вставить("q_no_ru", "");
    ТелоЗапроса.Вставить("q_tn", "");
    ТелоЗапроса.Вставить("q_mnn", "");
    ТелоЗапроса.Вставить("q_series", "");
    ТелоЗапроса.Вставить("q_producer", "");
    ТелоЗапроса.Вставить("q_country", "");
    ТелоЗапроса.Вставить("pdf", "1");

    Параметры = "";
    Для Каждого ннн1 Из ТелоЗапроса Цикл
        Если Параметры <> "" Тогда
            Параметры = Параметры + "&";
        КонецЕсли;
        Параметры = Параметры + ннн1.Ключ + "=" + СокрЛП(ннн1.Значение);
    КонецЦикла;
    
    Сообщить(Параметры);
    ЗащищенноеСоединениеOpenSSL = Новый ЗащищенноеСоединениеOpenSSL;
    Соединение = Новый HTTPСоединение("roszdravnadzor.gov.ru", ,,,, 30, ЗащищенноеСоединениеOpenSSL);
    
    ЗаголовокHTTP = Новый Соответствие();
    ЗаголовокHTTP.Вставить("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    ЗаголовокHTTP.Вставить("Accept-Encoding", "gzip, deflate, br, zstd");
    ЗаголовокHTTP.Вставить("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
    ЗаголовокHTTP.Вставить("Cache-Control", "max-age=0");
    ЗаголовокHTTP.Вставить("Connection", "keep-alive");
    ЗаголовокHTTP.Вставить("Content-Type", "application/x-www-form-urlencoded");
    ЗаголовокHTTP.Вставить("Cookie", "uid=3115758488007864343; cookie_agreement=true");
    ЗаголовокHTTP.Вставить("DNT", "1");
    ЗаголовокHTTP.Вставить("Host", "roszdravnadzor.gov.ru");
    ЗаголовокHTTP.Вставить("Origin", "https://roszdravnadzor.gov.ru");
    ЗаголовокHTTP.Вставить("Priority", "u=0, i");    
    ЗаголовокHTTP.Вставить("Referer", "https://roszdravnadzor.gov.ru/");
    ЗаголовокHTTP.Вставить("Sec-Fetch-Dest", "document");
    ЗаголовокHTTP.Вставить("Sec-Fetch-Mode", "navigate");
    ЗаголовокHTTP.Вставить("Sec-Fetch-Site", "same-origin");
    ЗаголовокHTTP.Вставить("Sec-Fetch-User", "?1");
    ЗаголовокHTTP.Вставить("Upgrade-Insecure-Requests", "1");
    ЗаголовокHTTP.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:139.0) Gecko/20100101 Firefox/139.0");
    
    Запрос = Новый HTTPЗапрос("/services/turnover", ЗаголовокHTTP);
    
    Запрос.УстановитьТелоИзСтроки(Параметры, "UTF-8");

    Ответ = Соединение.ОтправитьДляОбработки(Запрос, ПолныйПутьФайла);
1 John83
 
25.06.25
02:33
вот тут смотрю параметры
2 Ёпрст
 
гуру
25.06.25
09:07
(0) так ты передаешь файл, а не получаешь. Может того, get сделаешь, а не post ? Да и на картинке твоей, не видать, чтоб ты чего то там получил при передачи поста
3 John83
 
25.06.25
09:22
(2) под get подразумевается вместо ОтправитьДляОбработки сделать Получить?
Этот запрос появляется после того, как нажимаю "получить пдф". Надо по-другому?
4 Ёпрст
 
гуру
25.06.25
09:45
(3) На вот, занимайся, всё работает

      
 Адрес = "roszdravnadzor.gov.ru";
		HTTPСоединение = Новый HTTPСоединение(Адрес,443,,,,,Новый ЗащищенноеСоединениеOpenSSL(),Ложь);
   		HTTPЗапрос = Новый HTTPЗапрос("services/turnover");
		Параметры="q_label=244857651&dt_from=01.01.2025&dt_to=&q_type_ls=&q_org=&q_dt_ru_from=&q_dt_ru_to=&q_no_ru=&q_tn=&q_mnn=&q_series=&q_producer=&q_country=&pdf=1";
	    HTTPЗапрос.УстановитьТелоИзСтроки(Параметры, "UTF-8");
		HTTPЗапрос.Заголовки.Вставить("accept-encoding", "gzip, deflate, br, zstd");
		HTTPЗапрос.Заголовки.Вставить("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7");
		HTTPЗапрос.Заголовки.Вставить("content-type", "application/x-www-form-urlencoded");
		HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос,"F:\data\123.pdf");
5 John83
 
25.06.25
10:10
(4) неа... так же скачивает хтмл-страницу в архиве 🤷‍♀️
А где тут GET?
6 Kongo2019
 
25.06.25
10:21
(0) У них по идее дожен быть блок открытые данные, там лежат файлы в виде XML или CSV.
Есть такое?
Или именно ПДФ надо?
7 John83
 
25.06.25
11:35
(6) я таких не вижу
8 John83
 
25.06.25
11:36
и кстати у ответа код 200
Разве в ответном файле не должна содержаться инфа по ошибке?
9 Garykom
 
гуру
25.06.25
12:18
1. Получить страницу
2. Заполнить поле поиска
3. Нажать кнопочку с лупой
4. Будет две ссылки xls и pdf

Через HTTPСоединение это нереально, советую через ПолеHTML документа делать
10 Ёпрст
 
гуру
25.06.25
12:45
(5) чего неа? Я ж проверил, перед тем как постить
11 Ёпрст
 
гуру
25.06.25
12:46
И какой нах архив? Код целиком копи пасте. Только путь до пдф файла на свой поменяй
12 John83
 
25.06.25
12:55
(11) так и сделал
если что 8.3.25.1520
13 Ёпрст
 
гуру
25.06.25
12:59
(12)и ?
14 John83
 
25.06.25
13:01
(13) качает архив, внутри страничка
15 John83
 
25.06.25
13:06
(9) есть рабочий код под питон. Почему нельзя сделать так же под 1с?
16 John83
 
25.06.25
13:06
import requests
import logging
import os
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

# --- Параметры препарата (указываем здесь!) ---
drug_name = "гелофузин"         # Название препарата
series_number = "244857651"     # Номер серии
mnn = ""
# --- Константы ---
save_folder = r"C:\Users\Иван\Downloads"  # Папка сохранения
safe_drug_name = drug_name.replace(" ", "")  # Заменяем пробелы на ""
save_filename = f"Выписка_{safe_drug_name}.pdf"
save_path = os.path.join(save_folder, save_filename)

# --- Логирование ---
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    handlers=[
        logging.FileHandler("download_log.txt", encoding="utf-8"),
        logging.StreamHandler()
    ]
)

def download_pdf():
    url = "https://roszdravnadzor.gov.ru/services/turnover"
    headers = {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.7",
        "Accept-Encoding": "gzip, deflate, br, zstd",
        "Accept-Language": "ru,en;q=0.9,en-GB;q=0.8,en-US;q=0.7",
        "Cache-Control": "max-age=0",
        "Connection": "keep-alive",
        "Content-Type": "application/x-www-form-urlencoded",
        "Origin": "https://roszdravnadzor.gov.ru" ,
        "Referer": "https://roszdravnadzor.gov.ru/" ,
        "Sec-Fetch-Dest": "document",
        "Sec-Fetch-Mode": "navigate",
        "Sec-Fetch-Site": "same-origin",
        "Sec-Fetch-User": "?1",
        "Upgrade-Insecure-Requests": "1",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0",
        "Cookie": "uid=434360480391640124; sp_test=1; sputnik_session=1746516644741|3",
    }

    payload = {
        "q_label": drug_name,
        "dt_from": "",
        "dt_to": "",
        "q_type_ls": "",
        "q_org": "",
        "q_dt_ru_from": "",
        "q_dt_ru_to": "",
        "q_no_ru": "",
        "q_tn": "",
        "q_mnn": mnn,
        "q_series": series_number,
        "q_producer": "",
        "q_country": "",
        "pdf": "1",
    }

    # Сессия с повторами
    session = requests.Session()
    retries = Retry(
        total=3,
        backoff_factor=2,
        status_forcelist=[429, 500, 502, 503, 504],
        allowed_methods=["POST"]
    )
    adapter = HTTPAdapter(max_retries=retries)
    session.mount("https://", adapter)
    session.mount("http://", adapter)

    try:
        logging.info("Отправка POST-запроса на %s", url)
        response = session.post(url, headers=headers, data=payload, timeout=(10, 60))

        if response.status_code == 200:
            if response.headers.get('Content-Type') == 'application/pdf':
                with open(save_path, "wb") as f:
                    f.write(response.content)
                logging.info("Файл успешно сохранён: %s", save_path)
            else:
                logging.error("Ожидался PDF, но пришло: %s", response.headers.get('Content-Type'))
        else:
            logging.error("Ошибка при скачивании файла: статус %s", response.status_code)

    except requests.exceptions.RequestException as e:
        logging.exception("Ошибка при выполнении запроса: %s", str(e))


download_pdf()
17 Ёпрст
 
гуру
25.06.25
13:22
(14) пиз..шь
18 Ёпрст
 
гуру
25.06.25
13:23
Нет там архива.
19 Ёпрст
 
гуру
25.06.25
13:24
Там скачивается pdf в каталог "F:\data\123.pdf"
Дарю:
Ctrl+C Ctrl+V
Ctrl+Ins Shift+Ins
20 Kongo2019
 
25.06.25
13:31
21 John83
 
25.06.25
13:34
(17) даже на другом серваке пробовал
22 John83
 
25.06.25
13:35
(18) а что у тебя в ответе для "Content-Type"?
23 John83
 
25.06.25
13:37
(20) ммм...
можно оставить на крайний случай
Но это надо каждый день обновлять файлы.
24 Ёпрст
 
гуру
25.06.25
13:43
(21) не верю. Покажи свой код
25 Ёпрст
 
гуру
25.06.25
13:47
(22)
На
26 Ёпрст
 
гуру
25.06.25
13:48
И это ,  "/ " убери в первой строке кода в адресе
27 Ёпрст
 
гуру
25.06.25
13:50
Я ж говорю, учись копипастить, пока не поздно!
28 John83
 
25.06.25
14:49
(26) это увидел, но ничего не поменялось
29 Ёпрст
 
гуру
25.06.25
14:55
(28) не верю..
30 Ёпрст
 
гуру
25.06.25
15:00
Поди запускаешь всё время старую версию своей кривой поделки.
31 Мультук
 
гуру
25.06.25
15:03
(29)
Ради интереса - проверил.
Подтверждаю - код рабочий.

1) Скопировал твой код в форму обработки
Переименовал переменную "параметры", ибо в форме уже есть :-)
2) Файловая база, УФ, 8.3.25.1546

Файлик C:\123\123.pdf получил.
И да -- это PDF.


P.S.
Возможно, у него обработка УЖЕ добавлена в доп.обработки
А по быстрому он открывает через Файл->Открыть
32 Garykom
 
гуру
25.06.25
17:11
(15) Задолбаешься исправлять когда страничку изменят
Например там будет одностраничник с кучей JS кода

С подобных сайтов без вменяемого апи нормально парсить только через полноценный браузер
33 John83
 
25.06.25
17:45
во!
запустил из УТ11 - там взлетело
До этого пытался на УТ10 - там режим совместимости "Версия 8.2.13". В этом проблема?
Как обойти?
34 Ёпрст
 
гуру
25.06.25
18:22
(33) отправлять через WinHttps разве что