covid-formity/shipping/dpd.py

62 lines
1.9 KiB
Python

import requests
import bs4
import re
class DPD:
def __init__(self, app):
self.session = requests.Session()
self.session.headers.update({
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0',
})
self.regexes = {
'booked': r'Zarejestrowano dane przesyłki, przesyłka jeszcze nienadana',
'collected': r'Przesyłka odebrana przez Kuriera',
'inDelivery': r'Wydanie przesyłki do doręczenia',
'delivered': r'Przesyłka doręczona Odbiorca: .*',
}
def authenticate(self):
pass
def shipment_info(self, id):
resp = self.session.post('https://tracktrace.dpd.com.pl/findPackage', data={
'q': id,
'typ': '1',
})
resp.raise_for_status()
soup = bs4.BeautifulSoup(resp.text, features="html5lib")
statuses = []
tracking = {
'statuses': statuses,
'booked': None,
'collected': None,
'inDelivery': None,
'delivered': None,
}
for row in soup.find(class_='table-track').find('tbody').findAll('tr'):
cols = [item.get_text(' ', strip=True).replace('\xa0', ' ') for item in row.findAll('td')]
status = {
'timestamp': '%s %s' % (cols[0], cols[1]),
'description': cols[2],
'location': cols[3],
}
for k, r in self.regexes.items():
if tracking[k] is None and re.match(r, status['description']):
tracking[k] = status['timestamp']
statuses.append(status)
return {
'numberParcel': id,
'tracking': tracking,
}
if __name__ == '__main__':
d = DPD(None)
d.authenticate()
import pprint
pprint.pprint(d.shipment_info('xxxxxxxxxx'))