Задать вопрос
  • Как сделать POST запрос через Postman для сервиса отдачи информации и документов, размещенных на официальном сайте ЕИС?

    @kreatiffchik
    1. По ограничениям проскакивала информация о 5000 запросов в час. Как на деле - не знаю. Выкачиваю дважды в день по всем регионам архивы 44-фз и 223-фз - в лимит не упираюсь.
    2. Лотерея. У меня стоит пауза между получением ссылки и скачиванием архива. В основной своей массе качаются через 5 секунд, порядка 5-10 не качаются через 5 секунд. Тогда снова запрос отправляется.
    3. Здесь не подскажу.
    Написано
  • Как сделать POST запрос через Postman для сервиса отдачи информации и документов, размещенных на официальном сайте ЕИС?

    @kreatiffchik
    Токен всё равно вам нужен. Принципиально от юрлица делать? Проще получить токен физлица и через него. По крайней мере работает.

    Попробуйте мой локальный код для получения архивов информации по контрактам.

    - скачивается в папку data на рабочий стол
    - архивы скачиваются по всем регионам, либо оставьте только нужные
    - в коде даты поления информации с 01.01.2025 по 16.01.2025 - меняете на произвольные и нужные вам
    - применена структура имитации браузера, сыплет ошибками, не правил, но на скачивание не влияет
    - есть функция "докачивая" архива, если он не скачался с первого раза (не успел сформироваться)
    - токен свой вставьте в соответствующиую строку

    import requests
    import os
    import uuid
    import time
    from datetime import datetime, timedelta
    import random
    import string
    
    # Данные для работы
    service_url = "https://int44.zakupki.gov.ru/eis-integration/services/getDocsIP"
    token = "твой токен"
    
    # Путь для сохранения архива
    save_path = r"C:\\Users\\123\\Desktop\\data"
    
    # XML-шаблон SOAP-запроса
    soap_request_template = """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://zakupki.gov.ru/fz44/get-docs-ip/ws">
        <soapenv:Header>
            <individualPerson_token>{token}</individualPerson_token>
        </soapenv:Header>
        <soapenv:Body>
            <ws:getDocsByOrgRegionRequest>
                <index>
                    <id>{request_id}</id>
                    <createDateTime>{create_date}</createDateTime>
                    <mode>PROD</mode>
                </index>
                <selectionParams>
                    <orgRegion>{region}</orgRegion>
                    <subsystemType>{subsystem_type}</subsystemType>
                    <documentType44>{document_type}</documentType44>
                    <periodInfo>
                        <exactDate>{exact_date}</exactDate>
                    </periodInfo>
                </selectionParams>
            </ws:getDocsByOrgRegionRequest>
        </soapenv:Body>
    </soapenv:Envelope>"""
    
    # Функция создания SOAP-запроса
    def create_soap_request(region, subsystem_type, document_type, exact_date):
        request_id = str(uuid.uuid4())
        create_date = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
        return soap_request_template.format(token=token, request_id=request_id, create_date=create_date,
                                           region=region, subsystem_type=subsystem_type,
                                           document_type=document_type, exact_date=exact_date)
    
    # Функция отправки SOAP-запроса
    def send_soap_request(region, subsystem_type, document_type, exact_date, retries=3, delay=10):
        headers = {"Content-Type": "text/xml; charset=utf-8"}
        data = create_soap_request(region, subsystem_type, document_type, exact_date)
        
        for attempt in range(retries):
            try:
                print(f"[DEBUG] Попытка {attempt + 1}: отправка SOAP-запроса...")
                response = requests.post(service_url, headers=headers, data=data, verify=False)
                response.raise_for_status()
                return response.text
            except Exception as e:
                print(f"[WARNING] Ошибка: {e}. Повторная попытка через {delay} сек...")
                time.sleep(delay)
        return ""
    
    # Функция для генерации 5-символьного уникального постфикса
    def generate_unique_suffix(length=5):
        return ''.join(random.choices(string.ascii_letters + string.digits, k=length))
    
    # Функция скачивания архивов по всем ссылкам
    def download_archives(response, region_code, subsystem, document_type, exact_date, token):
        archive_urls = []
        start_idx = 0
    
        # Извлечение всех ссылок на архивы из ответа
        while "<archiveUrl>" in response[start_idx:]:
            start_idx = response.find("<archiveUrl>", start_idx) + len("<archiveUrl>")
            end_idx = response.find("</archiveUrl>", start_idx)
            archive_urls.append(response[start_idx:end_idx])
    
        if not archive_urls:
            print("[INFO] Ссылки на архивы отсутствуют в ответе.")
            return
    
        print(f"[INFO] Найдено {len(archive_urls)} ссылок на архивы.")
        failed_downloads = []
        
        for idx, archive_url in enumerate(archive_urls, start=1):
            unique_suffix = generate_unique_suffix()  # Генерация уникального постфикса
            archive_name = f"{region_code}_{subsystem}_{document_type}_{exact_date}_part{idx}_{unique_suffix}.zip"
            print(f"[INFO] Скачиваем архив #{idx}: {archive_url}")
            success = download_archive(archive_url, archive_name, token)
            if not success:
                failed_downloads.append((archive_url, archive_name))
        
        # Повторные попытки скачивания
        if failed_downloads:
            print(f"[INFO] Повторная попытка скачивания {len(failed_downloads)} архивов...")
            for archive_url, archive_name in failed_downloads:
                print(f"[INFO] Повторно скачиваем: {archive_name}")
                download_archive(archive_url, archive_name, token)
    
    # Функция скачивания архива
    def download_archive(archive_url, archive_name, token):
        headers = {"individualPerson_token": token}
        file_path = os.path.join(save_path, archive_name)
    
        os.makedirs(save_path, exist_ok=True)  # Создаём папку, если её нет
    
        print("[INFO] Ждём 5 секунд перед скачиванием...")
        time.sleep(5)
        try:
            response = requests.get(archive_url, headers=headers, stream=True, verify=False, timeout=60)
            response.raise_for_status()
            save_file(response, file_path)
            print(f"[SUCCESS] Архив успешно скачан: {file_path}")
            return True
        except Exception as e:
            print(f"[ERROR] Ошибка при скачивании: {e}")
        return False
    
    # Сохранение файла
    def save_file(response, file_path):
        with open(file_path, "wb") as file:
            for chunk in response.iter_content(chunk_size=8192):
                file.write(chunk)
    
    # Основной процесс
    def main():
        subsystem_types = ["RGK"]
        document_types = ["contract"]
    
        # Диапазон дат для обработки
        start_date = datetime(2025, 1, 1)
        end_date = datetime(2025, 1, 16)
        date_range = [(start_date + timedelta(days=i)).strftime('%Y-%m-%d') for i in range((end_date - start_date).days + 1)]
    
        regions = {"01": "Адыгея Республика",
        "02": "Башкортостан Республика",
        "03": "Бурятия Республика",
        "04": "Алтай Республика",
        "05": "Дагестан Республика",
        "06": "Ингушетия Республика",
        "07": "Кабардино-Балкарская Республика",
        "08": "Калмыкия Республика",
        "09": "Карачаево-Черкесская Республика",
        "10": "Карелия Республика",
        "11": "Коми Республика",
        "12": "Марий Эл Республика",
        "13": "Мордовия Республика",
        "14": "Саха (Якутия) Республика",
        "15": "Северная Осетия - Алания Республика",
        "16": "Татарстан Республика",
        "17": "Тыва Республика",
        "18": "Удмуртская Республика",
        "19": "Хакасия Республика",
        "20": "Чеченская Республика",
        "21": "Чувашская Республика - Чувашия",
        "22": "Алтайский Край",
        "23": "Краснодарский Край",
        "24": "Красноярский Край",
        "25": "Приморский Край",
        "26": "Ставропольский Край",
        "27": "Хабаровский Край",
        "28": "Амурская Область",
        "29": "Архангельская Область",
        "30": "Астраханская Область",
        "31": "Белгородская Область",
        "32": "Брянская Область",
        "33": "Владимирская Область",
        "34": "Волгоградская Область",
        "35": "Вологодская Область",
        "36": "Воронежская Область",
        "37": "Ивановская Область",
        "38": "Иркутская Область",
        "39": "Калининградская Область",
        "40": "Калужская Область",
        "41": "Камчатский Край",
        "42": "Кемеровская область - Кузбасс Область",
        "43": "Кировская Область",
        "44": "Костромская Область",
        "45": "Курганская Область",
        "46": "Курская Область",
        "47": "Ленинградская Область",
        "48": "Липецкая Область",
        "49": "Магаданская Область",
        "50": "Московская Область",
        "51": "Мурманская Область",
        "52": "Нижегородская Область",
        "53": "Новгородская Область",
        "54": "Новосибирская Область",
        "55": "Омская Область",
        "56": "Оренбургская Область",
        "57": "Орловская Область",
        "58": "Пензенская Область",
        "59": "Пермский Край",
        "60": "Псковская Область",
        "61": "Ростовская Область",
        "62": "Рязанская Область",
        "63": "Самарская Область",
        "64": "Саратовская Область",
        "65": "Сахалинская Область",
        "66": "Свердловская Область",
        "67": "Смоленская Область",
        "68": "Тамбовская Область",
        "69": "Тверская Область",
        "70": "Томская Область",
        "71": "Тульская Область",
        "72": "Тюменская Область",
        "73": "Ульяновская Область",
        "74": "Челябинская Область",
        "75": "Забайкальский Край",
        "76": "Ярославская Область",
        "77": "Москва Город",
        "78": "Санкт-Петербург Город",
        "79": "Еврейская Автономная область",
        "83": "Ненецкий Автономный округ",
        "86": "Ханты-Мансийский Автономный округ - Югра Автономный округ",
        "87": "Чукотский Автономный округ",
        "89": "Ямало-Ненецкий Автономный округ",
        "90": "Запорожская Область",
        "91": "Крым Республика",
        "92": "Севастополь Город",
        "93": "Донецкая Народная Республика",
        "94": "Луганская Народная Республика",
        "95": "Херсонская Область"
    }
    
        for region_code, region_name in regions.items():
            print(f"\n=== Обрабатываем регион {region_code} - {region_name} ===")
            for exact_date in date_range:
                for subsystem in subsystem_types:
                    for document_type in document_types:
                        print(f"\nПробуем subsystemType: {subsystem}, documentType44: {document_type}, Дата: {exact_date}")
                        response = send_soap_request(region_code, subsystem, document_type, exact_date)
                        if response:
                            download_archives(response, region_code, subsystem, document_type, exact_date, token)
                        else:
                            print("[INFO] Ответ сервера пустой или невалидный.")
    
    if __name__ == "__main__":
        main()
    Написано
  • Как сделать POST запрос через Postman для сервиса отдачи информации и документов, размещенных на официальном сайте ЕИС?

    @kreatiffchik
    Евгений, спасибо! Сохраню, если IP работать не будет и тоже через организацию проведу) Своё решение под своим комментом оставлю завтра после теста..
    Написано
  • Как сделать POST запрос через Postman для сервиса отдачи информации и документов, размещенных на официальном сайте ЕИС?

    @kreatiffchik
    Евгений, я сейчас получаю данные по 44-ФЗ через getDocsIP, пока в тестах. В любом случае интересно, пишите конечно)

    Данные по 223 не получаю пока, 44 приоритетней, но тоже займусь 223 после НГ уже..
    Написано
  • Как сделать POST запрос через Postman для сервиса отдачи информации и документов, размещенных на официальном сайте ЕИС?

    @kreatiffchik
    lon28, сейчас проверил ссылку, полученную сутки назад - файл скачивает.

    Проверьте сами, ссылка от 10 декабря: https://int44.zakupki.gov.ru/dstore/le2/download/P...
    Написано
  • Как сделать POST запрос через Postman для сервиса отдачи информации и документов, размещенных на официальном сайте ЕИС?

    @kreatiffchik
    1. Внезапно хороший человек опубликовал библиотеку и даже её недавно обновил для работы с сервисом отдачи информации: https://pypi.org/project/dars/
    Библиотеку ещё не испытывал, но пусть будет лучше здесь.

    2. Получается с завидным постоянством получать данные через сервис getDocsLE2 с токеном. Пример кода (чувствительные данные зачищены):

    import requests
    import os
    import uuid
    from datetime import datetime
    
    
    service_url = "https://int44.zakupki.gov.ru/eis-integration/services/getDocsLE2"
    token = "ваш_токен"
    save_path = r"путь для сохранения архива"
    
    #SOAP-запрос
    soap_request_template = """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://zakupki.gov.ru/fz44/get-docs-le/ws">
        <soapenv:Header>
            <token>{token}</token>
        </soapenv:Header>
        <soapenv:Body>
            <ws:getDocsByOrgRegionRequest>
                <index>
                    <id>{request_id}</id>
                    <createDateTime>{create_date}</createDateTime>
                    <mode>PROD</mode>
                </index>
                <selectionParams>
                    <orgRegion>38</orgRegion>
                    <subsystemType>PRIZ</subsystemType>
                    <documentType44>epNotificationEZK2020</documentType44>
                    <periodInfo>
                        <exactDate>2024-11-28</exactDate>
                    </periodInfo>
                </selectionParams>
            </ws:getDocsByOrgRegionRequest>
        </soapenv:Body>
    </soapenv:Envelope>"""
    
    # Функция для создания запроса
    def create_soap_request():
        request_id = str(uuid.uuid4())
        create_date = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
        return soap_request_template.format(token=token, request_id=request_id, create_date=create_date)
    
    # Функция для отправки SOAP-запроса
    def send_soap_request():
        headers = {
            "Content-Type": "text/xml; charset=utf-8",
        }
        data = create_soap_request()
        response = requests.post(service_url, headers=headers, data=data, verify=False)
        response.raise_for_status()
        return response.text
    
    # Функция для загрузки архива
    def download_archive(archive_url, archive_name):
        headers = {
            "User-Agent": "Mozilla/5.0"
        }
        try:
            with requests.Session() as session:
                response = session.get(archive_url, headers=headers, stream=True, verify=False)
                response.raise_for_status()
    
                # Сохраняем файл
                file_path = os.path.join(save_path, archive_name)
                with open(file_path, "wb") as file:
                    for chunk in response.iter_content(chunk_size=8192):
                        file.write(chunk)
    
                print(f"Архив скачан: {file_path}")
        except requests.exceptions.HTTPError as http_err:
            print(f"HTTP ошибка при загрузке: {http_err}")
        except Exception as err:
            print(f"Ошибка при загрузке архива: {err}")
    
    # Исполнение
    def main():
        try:
            print("Отправляем запрос к серверу для формирования архива...")
            response = send_soap_request()
            print("Ответ сервера:")
            print(response)
    
            if "<archiveUrl>" in response:
                archive_url_start = response.find("<archiveUrl>") + len("<archiveUrl>")
                archive_url_end = response.find("</archiveUrl>")
                archive_url = response[archive_url_start:archive_url_end]
                print(f"Ссылка на архив: {archive_url}")
    
                # Извлекаем данные для имени файла
                id_start = response.find("<id>") + len("<id>")
                id_end = response.find("</id>")
                archive_id = response[id_start:id_end]
    
                date_start = response.find("<createDateTime>") + len("<createDateTime>")
                date_end = response.find("</createDateTime>")
                create_date = response[date_start:date_end].replace(":", "-")
    
                archive_name = f"epNotificationEZK2020_{create_date}_{archive_id}.zip"
    
                print("Загрузка архива...")
                if not os.path.exists(save_path):
                    os.makedirs(save_path)
    
                download_archive(archive_url, archive_name)
            else:
                print("Ссылка отсутствует")
        except Exception as e:
            print(f"Произошла ошибка: {e}")
    
    if __name__ == "__main__":
        main()


    Методом проб и ошибок выяснил, как архив сохранять локально (имитировать браузер).

    Пока работает так, с участием токена
    Написано
  • Как сделать POST запрос через Postman для сервиса отдачи информации и документов, размещенных на официальном сайте ЕИС?

    @kreatiffchik
    as4ss, в ТГ на канале закупок из последнего:

    Открытие регистрации получателей сведений в сервисах отдачи информации и документов в машиночитаемом виде

    Стали доступны сервисы отдачи информации и документов в машиночитаемом виде:

    getDocsIP — сервис для физических лиц
    getDocsLE — сервис для юридических лиц

    Для работы с указанными сервисами получателям машиночитаемых данных необходимо пройти регистрацию и авторизацию с использованием единой системы идентификации и аутентификации.
    Написано
  • Как сделать POST запрос через Postman для сервиса отдачи информации и документов, размещенных на официальном сайте ЕИС?

    @kreatiffchik
    Евгений, вот, нашёл в документации от 18 ноября которая.

    Сервис доступен временно на период перехода

    Скрин:

    674edbb59ed0b666933202.png
    Написано
  • Как сделать POST запрос через Postman для сервиса отдачи информации и документов, размещенных на официальном сайте ЕИС?

    @kreatiffchik
    Евгений, вот тоже: https://zakupki.gov.ru/epz/main/public/news/news_p...

    Я так понял, что сейчас getDocsLE2 пробный, а дальше только с регистрацией по токену. К токену тут же в последней документации добавился ещё и сертификат.

    Вообще неудивительно безобразие в ЕИС такое. Перемудрили знатно..
    Написано
  • Как сделать POST запрос через Postman для сервиса отдачи информации и документов, размещенных на официальном сайте ЕИС?

    @kreatiffchik
    Евгений, видел где-то в документации на сайте ЕИС, но не там, где альбомы. Есть ссылка с 1С, где это тоже указано. Наверняка оттуда тоже взяли: https://v8.1c.ru/news/vyshla-novaya-versiya-1-3-50...

    Поищу, где видел. Беглый поиск пока результатов не дал..
    Написано
  • Как сделать POST запрос через Postman для сервиса отдачи информации и документов, размещенных на официальном сайте ЕИС?

    @kreatiffchik
    Евгений, Сервис getDocsLE2 будет открытым до 01.01.2025. После он будет доступен только после авторизации через ЕСИА.

    Имеет смысл сразу ориентироваться на худший вариант - токен, авторизация, ключи... До 1 января и FTP работает нормально, зачем getDocsLE2 использовать, если он всё равно работать не будет нормально..
    Написано
  • Как лучше посмотреть бэкап форума?

    @kreatiffchik Автор вопроса
    Syschel, сразу и начинается с "(3268, 54, 'AVK',...) - начало самое указал.

    Название бэкапа произвольное было, расширение же указал - txt..
  • Настройка DNS на ISPmanager у sweb.ru?

    @kreatiffchik Автор вопроса
    Спасибо!..
  • Настройка DNS на ISPmanager у sweb.ru?

    @kreatiffchik Автор вопроса
    Sanes, да, добавил через их панель управления и вроде заработало. Протестирую позже подробно. Спасибо!..
  • Настройка DNS на ISPmanager у sweb.ru?

    @kreatiffchik Автор вопроса
    Хостер также ответил следующее:

    Как мы видим, для домена ktoirkutsk.ru не указаны NS-записи и А-запись:

    ~$ dig ktoirkutsk.ru NS +short
    ~$

    ~$ host ktoirkutsk.ru
    Host ktoirkutsk.ru not found: 2(SERVFAIL)

    Пожалуйста, проверьте конфигурацию в Панели регистратора домена.

    У регистратора днс sweb указаны уже больше суток. От предыдущего сервера домен отклеился уже давно..