alexeydg / rzd-api
Requires
- php: >=7.1
- ext-curl: *
- ext-json: *
- ext-mbstring: *
- php-curl-class/php-curl-class: ^8.1
Requires (Dev)
- phpunit/phpunit: ^7.0
This package is not auto-updated.
Last update: 2024-09-21 17:12:16 UTC
README
Api 能做什么
- 获取一个地点的路线
- 获取往返路线
- 获取所选火车的车厢列表
- 获取所选路线的车站列表
- 获取车站代码列表(通过城市名称的首字母搜索)
- 在 pass.rzd.ru 网站上进行身份验证
- 获取用户资料数据
请求示例
<?php // Добавляем прокси $config = new Rzd\Config(); $config->setProxy([ 'server' => '192.168.0.1', 'port' => '8080', ]); // Изменяем userAgent $config->setUserAgent('Mozilla 5'); // Изменяем referer $config->setReferer('rzd.ru'); $api = new Rzd\Api($config); // В примере выполняется поиск маршрута САНКТ-ПЕТЕРБУРГ - МОСКВА (только с билетами) на завтра $params = [ 'dir' => 0, 'tfl' => 3, 'checkSeats' => 0, 'code0' => '2004000', 'code1' => '2000000', 'dt0' => 'дата на завтра d.m.Y', ]; $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}}
第二个请求将使用已获得的唯一标识符,它包含前一个请求的数据和 cookies。因此,为了优化,我们可以不发送第一个请求中指定的某些参数
已实现的请求
需要实现通过 ajax 请求返回数据,在当前示例中这尚未实现
trainRoutes - 获取列车的路线、空闲座位数量、价格等,在单向中
接受参数,在第一个请求中是必需的参数
- layer_id - 子类别(5827)
在重复请求中是可选参数
- dir - 0 仅单向,1 - 往返
- tfl - 列车类型(1-所有,2-长途,3-电车)
- checkSeats - 1,0 - 仅在有空闲座位时搜索列车
- code0 - 发车站代码
- code1 - 到达站代码
- dt0 - 出发日期
返回列车数组和空闲座位
- from - 发车站名称(САНКТ-ПЕТЕРБУРГ)
- where - 到达站名称(КИРОВ ПАСС)
- date - 出发日期(27.03.2016)
- fromCode - 发站代码(2004000)
- whereCode - 到站代码(2060600)
列车数组包含
-
date0 - 发车日期
-
date0 - 到站日期
-
time0 - 发车时间
-
time1 - 到站时间
-
route0 - 发站代码 С-ПЕТ-ЛАД
-
route1 - 到站代码 ТЮМЕНЬ
-
number - 列车号
-
timeInWay - 行车时间
-
brand - 列车名称(德米特里耶夫号特快列车)
-
carrier - 列车类型 ФПК(品牌列车)
-
cars - 自由座位数数组(卧铺、硬座和软卧)
-
cars.freeSeats - 自由座位数
-
cars.itype
-
cars.servCls
-
cars.tariff - 票价
-
cars.pt - 积分
-
cars.typeLoc - 完整名称(卧铺、软卧、硬卧、软座)
-
cars.type - 简称(卧铺、硬座、软卧)
-
time0 - 发车时间
-
tnum0 - 列车号
trainRoutesReturn - 获取列车路线、空余座位数、价格等,往返
接受参数,在第一个请求中是必需的参数
- layer_id - 子类别(5827)
在重复请求中是可选参数
- dir - 0 仅单向,1 - 往返
- tfl - 列车类型(1-所有,2-长途,3-电车)
- checkSeats - 在无空余座位的列车中查找
- code0 - 发车站代码
- code1 - 到达站代码
- dt0 - 出发日期
- dt1 - 返回日期
返回的结果与 trainRoutes 方法相同,但包含两个数组,第一个数组为去程,第二个数组为返程
trainCarriages - 获取车厢列表、空余座位、车厢布局、票价、类型和服务等级
在重复查询时为可选参数
- dir - 0 仅单向,1 - 往返
- code0 - 发车站代码
- code1 - 到达站代码
- dt0 - 发车日期(2016年3月28日)
- time0 - 发车时间(15:30)
- tnum0 - 车厢号(072Е)
返回以下车厢数组
-
以上请求的标准返回结果
-
cnumber - 车厢号
-
type - 车厢类型
-
typeLoc - 完整名称(卧铺、软卧、硬卧、软座)
-
clsType - 2L, 2Э
-
tariff - 票价
-
tariffServ - 服务费
-
seats - 座位数组
-
seats.type - 简称(up)
-
seats.free - 座位数
-
seats.label - 完整名称(上层)
-
schemes - 车厢布局
-
html - json 格式的车厢布局数组(占用、空余、下层、上层、洗手间等),如需解析请使用单独的方法(如果有时间我会做)
-
image - 图片链接
-
insuranceCompany - 保险公司数组及其保险规则
-
shortName - 组织名称
-
offerUrl - 规则文件链接,通常是 PDF 文件
trainStationList - 获取当前路线中所有站点的列表
示例请求 http://pass.rzd.ru/timetable/public/ru?layer_id=5804&train_num=072%D0%95&date=13.03.2016 通过未加密的协议 http://
数据获取格式 XML
接受参数,在第一个请求中是必需的参数
- layer_id - 子类别(5804)
在重复查询时为可选参数
- train_num - 列车号 072Е
- date - 发车日期 13.03.2016
返回以下站点数组
- Station - 站点名称
- Code - 站点代码
- ArvTime - 到站时间
- WaitingTime - 停站时间
- DepTime - 发车时间
- Distance - 行驶距离
stationCode - 获取站点代码列表
接受参数
- stationNamePart - 站点名称的一部分,至少2个字符
- lang - 语言,默认 'ru',
- compactMode - 默认 'y'
返回找到的数据数组
- station - 站点名称
- code - 站点代码
例如,当 stationNamePart = 'ЧЕБ' 时,将返回以 'ЧЕБ' 开头的所有站点(11个站点)
许可证
该类是开源软件,根据 MIT 许可证 许可