Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Играйте в Длинные и Короткие нарды онлайн! Наслаждайтесь классической настольной игрой с простыми правилами и захватывающей стратегией. Бросайте кубики, перемещайте шашки и обыгрывайте своего соперника. Играйте прямо сейчас бесплатно!

Нарды Длинные и Короткие онлайн

Настольные, Для двоих, Пошаговая

Играть

Топ прошлой недели

  • solenakrivetka solenakrivetka 7 постов
  • Animalrescueed Animalrescueed 53 поста
  • ia.panorama ia.panorama 12 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая «Подписаться», я даю согласие на обработку данных и условия почтовых рассылок.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
0 просмотренных постов скрыто
14
SyrnikovPavel
SyrnikovPavel
Программирование на python

Как автоматизировать работу с zakupki.gov.ru с помощью Python — просто и понятно⁠⁠

11 месяцев назад

Эта статья написана для начинающих пользователей, которые хотят разобраться в работе сервиса отдачи информации zakupki.gov.ru. Мы шаг за шагом разберем, как получить токен для физического лица, как выглядит XML-документ для запроса и как написать простую программу на Python для взаимодействия с сервисом. Это не руководство от профессионала, а скорее дневник выживания: как не сойти с ума, пока пытаешься подружиться с сервисом zakupki.gov.ru

С 1 января 2025 года доступ к FTP-серверу zakupki.gov.ru будет закрыт, и вся информация станет доступна только через сервисы отдачи данных. До этой даты физические лица могут получать общедоступную информацию через сервис https://int44.zakupki.gov.ru/eis-integration/services/getDocsLE2 без необходимости использовать токены или электронную цифровую подпись (ЭЦП). Однако с нового года работа с сервисом потребует токенов или настройки инфраструктуры для подписания запросов ЭЦП.

Открытые данные закупок — это мощный инструмент для анализа, прозрачности государственного управления и создания полезных сервисов, как коммерческих, так и общественных. Например, на их основе можно анализировать расходы государства, выявлять нарушения или автоматизировать поиск тендеров. Ранее доступ был через FTP-сервер, сейчас данную возможность закрывают, а вместо него предлагается получать данные по протоколу SOAP. У меня нет технического образования и складывается такое ощущение, что государство хочет таким ненавязчивым способом восполнить пробелы в моих знаниях.

SOAP (Simple Object Access Protocol) — это протокол обмена данными, при котором запросы и ответы представляют собой строго структурированные XML-документы. Для многих разработчиков (включая меня) это может быть первое знакомство с этим протоколом. Более того, практическая информация по работе с SOAP и конкретно с сервисом закупок zakupki.gov.ru представлена в сети крайне ограниченно.

Структура статьи:

  1. Получение токена для работы с сервисом

  2. Структура xml-документа

  3. Пример программы на python

Получение токена для работы с сервисом

Получить токен можно следуя инструкции "ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ СЕРВИСОВ ОТДАЧИ ИНФОРМАЦИИ ЕИС ДЛЯ ЮРИДИЧЕСКИХ И ФИЗИЧЕСКИХ ЛИЦ", размещенном на zakupki.gov.ru. Но для того, чтобы не открывать лишних окон, вкратце опишу процесс здесь:

  1. Нужно перейти по адресу: https://zakupki.gov.ru/pmd/auth/welcome (естественно через поддерживаемый браузер).

  2. Проходим авторизацию через Госуслуги, выбираем "Регистрация нового потребителя машиночитаемых данных", далее "Физическое лицо, индивидуальный предприниматель", заполняем все сведения, отправляем запрос и происходит перенаправление на новую страницу с токеном.

  3. Готово! Сохраняем токен в надежное место

Пример токена: 5d035886-82af-4f98-8a74-278bf72ff457 (был указан в инструкции, не работающий)

Пример токена: 5d035886-82af-4f98-8a74-278bf72ff457 (был указан в инструкции, не работающий)

Структура xml-документа

Формирование правильного XML-документа — одна из главных сложностей при работе с сервисом. Любая ошибка, например, нарушение порядка тегов или отсутствие обязательного параметра, может привести к некорректному ответу сервера. Сервер либо возвращает сообщение об ошибке («Ошибка валидации полученного запроса по интеграционной схеме»), либо повторяет отправленный запрос без обработки.

Основные требования к XML-документам

  1. Порядок тегов имеет значение. Это может быть неочевидно для начинающих, но даже малейшее отклонение от порядка, описанного в интеграционной схеме, вызовет ошибку.

  2. Каждый запрос должен содержать токен. Его необходимо указывать в элементе внутри.

  3. Использование метода. Название метода запроса указывается в внутри.

  4. Обязательные параметры для каждого метода. Список обязательных параметров для каждого метода можно найти в интеграционной схеме https://int44.zakupki.gov.ru/eis-integration/services/getDocsIP?xsd=getDocsIP-ws-api.xsd

Создание идеального XML — это как готовить торт: ингредиенты строго по списку, порядок добавления важен, а итоговая структура должна быть идеальной

Поддерживаемые методы:

  • getDocsByReestrNumberRequest – запрос формирования в ХД архивов с документами по реестровому номеру

  • getDocsByOrgRegionRequest – запрос формирования в ХД архивов с документами по региону заказчика и типу документа;

  • getDocSignaturesByUrlRequest – запрос формирования в ХД архивов с подписями документов;

  • getNsiRequest – запрос в хранилище документов (ХД) данных справочника

Далее я приведу пример работающего шаблона xml документа. Все взаимодействие с сервисом происходит через url https://int44.zakupki.gov.ru/eis-integration/services/getDocsIP. Для работы с этим сервисом каждый xml файл в soapenv:Header должен содержать элемент individualPerson_token со значение вашего токена. Пример:

<soapenv:Header>
<individualPerson_token>5d035886-82af-4f98-8a74-278bf72ff457</individualPerson_token>
</soapenv:Header>

В основной части направляется название метода и структурные элементы, которые ему соответствуют. Для каждого запроса должен быть index, в котором есть id, дата создания и режим работы сервиса (TEST или PROD, но лучше сразу PROD указывать). Пример:

<index>
<id>3f227a50-418d-47ea-a3f7-e9a85f3af6e7</id>
<createDateTime>2024-12-25T16:34:29</createDateTime>
<mode>PROD</mode>
</index>

И затем в selectionParams надо указать параметры отбора файлов.
Если мы используем getDocsByReestrNumberRequest, то надо указать тип подсистемы и реестровый номер. Пример:

<selectionParams>
<subsystemType>PRIZ</subsystemType>
<reestrNumber>0888200000224000038</reestrNumber>
</selectionParams>

В целом файл для метода getDocsByOrgRegionRequest будет выглядеть следующим образом:

<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>5d035886-82af-4f98-8a74-278bf72ff457</individualPerson_token> <!-- Здесь должен быть указан ваш токен -->
</soapenv:Header>
<soapenv:Body>
<ws:getDocsByOrgRegionRequest> <!-- Здесь указывается метод -->
<index> <!-- index принцип формирования был приведен ранее -->
<id>3f227a50-418d-47ea-a3f7-e9a85f3af6e7</id>
<createDateTime>2024-12-25T16:34:29</createDateTime>
<mode>PROD</mode>
</index>
<selectionParams> <!-- обратите внимание, для каждого метода будут свои параметры отбора, перечисленные в интеграционной схеме. Сохранение порядка параметров обязательно! -->
<subsystemType>PRIZ</subsystemType>
<reestrNumber>0888200000224000038</reestrNumber>
</selectionParams>
</ws:getDocsByOrgRegionRequest>
</soapenv:Body>
</soapenv:Envelope>

Для каждого метода существуют свои обязательные поля. Подробнее посмотреть обязательные параметры можно тут: https://int44.zakupki.gov.ru/eis-integration/services/getDocsIP?xsd=getDocsIP-ws-api.xsd. Порядок параметров важен!

Например, для метода getDocsByOrgRegionRequest я перепутал порядок и сначала у меня стоял subsystemType, а затем orgRegion и сервер выдавал ошибку несоответствия запросу интеграционной схеме. Пример правильного xml файла для этого метода:

<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>5d035886-82af-4f98-8a74-278bf72ff457</individualPerson_token>
</soapenv:Header>
<soapenv:Body>
<ws:getDocsByOrgRegionRequest>
<index>
<id>3f227a50-418d-47ea-a3f7-e9a85f3af6e8</id>
<createDateTime>2024-12-25T16:38:45</createDateTime>
<mode>PROD</mode>
</index>
<selectionParams>
<orgRegion>72</orgRegion>
<subsystemType>PRIZ</subsystemType>
<documentType44>epNotificationEF2020</documentType44>
<periodInfo>
<exactDate>2024-12-24</exactDate>
</periodInfo>
</selectionParams>
</ws:getDocsByOrgRegionRequest>
</soapenv:Body>
</soapenv:Envelope>

Пример программы на Python

Для отправки запроса и получения результата мы будем использовать python.
Для начала импортируем библиотеки, которые пригодятся в будущем:

import uuid
import datetime
import os
import requests
import xmltodict

Для автоматизированной отправки запросов для метода , сформируем шаблон xml файла, в котором будут автоматически из кода подставляться токен, ID и время запроса и назовем его test.xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://zakupki.gov.ru/fz44/get-docs-le/ws">
<soapenv:Header>
<individualPerson_token>{{ token }}</individualPerson_token>
</soapenv:Header>
<soapenv:Body>
<ws:getDocsByReestrNumberRequest>
<index>
<id>{{ UUID }}</id>
<createDateTime>{{ created_time }}</createDateTime>
<mode>PROD</mode>
</index>
<selectionParams>
<subsystemType>PRIZ</subsystemType>
<reestrNumber>0888200000224000038</reestrNumber>
</selectionParams>
</ws:getDocsByReestrNumberRequest>
</soapenv:Body>
</soapenv:Envelope>

Теперь нам надо получить заполненный шаблон:

file_path = 'test.xml' # расположение файла-шаблона
token = '5d035886-82af-4f98-8a74-278bf72ff457' # вставьте сюда ваше токен

with open(file_path, 'r', encoding='utf-8') as file:
xml_content = file.read()
generated_uuid = str(uuid.uuid4()) # уникальный id для запроса
generated_datetime = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%dT%H:%M:%S') # текущая дата
xml_data = xml_content.replace("{{ UUID }}", generated_uuid).replace("{{ created_time }}", generated_datetime).replace("{{ token }}", token) # заполнение шаблона

Далее нам остается только отправить данные на сервер:

url = 'https://int44.zakupki.gov.ru/eis-integration/services/getDoc...'
headers = {
'Content-Type': 'text/xml; charset=utf-8',
}
response = requests.post(url, data=xml_data, headers=headers, timeout=30)

В ответ мы получаем xml файл, в котором есть ссылка на архив. Пример ответа:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body>
<ns2:getDocsByOrgRegionResponse xmlns:ns2="http://zakupki.gov.ru/fz44/get-docs-ip/ws">
<index>
<id>8e5e2386-c1e9-499c-88e8-f23313667472</id>
<refId>e4858318-62c6-41c0-99a5-879cdc103b39</refId>
<createDateTime>2024-12-25T14:42:25.180</createDateTime>
<mode>PROD</mode>
</index>
<dataInfo>
<archiveUrl>ССЫЛКА</archiveUrl>
</dataInfo>
</ns2:getDocsByOrgRegionResponse>
</soap:Body></soap:Envelope>

Для парсинга xml воспользуемся библиотекой xmltodict и получим url архива:

response_content = xmltodict.parse(response.content)
url_archive = response_content['soap:Envelope']['soap:Body']['ns2:getDocsByOrgRegionResponse']['dataInfo']['archiveUrl']

Далее не совсем очевидный момент, который не отражен в инструкции. Для скачивания архива, нам также потребуется отправлять токен. Я долго не мог понять, почему архив так долго готовится и его нельзя скачать, пока не заметил, что в примере в инструкции в headers отправляется токен:

подчеркивание - это моя работа :)

подчеркивание - это моя работа :)

В самой инструкции об этом не слова и на мой взгляд это большое упущение. На python данный запрос будет выглядеть так:

headers = {
'individualPerson_token': token
}
response_get_archive = requests.get(url_archive, headers=headers, timeout=120)

И далее нам остается только сохранить архив:

with open('archive.zip', 'wb') as f:
f.write(response_get_archive.content)

Полный код программы:

import uuid
import datetime
import os
import requests
import xmltodict

file_path = 'test.xml'
token = '5d035886-82af-4f98-8a74-278bf72ff457' # вставьте сюда ваше токен

with open(file_path, 'r', encoding='utf-8') as file:
xml_content = file.read()
generated_uuid = str(uuid.uuid4())
generated_datetime = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%dT%H:%M:%S')
xml_data = xml_content.replace("{{ UUID }}", generated_uuid).replace("{{ created_time }}", generated_datetime).replace("{{ token }}", token)


url = 'https://int44.zakupki.gov.ru/eis-integration/services/getDoc...'
headers = {
'Content-Type': 'text/xml; charset=utf-8',
}
response = requests.post(url, data=xml_data, headers=headers, timeout=30)

response_content = xmltodict.parse(response.content)
url_archive = response_content['soap:Envelope']['soap:Body']['ns2:getDocsByOrgRegionResponse']['dataInfo']['archiveUrl']
headers = {
'individualPerson_token': token
}
response_get_archive = requests.get(url_archive, headers=headers, timeout=120)

with open('archive.zip', 'wb') as f:
f.write(response_get_archive.content)

Надеюсь данная статья послужит толчком для изучения протокола работы с SOAP и поможет разобраться с сервисом отдачи информации и документов zakupki.gov.ru

Показать полностью 3
[моё] Разработка Программа Zakupkigovru Python Гайд Программирование Длиннопост
9
Tango.Foxtrot

Продающие хештэги⁠⁠

2 года назад

Сегодня нужно было позвонить в службу Тех поддержки одного очень известного и достаточно популярного портала. Позвонил. Вопрос не решился, но дело не в этом.

Догадайтесь по картинке куда я звонил? :)

Продающие хештэги
[моё] Служба поддержки Портал Zakupkigovru
3
4038
Аноним
Аноним
Лига Госзакупок

Поменять подлокотник в авто? легко! 12 млн!⁠⁠

3 года назад

Нам же в него надо убрать телефонную трубку с проводом! кстати, что за авто?

Подождите как! мы же весной уже модернизировали подлокотник в этом же авто! и даже есть протокол о единственном участнике и победителе!

Что что вы говорите? в 2020 и 2019 тоже модернизировали? Ну не страшно! всё для фронта, всё для победы! Тем более что в прошлые годы модернизировали по 9млн... дешёвка!

Возникает закономерный вопрос - а как же они до этого справлялись? а никак - тоже модернизировали!

может там было другое авто? нет! из года в год одно и тоже ТЗ и одни и те же картинки!

успеваем подать заявку на этот год - финал через 2 дня!!

https://zakupki.gov.ru/223/purchase/public/purchase/info/com...


ссылка на поиск https://zakupki.gov.ru/epz/order/extendedsearch/results.html?searchString=модернизации+подлокотника&morphology=on

UPD: цена за 70 подлокотников

Показать полностью 6
Zakupki Zakupkigovru Отмывание денег Коррупция Длиннопост
211
ITworksGroup
ITworksGroup

Запись реального тендера на 5 с лишним мультов⁠⁠

6 лет назад
[моё] Тендер Госзакупки Росгвардия Нацгвардия Стрим Трансляция Zakupkigovru Видео
6
ITworksGroup
ITworksGroup

Госзакупки. Спецcчет. ЭП.⁠⁠

6 лет назад

Электронная подпись (ЭП) и спец. счет в государственных закупках - что это такое и как с этим работать.

[моё] Госзакупки Госзаказ Электронная подпись 44-фз Закупки Zakupkigovru Zakupki Видео
3
12
Scorpo
Scorpo
Лига Госзакупок

Главное что б материальчик дорого выглядел⁠⁠

7 лет назад
Главное что б материальчик дорого выглядел

Мои любимые заказчики и их очередное творение.

Закупки Госзакупки Zakupkigovru Техническое задание
6
22
filc25
filc25
Лига Госзакупок

Закупочки, закупочки)⁠⁠

7 лет назад
Закупочки, закупочки)

Пруф: http://zakupki.gov.ru/epz/order/notice/ea44/view/common-info...

Закупки Госзакупки Zakupkigovru
14
ILYA.SAKHA
ILYA.SAKHA

Internet Explorer обжора⁠⁠

10 лет назад
Сидел себе, работал, никого не трогал, случайно заглянул в диспетчер задач =0
Internet Explorer обжора
[моё] Internet Explorer Оперативная память Память Обжорство Zakupkigovru
17
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии