visavi / rzd-api
rzd api
Requires
- php: >=8.0
- ext-curl: *
- ext-json: *
- ext-mbstring: *
- guzzlehttp/guzzle: ^7.8
Requires (Dev)
- phpunit/phpunit: ^9.6
- symfony/var-dumper: ^v7.0
README
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&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 - 获取当前路线中所有站点的列表
接受参数 非必选参数在重复请求中
- trainNumber - 火车号 054Г
- depDate - 出发日期 13.03.2016
返回以下站点数组
- Station - 站点名称
- Code - 站点代码
- ArvTime - 到达时间
- WaitingTime - 停靠时间
- DepTime - 出发时间
- Distance - 行驶距离
stationCode - 获取站点代码列表
接受参数
- stationNamePart - 站点名称的一部分,至少2个字符
- compactMode - 默认 'y'
返回找到的数据数组
- 车站 - 车站名称
- 代码 - 车站代码
例如,当 stationNamePart = 'ЧЕБ' 时,将返回所有以 'ЧЕБ' 开头的车站(11个车站)
许可证
该类是开源软件,许可协议为MIT许可证