私たちはロシアの鉄道のチケットの可用性を監視することを書いています

私は友人から、 ロシア鉄道の空きスペースを監視するサイトを見たいとよく耳にします。 「はい、それはいいだろう」と安全に忘れてしまいましたが、この投稿は私のパスタのスキルを思い出させてくれました。 すぐに第2部の監視に関する予約を行います。これは、Pythonからロシア鉄道に行く方法、以前の投稿で書いた不思議な眠り 、Google App Engineでの生活についてです。 それでは始めましょう:

画像



最初にコードを作成し、ホスティングについて考えました。もちろん、サイトは利益を期待していませんでしたが、楽しみは4つしかなかったため、ホスティングは無料である必要があり、 App Engineについて思い出しました。 開始するには、 SDKをダウンロードする必要があります 。 まず、将来のアプリケーションへのパスを指定します。

画像



指定された作業ディレクトリで、およそ以下を含む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
      
      







さて、ロシアの鉄道が頻繁に切断したり、500コードで応答したりすることを忘れずに、 ridSESSION_IDを取得して最終リクエストを作成することが残っています これを隠すために、いくつかの松葉杖ハンドラーを作成します。



 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)
      
      







そして、結果の答え-最終的な解析に必要なものはすべてあります。 さて、神秘的なスリープについて、彼は関数getResponseStubに移動しました。事実、 req1をリクエストすると、実行キューに入れるように求められ 、すぐにreq2を要求すると、結果がまだ受信されない可能性があります。 放射性線源は、ここから慎重ダウンロードできます 。 割り当ては小さく、特定の効果ですぐに終了するため、 ここここで実際に試すことができます。この記事がモデレートされている間、ページが長く続くようにお金を投じようとします。 次のパートでは、実際の通知をメールで添付します。



All Articles