Giter VIP home page Giter VIP logo

rzd-api's Introduction

Api сайта rzd.ru

Latest Stable Version Total Downloads Latest Unstable Version License

Описание установки

Описание интерфейса пользователя

Что умеет Api

  • Получает маршруты в одну точку
  • Получает маршруты туда-обратно
  • Получает список вагонов выбранного поезда
  • Получает список станций в пути следования выбранного маршрута
  • Получает список кодов станций (Поиск по первым символам города)

Демонстрация возможностей

Скачайте архив, распакуйте и перейдите в директорию

Установите необходимые зависимости

composer install

И запустите встроенный веб-сервер

php -S localhost:8000 -t examples

Пример запроса

<?php

$config = new Rzd\Config();

// Set language
$config->setLanguage('en');

// Set userAgent
$config->setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 12_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Mobile/15E148 Safari/604.1');

// Set referer
$config->setReferer('https://ticket.rzd.ru/');

// Enable debug mode
$config->setDebugMode(true);

// Set proxy
$config->setProxy('https://username:[email protected]:10');

// Set timeout
$config->setTimeout(10);

//$config не обязателен
$api = new Rzd\Api($config);

// В примере выполняется поиск маршрута САНКТ-ПЕТЕРБУРГ - МОСКВА (только с билетами) на завтра
$params = [
    'dir'          => 0, // 0 - только в один конец, 1 - туда-обратно
    'tfl'          => 3, // 3 - поезда и электрички, 2 - электрички, 1 - поезда 
    'checkSeats'   => 1, // 1 - только с билетами, 0 - все поезда
    //'withoutSeats' => 'y', // Если checkSeats = 0, то этот параметр тоже необходим
    // Коды станций можно получить отдельным запросом
    'code0'        => '2004000', // код станции отправления
    'code1'        => '2000000', // код станции прибытия
    'dt0'          => 'дата на завтра d.m.Y',
    'md'           => 0, // 0 - без пересадок, 1 - с пересадками
];

$routes = $api->trainRoutes($params);

Процесс приобретения билетов на сайте pass.rzd.ru разделен на несколько этапов

Открытая часть

Выбор маршрута - выбор поезда - выбор вагона

Закрытая часть

  • Информация о пассажирах - Проверка заказа - Оплата заказа - Подтверждение заказа

Этапы

  • В первом этапе пользователь указывают станцию отправления и станцию прибытия поезда, а также дату желаемой поездки. В этот момент на сайте pass.rzd.ru происходит отправка ajax-запроса, с которым мы и будем работать, запрос возвращает сформированный JSON пакет с ответом, в нем и находится требуемая нами информация или сообщение об ошибке

  • Во втором этапе мы можем выбрать необходимый нам поезд и получить полную информацию о свободных местах

  • В третьем этапе необходимо выбрать места и заполнить данные необходимые на оплаты и регистрации на сайте

Допустимые запросы через Curl (POST и GET) Для обхода защиты сайта необходимо предварительно отправить запрос для получения cookies и номера идентификатора RID (REQUEST_ID) Вторым запросом подставляем уникальный идентификатор RID и отправляем cookie

Ответы с сайта

Статус ответа содержится в переменной result RID - означает что сайт выдал нам уникальный идентификатор и куки OK - получен полный ответ с запрошенными нами данными Во всех остальных ответах Error или FAIL означает ошибку получения данных

Получение cookie

Каждый запрос к сайту должен содержать куки примерного вида:

  • lang=ru - текущий язык
  • JSESSIONID=0000w74wcMhGMfeoE6ibmsh4i4W:17obq9kpt - уникальный ключ
  • AuthFlag=false - авторизован ли пользователь на сайте

Пример запроса

Все запросы идут на адрес http://pass.rzd.ru/timetable/public/ru?layer_id=подкатегория&ключ=значение

Где подкатегория это

  • 5827 - выбор маршрута (Получения списка поездов)
  • 5764 - детальная информация выбранному по поезду, список вагонов
  • 5804 - просмотр маршрута со всеми остановками (Вроде больше не работает, реализовано по-другому)

Первый запрос

https://pass.rzd.ru/timetable/public/ru?layer_id=5827&dir=0&tfl=3&checkSeats=1&code0={{code_from}}&dt0={{date}}&code1={{code_to}}&dt1={{date}}

Второй и следующие запросы

https://pass.rzd.ru/timetable/public/ru?layer_id=5827&rid={{rid}}

Второй запрос выполняется с уже полученным нами уникальным идентификатором который хранит в себе данные предыдущего запроса и куками Поэтому в целях оптимизации можно не отправлять некоторые параметры указанные нами в первом запросе

Реализованные запросы

Необходимо реализовать отдачу данных через ajax-запросы, в текущих примерах это не реализовано

trainRoutes - получает маршруты поездов, количество свободных мест, цены итд в нем в один конец

Маршруты

Принимает параметры обязательные параметр при первом запросе

  • layer_id - подкатегория (5827)

Необязательные параметр при повторном запросе

  • dir - 0 - только в один конец, 1 - туда-обратно
  • tfl - 3 - поезда и электрички, 2 - электрички, 1 - поезда
  • checkSeats - 0, 1 - поиск в поездах только если есть свободные места
  • code0 - код станции отправления
  • code1 - код станции прибытия
  • dt0 - дата отправления
  • md - маршруты с пересадками (1 - с пересадками, 0 - только прямые рейсы)

Возвращает массив поездов и свободных мест

  • from - название станции отправления (САНКТ-ПЕТЕРБУРГ)
  • where - название станции прибытия (КИРОВ ПАСС)
  • date - дата отправления (27.03.2016)
  • fromCode - код станции отправления (2004000)
  • whereCode - код станции прибытия (2060600)

Массив поездов содержит

  • date0 - дата отправления

  • date1 - дата прибытия

  • time0 - время отправления

  • time1 - время прибытия

  • route0 - код станции отправления С-ПЕТ-ЛАД

  • route1 - код станции прибытия ТЮМЕНЬ

  • number - номер поезда

  • timeInWay - время в пути

  • brand - Название поезда (Демидовский экспресс)

  • carrier - тип поезда ФПК (Фирменный)

  • cars - массив свободных мест купе, плацкарт и люкс

  • cars.freeSeats - кол. свободных мест

  • cars.itype

  • cars.servCls - класс обслуживания (2Ю, 2Ж и т.д.)

  • cars.tariff - стоимость билета

  • cars.pt - баллы

  • cars.typeLoc - полное наименование (Плацкартный, СВ, Купе, Люкс)

  • cars.type - сокращенное наименование (Купе, плац, люкс)

  • cars.disabledPerson - флаг обозначающий места для инвалидов

trainRoutesReturn - получает маршруты поездов, количество свободных мест, цены итд, туда-обратно

Поезда

Принимает параметры обязательные параметр при первом запросе

  • layer_id - подкатегория (5827)

Необязательные параметр при повторном запросе

  • dir - 0 только в один конец, 1 - туда-обратно
  • tfl - тип поезда (3 - поезда и электрички, 2 - электрички, 1 - поезда)
  • checkSeats поиск только с билетами (1 - с билетами, 0 - все поезда)
  • code0 - код станции отправления
  • code1 - код станции прибытия
  • dt0 - дата отправления
  • dt1 - дата возвращения

Ответы точно такие же как и в методе trainRoutes, только содержит 2 массива, в первом - туда, во-втором - обратно

trainCarriages - получает список вагонов, свободные места, схема вагона, стоимость билетов, тип и класс обслуживания

Вагоны

Необязательные параметр при повторном запросе

  • dir - 0 только в один конец, 1 - туда-обратно
  • code0 - код станции отправления
  • code1 - код станции прибытия
  • dt0 - дата отправления (28.03.2016)
  • time0 - время отправления (15:30)
  • tnum0 - номер поезда (072Е)

Возвращает следующий массив вагонов

  • Стандартный ответ из запросов выше

  • cnumber - номер вагона

  • type - тип вагона

  • typeLoc - полное наименование (Плацкартный, СВ, Купе, Люкс)

  • clsType - 2Л, 2Э

  • tariff - стоимость билета

  • tariffServ - сервис сбор

  • seats - массив мест (верхние, верхние боковые, нижние, нижние боковые итд)

  • seats.*.places - список свободных мест

  • seats.*.tariff - цены за место

  • seats.type - сокр. наименование мест (up)

  • seats.free - количество мест

  • seats.label - полное наименование мест (Верхние)

  • schemes схемы вагонов

  • html - json массив информация о схеме вагонов

  • image - ссылка на картинку

  • insuranceCompany - массив с компаниями страхователями и правилами страхования

  • shortName - наименование организации

  • offerUrl - ссылка на файл с правилами, обычно PDF файл

trainStationList - получение списка всех станций в текущем маршруте движения

Станции

Пример запроса https://pass.rzd.ru/ticket/services/route/basicRoute?STRUCTURE_ID=704&trainNumber=054Г&depDate=13.03.2016

Принимает параметры Необязательные параметр при повторном запросе

  • trainNumber - номер поезда 054Г
  • depDate - дата отправления 13.03.2016

Возвращает следующий массив станций

  • Station - название станции
  • Code - код станции
  • ArvTime - время прибытия
  • WaitingTime - время стоянки
  • DepTime - время отправления
  • Distance - пройденная дистанция

stationCode - Получение списка кодов станций

Принимает параметры

  • stationNamePart - часть названия станции, минимум 2 символа
  • compactMode - по умолчанию 'y'

Возвращает массив найденных данных

  • station - имя станции
  • code - код станции

К примеру при значении stationNamePart = 'ЧЕБ' будут возващены все станции начинающиеся на ЧЕБ (11 станций)

License

The class is open-sourced software licensed under the MIT license

rzd-api's People

Contributors

dependabot[bot] avatar derrexal avatar visavi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rzd-api's Issues

проблема с прокси

нашел такой баг:
если задать работать через прокси, а прокси например лег, то скрипты никак это не обыгрывают, продолжая работать, как в итоге ошибка скрипта.
Rzd\Query::send в этом методе есть return $this->curl; так вот тут нужно обрабатывать ошибку
if($this->curl->error == true ) .....

работа через proxy

добавьте в свой класс Query работу через прокси, т к если ваш код выложить на иностранный сервер, то он не будет работать из за блокировки ржд иностранных ip, было бы неплохо в конструктор передавать прокси для соединения.

composer update не срабатывает

Ваш пакет не обновляется ни через composer update ни через composer update visavi/rzd-api
можно обновить только удалением пакета и установкой заново.

проверка данных

не всегда от ржд прилетают все данные, в методах нужны проверки, например

public function trainCarriages(array $params): string
    {
        $layer = [
            'layer_id' => 5764,
        ];
 
        $routes = json_decode($this->query->get($this->path, $layer + $params));
 
        return json_encode([
            'cars'      => $routes->lst[0]->cars,
            'schemes'   => $routes->schemes,
            'companies' => $routes->insuranceCompany,'functionBlocks' => $routes->lst[0]->functionBlocks,
        ]);
    }

'cars' => $routes->lst[0]->cars, -- переменной cars может не быть, тогда вылетает ошибка Undefined property: stdClass::$cars

Ошибка

Периодически вылетает вот такая ошибка:
laravel.ERROR: Undefined property: stdClass::$Train {"exception":"[object] (ErrorException(code: 0): Undefined property: stdClass::$Train at /public_html/vendor/visavi/rzd-api/src/Rzd/Api.php:120)
[stacktrace]

не все данные в trainCarriages

День добрый
в методе trainCarriages
есть вот такое

return json_encode([
            'cars'      => $routes->lst[0]->cars,
            'schemes'   => $routes->schemes,
            'companies' => $routes->insuranceCompany,
        ]);

очень не хватает там блока functionBlocks
добавьте пожалуйста:

return json_encode([
            'cars'      => $routes->lst[0]->cars,
            'schemes'   => $routes->schemes,
            'companies' => $routes->insuranceCompany,
            'functionBlocks' => $routes->lst[0]->functionBlocks,
        ]);

проблема с обновлением

Добрый день, прокси добавился, но обновится до версии с прокси нельзя, видимо цифра в версии не изменилась

403 на все запросы

видимо что-то изменилось на стороне rzd, на все запросы стал получать HTTP/1.1 403 Forbidden

Отображение пересадок

Добавьте пожалуйста возможность выбрать маршрут с ПЕРЕСАДКАМИ.
Сейчас только прямые от А до Б,

  • от А до В через пункт Б, не достаются поезда.

Закрытая часть

Закрытая часть
Информация о пассажирах - Проверка заказа - Оплата заказа - Подтверждение заказа
т е через апи никак не сделать заказ на ржд?

ошибка в описании?

из описания:

необязательные параметр при повтрном запросе

dir - 0 только в один конец, 1 - туда-обратно
code0 - код станции отправления
code1 - код станции прибытия
dt0 - дата отправления (28.03.2016)
time0 - время отправления (15:30)
tnum0 - номер вагона (072Е)
tnum0 - это номер поезда

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.