Pull to refresh

Автоматизируем проверку трекинга почты России

Reading time 2 min
Views 14K
Надоело нудно выбирать из списка нужный трек?
Не работают сторонние треккеры?
Тогда мы идём к вам! ©

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

Результат изысков

Гугление на предмет готовых скриптов показало, что после смены «политики партии», большинство из них работать отказывается. Каково же было моё радостное удивление, когда ссылка к старому доброму info.russianpost.ru/servlet сработала! В итоге получился наколенный скрипт на питоне, проверяющий треки из файла и формирующий страничку с результатами — ссылкой на on-line проверку и последним действием с посылкой для наглядности.

Всё предельно просто:
* Читаем трек-номера из файла
* Для каждого номера парсим HTML и выбираем предпоследнюю строку таблицы (если она есть) статуса
* Формируем и записываем результирующий HTML

У меня это всё запускается cron-ом раз в несколько часов и подсовывается локальному Lighttpd в качестве одной из статических страниц.

Собственно код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import urllib2
import lxml.html as htm
import lxml.html.soupparser as soup # Note: internally imports BeautifulSoup
import time

log = logging.getLogger()

POST_URL="http://info.russianpost.ru/servlet/post_item?action=search&searchType=barCode&show_form=no&barCode=%s&page=1" # Track No as parameter
TRACK_FILE="tracks.txt"
HTML_FILE="index.html"

def main():
    out = [] # output links
    tracks = [x.strip() for x in open(TRACK_FILE,'Ur').readlines() if x.strip()]

    for trk in tracks:
        log.debug(u"Check tracking #%s" % (trk,))

        try:
            f = urllib2.urlopen(POST_URL % trk)
        except:
            log.exception(u"Get info for `%s` failed (open url)" % trk)

        try:
            s = f.read()
            f.close()
        except:
            log.exception(u"Get info for `%s` failed (read)" % trk)

        try:
            try:
                x = htm.document_fromstring(s)
            except: # broken html fallback
                x = soup.fromstring(s)

            tbl = x.xpath('/html/body/table[1]')
            log.debug(u"TBL: %s" % (tbl,))

            if tbl:
                s = ''
                tr = tbl[0].xpath('tr')[-2].xpath('td')
                out.append((trk, u"%s: %s (%s %s)" % (tr[1].text, tr[0].text, tr[3].text, tr[4].text)))
            else:
                out.append((trk, 'No information available'))

        except:
            log.exception(u"")

    # make output
    ht = [u"<html>",
           u"<head><meta http-equiv='content-type' content='text/html;charset=utf-8'/></head>",
           u"<body>"
           u"<h2>Tracking info</h2>",
           u"<h4>Last update: %s" % time.asctime(),
           u"<h5>Add track numbers into `tracks.txt`</h5><br/>"]

    for s in out:
        ht.append(
            u"<a href='%s'>%s</a>: %s<br/>" % (POST_URL % s[0], s[0],s[1])
        )

    ht.append(u"</body></html>")

    with open(HTML_FILE, "w") as f:
        print >>f , "\n".join(ht).encode('utf-8')

    log.debug('Done.')

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)

    main()


PS: В качестве самостоятельной работы можно добавить чтение и запись не из hard-coded файлов, а передачу их параметрами. Ну и украшательства выходного HTML, если это кому-то надо :)

UPD: Добавил вывод названия ОПС и атрибута операции — для наглядности
Tags:
Hubs:
+4
Comments 22
Comments Comments 22

Articles