Трекер посылок УкрПочты (API + Python 3)

New York

Была поставлена задача написать трекер посылки для Укрпочты используя Python 3.6. Немного погуглив, нашел готовый вариант PHP, откуда я позаимствовал важную информацию нужную для подключения, а именно:

  1. guid — своего рода API ключ, который единый для всех fcc8d9e1-b6f9-438f-9ac8-b67ab44391dd
  2. barcode — трек номер (у каждой посылки он уникальный)
  3. culture — обязательное поле отвечающее за вывод информации на указанном языке.
  4. И сам адрес для связи с сервером http://services.ukrposhta.com/barcodestatistic/barcodestatistic.asmx?WSDL

Из полученной нами информации становится известно, что для формирования запроса к Укрпочте нам нужно использовать SOAP-протокол.

Есть 2 варианта как решить нашу задачу:

  1. Использовать модуль zeep и его возможность подключения по SOAP протоколу
  2. Использовать модуль urllib и получать XML файл напрямую по ссылке (с заранее прописанными данными)

Вариант #1

from zeep import Client

url = 'http://services.ukrposhta.ua/barcodestatistic/barcodestatistic.asmx?WSDL'
data = {'guid': 'fcc8d9e1-b6f9-438f-9ac8-b67ab44391dd', 'barcode': 'RC123456789UA', 'culture': 'en'}
client = Client(url)
result = client.service.GetBarcodeInfo(**data)

print(result)

Думаю, тут все понятно, создаем Client и передаем ему ссылку с аргументами. На выходе получаем XML файл через который можно получить всю нужную информацию (result[’barcode’], result[’code’] и т. д.)

Вариант #2

from urllib.request import urlopen
import xmltodict

file = urlopen('http://services.ukrposhta.ua/barcodestatistic/barcodestatistic.asmx/GetBarcodeInfo?guid=fcc8d9e1-b6f9-438f-9ac8-b67ab44391dd&barcode=RC123456789UA&culture=en')
data = file.read()
file.close()

data = xmltodict.parse(data)
print(data)

Во втором варианте мы использовали обычную библиотеку urllib, которая входит в базовый состав Python 3. С её помощью, мы отправили запрос используя API укрпочты с заранее прописанными данными. На выходе мы получаем XML который через библиотеку xmltodict конвертируем в словарь. А дальше по накатанной (data[’BarcodeInfoService’][’barcode’], data[’BarcodeInfoService’][’code’] и т. д.)

Возможно для кого-то эти 5-10 строк кода покажутся простыми, но для меня они обернулись в многочасовые поиски решения задачи :D


UPD от Mikhail Neradkov c массовой порверки из yaml:

from urllib.request import urlopen
import xmltodict
import yaml

config = yaml.safe_load(open(’conf/tracking.yaml’))

for order_id, t in config[’tracking’].items():
file = urlopen(config[’url’]%(config[’guid’], t, config[’lang’]))
data = file.read()
file.close()
data = xmltodict.parse(data)
print(’Order #%s: %s’%(order_id, data[’BarcodeInfoService’][’eventdescription’]))
comments powered by Disqus