62 lines
1.9 KiB
Python
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'))
|