Skip to content

Instantly share code, notes, and snippets.

@e1ectr0cut1e
Last active July 30, 2016 17:27
Show Gist options
  • Select an option

  • Save e1ectr0cut1e/f627c0aa993b2015d126 to your computer and use it in GitHub Desktop.

Select an option

Save e1ectr0cut1e/f627c0aa993b2015d126 to your computer and use it in GitHub Desktop.
ukrposhta.ua tracking script
#!/usr/bin/python2
# -*- coding: utf-8 -*-
from sys import stdout, stderr, exit, argv
from codecs import getwriter
from signal import signal, SIGINT
from urllib import urlencode
from urllib2 import build_opener, HTTPCookieProcessor, Request
from cookielib import CookieJar
from bs4 import BeautifulSoup
opener = build_opener(HTTPCookieProcessor(CookieJar()))
base_url = "http://services.ukrposhta.ua/bardcodesingle"
default_url = "/default.aspx"
data_url = "/DownloadInfo.aspx"
def get_form_values(html, barcode):
soup = BeautifulSoup(html, "html5lib")
result = {
'ctl00$centerContent$scriptManager': 'ctl00$centerContent$scriptManager',
'__EVENTTARGET': '',
'__EVENTARGUMENT': '',
'__VIEWSTATE': soup.find("input", {"name": "__VIEWSTATE"})['value'],
'__VIEWSTATEGENERATOR': soup.find("input", {"name": "__VIEWSTATEGENERATOR"})['value'],
'ctl00$centerContent$txtBarcode': barcode,
'__ASYNCPOST': 'true',
'ctl00$centerContent$btnFindBarcodeInfo': 'Пошук'
}
return result
def parse_result(html):
soup = BeautifulSoup(html, "html5lib")
return soup.find("div", {"id": "ctl00_centerContent_divInfo"}).text
def main():
sout = getwriter("utf8")(stdout)
serr = getwriter("utf8")(stderr)
if (len(argv) < 2):
serr.write('Please provide the tracking number as an argument\n')
exit(1)
headers = {
'Referer': 'http://services.ukrposhta.ua/bardcodesingle/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36',
'X-MicrosoftAjax': 'Delta=true'
}
for track_num in argv[1:]:
print track_num
data = get_form_values(opener.open(base_url + default_url).read(), track_num)
opener.open(Request(base_url + default_url, data=urlencode(data), headers=headers)).read()
result = parse_result(opener.open(base_url + data_url + '?id=' + track_num).read())
sout.write(result + "\n")
if __name__ == "__main__":
def signal_handler(signal, frame):
exit(0)
signal(SIGINT, signal_handler)
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment