Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

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

Anna | 15.06.2014 | нет комментариев
Не раз слышал от своих знакомых, что было бы недурно увидеть сайт тот, что будет мониторить присутствие свободных мест на ржд. Про себя я думал — «да хорошо бы» и удачно забывал, но пост принудил меня припомнить навыки копи паста, которыми я обладаю в совершенстве и обернуть это дело в питонячий код. Сразу оговорюсь что именно про мониторинг будет во 2-й части, а в этой будет про то: как ходить на РЖД из питона, что это за таинственный sleep про тот, что писали в предыдущем посту и как живется на Google App Engine. Выходит приступим:
image

Вначале я написал код, а потом задумался о хостинге, есстественно сайт не полагал никакой наживы, а был лишь 4 fun, следственно и хостинг должен быть бесплатным и здесь я припомнил про App Engine. Для начала работы стоит скачать SDK. Запускаем, указываем путь к грядущему приложению:
image

В указанной рабочей директории сознаем файл настроек app.yaml содержащий приблизительно следующее:

application: rzdzstan1
version: 1
runtime: python27
threadsafe: false
api_version: 1

handlers:
- url: /favicon.ico
  static_files: favicon.ico
  upload: favicon.ico

- url: /.*
  script: web.py

libraries:
- name: webapp2
  version: "latest"

Дальше в вышеобозначенной рабочей директории создаем, web.py и здесь теснее дозволено начинать писать код копипастить. Приложение будем строить на легковесном WebApp2. Выходит пишем основные обработчики:

import webapp2

application = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/trains', TrainListPage),
    ('/suggester', SuggesterPage),
], debug=True)

def main():
    application.run()

if __name__ == "__main__":
    main()

Дальше, как и говорилось в базовой статье, нам потребуются коды городов для создания запроса:

def getCityId(city, s):
  req = 'http://pass.rzd.ru/suggester?lang=ru&stationNamePart='   urllib.quote(city.encode('utf-8'))
  city = city.lower()
  respData = getResponse(req)
  rJson = json.loads(respData)
  for item in rJson:
    if item['name'].lower() == city:
      s.response.out.write(u'Обнаружен: ' item['name'] ' -> ' str(item['id']) '<br>')
      return str(item['id'])
  s.response.out.write(u'Не обнаружен: ' city '<br>')
  s.response.out.write(u'Выбранный вами город не обнаружен, испробуйте обнаружить в списке и ввести еще раз:<a href="../">Возвратиться</a><br>')
  for item in rJson:
    s.response.out.write(item['name'] '<br>')
  return None

Ну а дальше остается получить ridSESSION_ID и сформировать окончательный запрос, не забывая что Зачастую РЖД рвет соединения, отвечает 500 кодом и т.д. Дабы это замаскировать напишем пару костылей-обработчиков:

def getResponse(url):
  good = False
  while not good:
    try:
      resp = opener.open(url, timeout=5)
      if resp.getcode() in [httplib.OK, httplib.CREATED, httplib.ACCEPTED]:
        good = True
    except (urllib2.HTTPError, HTTPException):
      pass
  return resp.read()

def getResponseStub(url):
  r = json.loads(getResponse(url))
  cnt = 0
  while (r['result']!='OK' and cnt < 5):
    sleep(1)
    cnt =1
    r = json.loads(getResponse(url))
  return r

def getFinalRequest():
  req1 = 'http://pass.rzd.ru/timetable/public/ru?STRUCTURE_ID=735&layer_id=5371&dir=0&tfl=3&checkSeats=1&\
st0=' st0 '&code0=' id0 '&dt0=' date '&st1=' st1 '&code1=' id1 '&dt1=' date

  r = json.loads(getResponse(req1))
  if (r['result']=='OK'):
    s.response.out.write(r['tp'][0]['msgList'][0]['message']) #errType
    s.response.out.write('<br>')
    return
  sid = str(r['SESSION_ID'])
  rid = str(r['rid'])
  req2 = 'http://pass.rzd.ru/timetable/public/ru?STRUCTURE_ID=735&layer_id=5371&dir=0&tfl=3&checkSeats=1&\
st0=' st0 '&code0=' id0 '&dt0=' date '&st1=' st1 '&code1=' id1 '&dt1=' date '&rid=' rid '&SESSION_ID=' sid

  r = getResponseStub(req2)

И в получившемся результате — лежит все нужное для финального парсинга. Сейчас о таинственном sleep, он переехал в функцию: getResponseStub, дело в том что когда мы запрашиваем req1 му таким образом умоляем поставить нас в очередь исполнения, и если сразу спросить req2 — итог может быть еще не получен. Радиоактивные исходники доступны здесь качать осмотрительно. Испробовать в действии дозволено здесь издесь потому как квоты там небольшие и под знаменитым результатом стремительно закончатся, а пока эта статья проходит премодерацию испробую закинуть немножко денег Дабы страница продержалась продолжительное время. В дальнейшей части будем приделывать собственно саму нотификацию по емайлу.

Источник: programmingmaster.ru
Оставить комментарий

Ваш email не будет опубликован. Обязательные поля помечены (обязательно)

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2014 © BB3x.ru - русская поддержка форума phpBB