Pull to refresh

Пишем мониторинг наличия билетов на РЖД, part 2

Reading time 2 min
Views 12K


В первой части было показано как написать простейший враппер вокруг существующего http API ржд. В этой части продолжим и напишем действующий мониторинг с уведомлением на почту. Сайт проекта располагается по прежнему тут и тут запасной.

В первой части приложение было не threadsafe, т.е. в настройках app.yaml значилось:
threadsafe: false
исправим эту ситуацию, изменим:

def main():
    application.run()

if __name__ == "__main__":
    main()

на:
app = webapp2.WSGIApplication([
    ('/', MainPage),
], debug=False)


Естественно пришлось также переписать немного кода, выигрыш от всего этого следующий: при threadsafe: false appengine ставит новые сессии в очередь и запускает для каждой сессии новый инстанс (с небольшим временным лагом), при включенном threadsafe подразумевается что разработчик верно реализовал многопоточную логику.

Далее нужно было решить два вопроса: почта и запуск по крону, начнем с крона: для этого нужно создать в рабочей дире файл cron.yaml и указать куда и как часто следует обращаться крон демону:

cron:
- description: mail summary job
  url: /summary_mail
  schedule: every 1 hours


На
/summary_mail
повесим обработчик для рассылки на активные аккаунты, а для того чтобы нехорошие дяди не могли его дергать самостоятельно и как следствие — скушать все наши квоты и заспамить активных пользователей, нужно ограничить доступ к нему только для админов и гугл крона, добавим в app.yaml строки:

- url: /summary_mail
  script: web.app
  login: admin


Список админов для приложения настраивается из консоли администратора (ребята школьники хакеры, не беспокойтесь в данном приложении нет никакой админки и не нужно ее пробовать «пробивать» ибо как следовало из логов при публикации прошлого поста, таки находились специалисты..., данная консоль предоставляется средствами appengine).
Некоторое время я думал — что же делать с почтовой рассылкой, прикручивать стороннюю капчу или делать свою, в итоге пошел по простейшему пути — я использую гугл аккаунт и после прохождения гугл авторизации (есстественно все идет через редирект и никакие пароли я не храню) я получаю почтовый ящик пользователя, на который он и будет получать письма о свободных местах. Фунционал для работы с почтой простейший:

def sendMail(account, body):
  mail.send_mail(sender  = "rzd wrapper support <robot.sender.rzd@gmail.com>",
                 to      = account.email(),
                 subject = "train report",
                 html    = body,
                 body    = body)


Да, тело письма в текстовом представлении и html у меня счас одинаковое, но скоро я это исправлю.
Для полноты картины нужно сказать, что радиоактивные исходники по прежнему тут, конечно же я наведу там порядок со временем, так же могут наблюдаться редкие, но ошибки при работе, ибо отвечает РЖД не идеально, и я где мог подстелил соломку, но думается не везде, в целом функционал вполне рабочий, каждый может из исходников запустить свое локальное приложение и допилить его до собсвенных нужд. Крон опрашивает наличие билетов раз в час. На данный момент можно подписаться только на один поезд. В дальнейших планах прикрутить Jinja2 и сделать более приятный интерфейс, так же попробовать реализовать на APPENGINE интерфейс к open source морфологии и сделать что то наподобие спелл чекера. Надеюсь данный сервис будет для когото полезен.
Tags:
Hubs:
+5
Comments 11
Comments Comments 11

Articles