visavi/rzd-api

rzd api

v4.0.1 2023-12-12 00:31 UTC

This package is auto-updated.

Last update: 2024-09-14 22:00:29 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License

安装说明

用户界面说明

Api 能做什么

  • 获取单程路线
  • 获取往返路线
  • 获取所选列车的车厢列表
  • 获取所选路线的车站列表
  • 获取车站代码列表(按城市首字母搜索)

功能演示

下载存档,解压并进入目录

安装必要的依赖

composer install

然后启动内置的 web 服务器

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:password@192.168.16.1: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 表示网站已为我们提供唯一标识符和 cookie OK 表示已收到包含所需数据的完整响应。在所有其他响应中 Error 或 FAIL 表示数据获取错误

获取 cookie

每个对网站的请求都必须包含类似以下的 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}}

第二个请求使用我们已获得的唯一标识符(它包含先前请求的数据)和 cookie 执行。因此,为了优化,我们可以省略第一个请求中指定的某些参数

实现的请求

需要实现通过 AJAX 请求返回数据,当前示例中未实现此功能

trainRoutes - 获取列车路线,空闲座位数量,价格等,其中只包含单程信息

Маршруты

接受参数,在第一个请求中必需的参数

  • layer_id - 子类别(5827)

在重复请求中非必需的参数

  • dir - 0 - 只单程,1 - 往返
  • tfl - 3 - 列车和电车,2 - 电车,1 - 列车
  • checkSeats - 0, 1 - 仅在存在空闲座位时在火车上搜索
  • code0 - 出发站代码
  • code1 - 目的地站代码
  • dt0 - 出发日期
  • md - 转乘路线(1 - 转乘,0 - 只需直达航班)

返回火车和空闲座位的数组

  • from - 发车站名称(圣彼得堡)
  • where - 目的地站名称(基辅火车站)
  • date - 出发日期(2016年3月27日)
  • fromCode - 发车站代码(2004000)
  • whereCode - 目的地站代码(2060600)

火车数组包含

  • date0 - 出发日期

  • date1 - 到达日期

  • time0 - 出发时间

  • time1 - 到达时间

  • route0 - 发车站代码 С-ПЕТ-ЛАД

  • route1 - 到达站代码 ТЮМЕНЬ

  • number - 火车号

  • timeInWay - 行驶时间

  • brand - 火车名称(Demidovsky Express)

  • 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 方法相同,但包含两个数组,第一个数组是去程,第二个数组是回程

trainCarriages - 获取车厢列表、空闲座位、车厢布局、票价、类型和服务等级

Вагоны

在重复请求中非必需的参数

  • dir - 0 仅单程,1 - 往返
  • code0 - 出发站代码
  • code1 - 目的地站代码
  • dt0 - 出发日期(2016年3月28日)
  • time0 - 出发时间(15:30)
  • tnum0 - 火车号(072Е)

返回以下车厢数组

  • 以上查询的标准回答

  • cnumber - 车厢号

  • type - 车厢类型

  • typeLoc - 全名(硬座、软卧、卧铺、软卧)

  • clsType - 2Л, 2Э

  • tariff - 票价

  • tariffServ - 服务费

  • seats - 地点数组(上铺、上铺侧卧、下铺、下铺侧卧等)

  • seats.*.places - 空闲座位列表

  • seats.*.tariff - 座位价格

  • seats.type - 简称(上铺)

  • 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'

返回找到的数据数组

  • 车站 - 车站名称
  • 代码 - 车站代码

例如,当 stationNamePart = 'ЧЕБ' 时,将返回所有以 'ЧЕБ' 开头的车站(11个车站)

许可证

该类是开源软件,许可协议为MIT许可证