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

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

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

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

    Гугление на предмет готовых скриптов показало, что после смены «политики партии», большинство из них работать отказывается. Каково же было моё радостное удивление, когда ссылка к старому доброму 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: Добавил вывод названия ОПС и атрибута операции — для наглядности
    Метки:
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 22
    • 0
      к 2113 году Почта России обещает выпустить тестовую версию API для трекинга посылок
    • +4
      а чем gdeposylka не угодила? Всевозможные службы поддерживает, нотифаи на мыло исправно приходят
      • 0
        :) Тем, что не попалась под руку… Да и регистрироваться лень, раз уж самописный скрипт, как оказалось, работает…
        • 0
          Разве уведомления на мыло — не платная услуга?
          Как бы то ни было, мне удобнее через RSS :)
          • 0
            Вроде только СМС платные, не вникал — только поразглядывал главную страницу.

            А вот с RSS как-то подсознательно связываться не хочется — после шума вокруг гуглоридера, который «расшарил» чью-то финансовую информацию… Вроде и скрывать тут нечего, а осадочек остался :)

            [irony]Да и в конце концов мы здесь (около-) программисты собрались или где? Написать очередной велосипед — наше всё![/irony]
            Вот уже неспешно подумываю прикрутить к этому скрипту Jabber-бота, чтоб присылал новости как минимум…
            • 0
              уведомления фри на 146%, платные лишь смс
          • –1
            Ссылка на тему почтовых отправлений — track.irkfap.com/
            • –1
              Такому «красивому» сайту я бы вжись не доверил трек своей посылки.
            • +3
              Есть очень неплохая программа — TrackChecker, ей пользуюсь более 1.5 лет. Проверяет треки не только на сайте Почты России, часто обновляется и есть куча других сервисов. Автоматический выбор сервиса по трекномеру. Бесплатна.
              • +1
                … Есть под Андроид…
                • +2
                  опередили! одна из немногих программ за которую заплатил))
                  рекомендую!
              • +1
                  • 0
                    спасибо! я был приятно удивлен внезапно выросшей посещалкой на своем проекте :))
                  • +1
                    post-tracker.ru
                    • +1
                      Для Почты России когда-то давно сам себе сделал такой скрипт: cs.loving.ru/track.shtml?id=RA107626123RU
                      Собственно делал с единственной целью: об адресе info.russianpost.ru/servlet я тогда еще не знал, а скрипт на основном сайте Почты России отзывался только на POST-запрос. Цель была укоротить URL и вставить трекномер непосредственно в адрес, чтобы удобно было сохранять прямые ссылки на отслеживание разных посылок в отдельную папку в закладках(с POST-запросом, как вы понимаете, это сделать довольно проблематично). После чего недолго думая, я решил заодно избавиться от привязки к серверным скриптам, и реализовал все внутри HTML-страницы. Пример использования вы видите в приведенном выше URL. Страница отслеживания тупо открывается в фрейме. Кроме того, при вводе любого трекномера в поле ввода и нажатия кнопки «Найти» номер сам «перенесется» в адресную строку и закладку можно сохранять.
                      Так что если кому понравится, можете просто утянуть HTML-файл к себе.
                      Сам-то я давно ушел на одну из универсальных программ «Посылка» и этим скриптом больше не пользуюсь.
                      • 0
                        info.russianpost.ru/servlet/ всё ещё работает? а то мне 404 ошибку выдаёт…
                        • 0
                          У меня тоже «упал»… Видать, хабр почитывают ;)

                          Таки придётся перейти к тормозному варианту с POST ибо 5 бесплатных треков от ГдеПосылки мне мало :)
                      • 0
                        Мой вариант на руби для почты России и USPS github.com/Rambominator/post_tracking/blob/master/post.rb

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.