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

Приобретаем билеты на поезд в Новейший год

Anna | 31.05.2014 | нет комментариев

Конечно, данный новейший год, все из вас хотели бы провести дома. Не будем спорить о том, что такое дом, у всякого свое представление об этом, но лично у меня дом ассоциируется с семьей, родителями. Вероятно самый доступный метод оказаться дома в новейший год на территории России (помимо метро либо нескольких часов пробок) — это безусловно же поезд от всеми любимой компании РЖД.

Но потребность очевидно превышает предложение. Исключительно на плацкарт, тот, что, прямо скажем, самый выигрышный. Так что же делать? Если увлекательно, то дозволено пройти под кат. Но, безусловно, все может быть не так драматично, а легко вам нужно куда-то уехать, в всякое время года, а цены на люкс от РЖД вас не устраивают. Все мы знаем про бронь которая снимается и билеты которые могут возвращать, их то мы и будем ловить :)

Начну с того, что мы будем легко посылать запросы, по крону, скажем раз в пять минут. После этого читать результат, и если данные нас устроят, то отправим себе sms, что дозволено брать. Но если все так легко, то для чего статья на прогр, спросите вы? А после этого, что это легко готовое решение, которым я могу поделится, с тем кто не может либо не хочет тратить свое время на сайте РЖД есть достаточно любознательный механизм по охране от таких левых запросов, тот, что я обошел, и теперь расскажу в чем он заключается и как его обойти.

Запрос на приобретение мест на определенную дату:

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={date}&rid=729493435&SESSION_ID=2′ -H ‘Cookie: JSESSIONID=00006mwFi5RKtF-z0R16OGSMJtS:17obqce3m;’

Толстым я выделил параметры, которые нас волнуют:

  • from — город отправления, выбираем сами
  • to — город куда мы хотим попасть, выбираем сами
  • date — дата отправления, выбираем сами
  • JSESSIONID — ид сессии, с ним нам ничего делать не необходимо, легко будем применять куки в curl
  • rid — таинственный ид номер 1
  • SESSION_ID — таинственный ид номер 2

Позже небольшого постижения становится ясно, что при всяком новом запросе rid изменяется наружно хаотично, а SESSION_ID легко возрастает на один. Чтоже делать, как их узнать? Если присмотримся немножко к логам, то увидим еще один запрос, тот, что неизменно идет перед этим.

Вот он:

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={date}‘ -H ‘Cookie:JSESSIONID=00006mwFi5RKtF-z0R16OGSMJtS:17obqce3m;’

И вот, что он нам вернет:

{«result»:«RID»,”SESSION_ID“:2,”rid“:729493435,«discounts»:{}}

Нас в этом волнует ясно что :)

Все ясно скажете вы, делаем подряд два запроса, из первого получаем недостающие параметры, подставляем во 2-й и бинго! Но нет. Это еще не все. Я если Добросовестно, дальше впал в ступор, отчего же оно отказывается трудиться? Сопоставлял другие заголовки, искал спрятанные переменные, искал немножко магии. Но нет. Из консоли работает, с сайта работает, из скрипта — оплошность.

Даже проникся уважением к охране, которую недооценил с первого взора. И безусловно потом меня осенило, задержка! Между запросами должна быть пауза. sleep(2); Вот и все решение. Трудно сказать с чем это связано, подлинно ли задержка там для охраны, либо легко данные попадают куда необходимо не так стремительно, но так либо напротив ее надобность была для меня не вовсе очевидна.

Вот и все. Данные есть, как даром отослать sms? Дозволено безусловно почтой, но если значима оперативность, то sms будет предпочтительнее. Здесь все на ваш вкус, а я легко применял смс.ru, там рассылка на один телефонный номер бесплатна, а огромнее мне и не нужно. Для всякого вашего определенного города отменнее взять urlData с сайта, потому что там еще много таинственных параметров. Если кому он необходим, то сам скрипт:

Скрипт

<?php

class rzd {
private $urlData = ‘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={{date}}’;
private $data = [
'Город откуда',
'Город куда',
];
private $replace = [
'{{from}}',
'{{to}}',
'{{date}}',
];
private $secure = ‘&rid={{rid}}&SESSION_ID={{session_id}}’;
private $replaceSecure = [
'{{rid}}',
'{{session_id}}',
];
private $cookie = ‘cookie’;

public function request($date) {
$this->data[] = $date;
$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);
sleep(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 ($result as $train) {
if (isset($train['cars']) && is_array($train['cars']))
foreach ($train['cars'] as $ticket) {
$resultExec = ‘На ’.$date.‘ - ’.$train['number'].“ - ”.$ticket['type'].‘ за ’.$ticket['tariff'].‘ - ’.$ticket['freeSeats'].‘ м’;
$ch = curl_init(смс.ru/sms/send”);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
“api_id” => ‘ид sms.ru’,
“to”      => ‘номер телефона’,
“text”   => $resultExec,
));
sleep(2);
# здесь можно поставить условие на отсылку смс, например если цена меньше 4000 тр
                    $body = curl_exec($ch);
curl_close($ch);
}
}
}
}

Выполняем метод с нужной датой

$rzd = new rzd();
$rzd->request(’27.12.2013′);
$rzd = new rzd();
$rzd->request(’28.12.2013′);
$rzd = new rzd();
$rzd->request(’30.12.2013′);

Не забываем поставить все это в кронтаб и ожидать улова. Благополучных поездок.

P.S. php 5.5, но что изменить для 5.4 и поменьше, думаю каждому ясно, и дада, здесь нет никакого ООП, нет паттернов и нет продуманного дизайна кода, это легко скрипт, тот, что пока что работает (пока ржд не изменят алгорифм)

Источник: programmingmaster.ru

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