
しかし、需要は明らかに供給を上回ります。 特に指定席では、率直に言って、最も収益性が高くなります。 それではどうしますか? 興味があれば、猫の下に行くことができます。 しかし、もちろん、すべてがそれほど劇的ではないかもしれませんが、あなたはいつでもどこでも、いつでも去る必要があり、ロシア鉄道からのルクスの価格はあなたに合っていません。 私たちは皆、削除された予約と返されるチケットについて知っています。それらをキャッチします:)
そもそも、たとえば5分ごとに1回、クラウンによってリクエストを送信します。 それから答えを読んで、条件が私たちに合っていれば、あなたが取ることができるSMSを私たち自身に送ります。 しかし、すべてが非常に単純な場合、なぜHabrに関する記事が必要なのでしょうか? そして、これは、ロシア鉄道のウェブサイトで時間を過ごすことができない、またはしたくない人々と共有できる既製のソリューションであり、私が行った左利きの要求から保護するためのかなり奇妙なメカニズムがあり、今それが何であるかを教えます嘘とその回避方法。
特定の日付の座席のリクエスト:
curl 'http://pass.rzd.ru/timetable/public/ru?STRUCTURE_ID=735&layer_id=5371&dir=0&tfl=3&checkSeats=1&st0= {from} &code0 = 2004000&dt0 = {date} &st1 = {to} &code1 = 2060600&dt1 = 日付} & rid = 729493435& SESSION_ID = 2 '-H' Cookie: JSESSIONID = 00006mwFi5RKtF-z0R16OGSMJtS:17obqce3m; '
太字で、興味のあるパラメーターを強調しました。
- から-出発都市、自分を選択してください
- to-行きたい都市、自分で選んでください
- 日付-出発日、自分で選択
- JSESSIONID-セッションID、何もする必要はありません。curlでCookieを使用します
- rid-神秘的なID番号1
- SESSION_ID-謎のID番号2
少し調べてみると、新しいリクエストが削除されるたびにランダムに外側に変化し、SESSION_IDが1だけ増加することが明らかになりました。 何をすべきか、それらを認識する方法は? ログを詳しく見ると、常にこの前に来る別のリクエストが表示されます。
ここにあります:
curl 'http://pass.rzd.ru/timetable/public/ru?STRUCTURE_ID=735&layer_id=5371&dir=0&tfl=3&checkSeats=1&st0= {from} &code0 = 2004000&dt0 = {date} &st1 = {to} &code1 = 2060600&dt1 = 日付} '-H' Cookie: JSESSIONID = 00006mwFi5RKtF-z0R16OGSMJtS:17obqce3m; '
そして、ここに彼が私たちに返すものがあります:
{「結果」:「RID」、「 SESSION_ID 」:2、「 rid 」:729493435、「discounts」:{}}
私たちはこれに興味を持っています、それは明らかです:)
すべてを明確に言います。2つのリクエストを連続して行います。最初から欠落しているパラメーターを取得し、2番目でビンゴに置き換えます。 しかし、違います。 それだけではありません。 正直に言うと、私は麻痺状態になりました、なぜそれが機能しないのですか? 他のヘッダーを比較し、隠し変数を探し、魔法を探します。 しかし、違います。 コンソールから、サイトから、スクリプトから動作します-エラー。
私は一見して過小評価していた防衛に対する敬意も吹き込まれました。 そしてもちろん、それは私に気づきました、遅延! 要求の間には一時停止が必要です。 睡眠(2); それがソリューション全体です。 これが何に関連しているのか、保護のために遅延が本当にあるのか、それともデータが必要なところにそれほど速く届かないのかを言うのは難しいですが、どういうわけかその必要性は私には完全に明らかではありませんでした。
以上です。 データがあり、SMSを無料で送信する方法は? もちろんメールでも可能ですが、速度が重要な場合はSMSが望ましいでしょう。 すべてがあなたの好みに合っていますが、私はsms.ruを使用しました。そこでは、1つの電話番号を無料で送信できます。これ以上は必要ありません。 特定の都市ごとに、一意の数値コードが必要になります。これを見ると、メソッドの入力に渡されます。
$ rzd- > リクエスト ( [
「サンクトペテルブルク」 、
'2004000' 、
「キロフ」 、
'2060600' 、
'28 .12.2013 ' 、
] ) ;
たとえば、感謝mafetを見つけるには、 http://pass.rzd.ru/suggester?lang = ru&stationNamePart =にリクエストを送信し、都市の最初の2文字を置き換えて、そこから目的の都市と駅を見つけ、そこから必要なIDを取得します。
誰かがそれを必要とする場合、スクリプト自体:
スクリプト
<?php
クラス rzd {
private $ urlData = 'http://pass.rzd.ru/timetable/public/en?STRUCTURE_ID=735&layer_id=5371&dir=0&tfl=3&checkSeats=1&st0={{from►►&&t0={{code_from►►&&tt=={{datedate }}&st1 = {{to}}&code1 = {{code_to}}&dt1 = {{date}} ' ;
プライベート $データ ;
プライベート $ replace = [
'{{from}}' 、
'{{code_from}}' 、
'{{to}}' 、
'{{code_to}}' 、
'{{date}}' 、
] ;
private $ secure = '&rid = {{rid}}&SESSION_ID = {{session_id}}' ;
private $ replaceSecure = [
'{{rid}}' 、
'{{session_id}}' 、
] ;
private $ cookie = 'cookie' ;
パブリック 関数リクエスト( $ data ) {
$ this- > data = $ data ;
$ this- > urlData = str_replace ( $ this- > replace 、 $ this- > data 、 $ this- > urlData ) ;
$ ch = curl_init ( $ this- > urlData ) ;
curl_setopt ( $ ch 、 CURLOPT_RETURNTRANSFER 、 1 ) ;
curl_setopt ( $ ch 、 CURLOPT_COOKIEJAR 、 $ this- > cookie ) ;
curl_setopt ( $ ch 、 CURLOPT_COOKIEFILE 、 $ this- > cookie ) ;
$ result = json_decode ( curl_exec ( $ ch ) 、 true ) ;
$ this- > urlData 。= str_replace ( $ this- > replaceSecure 、 [ $ result [ 'rid' ] 、 $ result [ 'SESSION_ID' ] ] 、 $ this- > secure ) ;
睡眠 ( 2 ) ;
$ ch = curl_init ( $ this- > urlData ) ;
curl_setopt ( $ ch 、 CURLOPT_RETURNTRANSFER 、 1 ) ;
curl_setopt ( $ ch 、 CURLOPT_COOKIEJAR 、 $ this- > cookie ) ;
curl_setopt ( $ ch 、 CURLOPT_COOKIEFILE 、 $ this- > cookie ) ;
$ result = json_decode ( curl_exec ( $ ch ) 、 true ) ;
$ result = reset ( $ result [ 'tp' ] ) ;
$ result = $ result [ 'list' ] ;
foreach ( $の結果 は $ train ) {
if ( isset ( $ train [ 'cars' ] ) && is_array ( $ train [ 'cars' ] ) ))
foreach ( $ train [ 'cars' ] as $ ticket ) {
#ここに条件を記述できます。たとえば、価格が4000r未満の場合、以下をすべて実行してSMSを送信します
$ resultExec = 'On' 。 $データ [ 4 ] 。 '-' 。 $ train [ 'number' ] 。 「-」 。 $チケット [ 'タイプ' ] 。 'for' 。 $チケット [ '関税' ] 。 '-' 。 $チケット [ 'freeSeats' ] 。 'm' ;
$ ch = curl_init ( " sms.ru/sms/send" ) ;
curl_setopt ( $ ch 、 CURLOPT_RETURNTRANSFER 、 1 ) ;
curl_setopt ( $ ch 、 CURLOPT_TIMEOUT 、 30 ) ;
curl_setopt ( $ ch 、 CURLOPT_POSTFIELDS 、 配列 (
"api_id" => 'id sms.ru' 、
"to" => 'your phone' 、
「テキスト」 => $ resultExec 、
) ) ;
睡眠 ( 2 ) ;
$ body = curl_exec ( $ ch ) ;
curl_close ( $ ch ) ;
}
}
}
}
$ rzd = new rzd ( ) ;
$ rzd- > リクエスト ( [
「サンクトペテルブルク」 、
'2004000' 、
「キロフ」 、
'2060600' 、
'27 .12.2013 ' 、
] ) ;
$ rzd = new rzd ( ) ;
$ rzd- > リクエスト ( [
「サンクトペテルブルク」 、
'2004000' 、
「キロフ」 、
'2060600' 、
'28 .12.2013 ' 、
] ) ;
これらすべてをcrontabに入れて、キャッチを待つことを忘れないでください。 良い旅を。
PS php 5.5、しかし5.4以下で何を変更するか、誰もが理解していると思う、そして、はい、OOPはなく、パターンも思慮深いコード設計もありません、これは今のところ動作するスクリプトです(アルゴリズムがロシア鉄道によって変更されるまで)