rzd-api 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rzd_api-1.0.0/PKG-INFO +391 -0
- rzd_api-1.0.0/README.md +359 -0
- rzd_api-1.0.0/mcp_server/__init__.py +0 -0
- rzd_api-1.0.0/mcp_server/server.py +204 -0
- rzd_api-1.0.0/pyproject.toml +57 -0
- rzd_api-1.0.0/rzd_api/__init__.py +6 -0
- rzd_api-1.0.0/rzd_api/api.py +95 -0
- rzd_api-1.0.0/rzd_api/client.py +122 -0
- rzd_api-1.0.0/rzd_api/config.py +12 -0
- rzd_api-1.0.0/rzd_api/query.py +86 -0
- rzd_api-1.0.0/rzd_api.egg-info/PKG-INFO +391 -0
- rzd_api-1.0.0/rzd_api.egg-info/SOURCES.txt +17 -0
- rzd_api-1.0.0/rzd_api.egg-info/dependency_links.txt +1 -0
- rzd_api-1.0.0/rzd_api.egg-info/entry_points.txt +2 -0
- rzd_api-1.0.0/rzd_api.egg-info/requires.txt +9 -0
- rzd_api-1.0.0/rzd_api.egg-info/top_level.txt +2 -0
- rzd_api-1.0.0/setup.cfg +4 -0
- rzd_api-1.0.0/tests/test_api.py +128 -0
- rzd_api-1.0.0/tests/test_client.py +117 -0
rzd_api-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rzd-api
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Python client for RZD (Russian Railways) pass.rzd.ru API
|
|
5
|
+
Author: drgod
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/drGOD/rzd-api
|
|
8
|
+
Project-URL: Repository, https://github.com/drGOD/rzd-api
|
|
9
|
+
Project-URL: Issues, https://github.com/drGOD/rzd-api/issues
|
|
10
|
+
Keywords: rzd,railway,trains,tickets,api,mcp
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
21
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
|
22
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
23
|
+
Requires-Python: >=3.10
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
Requires-Dist: requests>=2.31.0
|
|
26
|
+
Requires-Dist: urllib3>=2.0.0
|
|
27
|
+
Provides-Extra: mcp
|
|
28
|
+
Requires-Dist: mcp>=1.0.0; extra == "mcp"
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
31
|
+
Requires-Dist: rzd-api[mcp]; extra == "dev"
|
|
32
|
+
|
|
33
|
+
# RZD API — Python
|
|
34
|
+
|
|
35
|
+
Python-клиент для API сайта [pass.rzd.ru](https://pass.rzd.ru) (РЖД).
|
|
36
|
+
Включает MCP-сервер для интеграции с Claude и другими MCP-совместимыми клиентами.
|
|
37
|
+
|
|
38
|
+
## Возможности
|
|
39
|
+
|
|
40
|
+
- Маршруты в одну сторону
|
|
41
|
+
- Маршруты туда-обратно
|
|
42
|
+
- Список вагонов (схема, цены, свободные места)
|
|
43
|
+
- Список станций по маршруту следования поезда
|
|
44
|
+
- Поиск кода станции по части названия
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Установка
|
|
49
|
+
|
|
50
|
+
**Из PyPI после публикации:**
|
|
51
|
+
```sh
|
|
52
|
+
pip install rzd-api
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Как библиотека без MCP-зависимостей:**
|
|
56
|
+
```sh
|
|
57
|
+
pip install rzd-api
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**С поддержкой MCP-сервера:**
|
|
61
|
+
```sh
|
|
62
|
+
pip install "rzd-api[mcp]"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Напрямую из GitHub:**
|
|
66
|
+
```sh
|
|
67
|
+
pip install "git+https://github.com/drGOD/rzd-api.git"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Напрямую из GitHub c MCP-сервером:**
|
|
71
|
+
```sh
|
|
72
|
+
pip install "rzd-api[mcp] @ git+https://github.com/drGOD/rzd-api.git"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Из исходников:**
|
|
76
|
+
```sh
|
|
77
|
+
pip install .
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Из исходников c MCP-сервером:**
|
|
81
|
+
```sh
|
|
82
|
+
pip install ".[mcp]"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Для разработки (с тестами):**
|
|
86
|
+
```sh
|
|
87
|
+
pip install -e ".[dev]"
|
|
88
|
+
# или
|
|
89
|
+
make install
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Проверка импорта после установки:**
|
|
93
|
+
```sh
|
|
94
|
+
python -c "from rzd_api import RzdClient; print(RzdClient.__name__)"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Проверка MCP-команды после установки extra:**
|
|
98
|
+
```sh
|
|
99
|
+
rzd-mcp-server
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Быстрый старт
|
|
105
|
+
|
|
106
|
+
### Как библиотека
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
from datetime import date
|
|
110
|
+
from rzd_api import RzdClient
|
|
111
|
+
|
|
112
|
+
client = RzdClient()
|
|
113
|
+
|
|
114
|
+
# Можно передавать названия станций, клиент сам найдёт их коды
|
|
115
|
+
tickets = client.search_tickets(
|
|
116
|
+
from_station='Санкт-Петербург',
|
|
117
|
+
to_station='Москва',
|
|
118
|
+
departure_date=date(2026, 4, 1),
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
for train in tickets[:3]:
|
|
122
|
+
print(train['number'], train['route0'], train['route1'], train['time0'], train['time1'])
|
|
123
|
+
|
|
124
|
+
# Туда-обратно
|
|
125
|
+
round_trip = client.search_tickets(
|
|
126
|
+
from_station='Санкт-Петербург',
|
|
127
|
+
to_station='Москва',
|
|
128
|
+
departure_date='01.04.2026',
|
|
129
|
+
return_date='05.04.2026',
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
# Поиск станций и получение кода
|
|
133
|
+
stations = client.find_stations('Чеб')
|
|
134
|
+
code = client.resolve_station_code('Москва')
|
|
135
|
+
|
|
136
|
+
# Детали по вагонам
|
|
137
|
+
cars = client.get_carriages(
|
|
138
|
+
from_station='Санкт-Петербург',
|
|
139
|
+
to_station='Москва',
|
|
140
|
+
departure_date='01.04.2026',
|
|
141
|
+
departure_time='22:30',
|
|
142
|
+
train_number='054А',
|
|
143
|
+
)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Низкоуровневый API
|
|
147
|
+
|
|
148
|
+
```python
|
|
149
|
+
from datetime import datetime, timedelta
|
|
150
|
+
from rzd_api import Api, Config
|
|
151
|
+
|
|
152
|
+
config = Config(
|
|
153
|
+
language='ru', # язык ответа: 'ru' или 'en'
|
|
154
|
+
timeout=10.0, # таймаут запроса в секундах
|
|
155
|
+
user_agent='Mozilla/5.0 ...',
|
|
156
|
+
referer='https://ticket.rzd.ru/',
|
|
157
|
+
# proxy='https://user:pass@host:port',
|
|
158
|
+
# debug=True, # включить HTTP-лог
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
api = Api(config) # config необязателен
|
|
162
|
+
|
|
163
|
+
tomorrow = (datetime.now() + timedelta(days=1)).strftime('%d.%m.%Y')
|
|
164
|
+
|
|
165
|
+
# Маршруты Санкт-Петербург → Москва
|
|
166
|
+
routes = api.train_routes({
|
|
167
|
+
'dir': 0, # 0 — в одну сторону
|
|
168
|
+
'tfl': 3, # 3 — поезда и электрички, 1 — только поезда, 2 — только электрички
|
|
169
|
+
'checkSeats': 1, # 1 — только с билетами, 0 — все поезда
|
|
170
|
+
'code0': '2004000', # код станции отправления
|
|
171
|
+
'code1': '2000000', # код станции прибытия
|
|
172
|
+
'dt0': tomorrow, # дата отправления dd.mm.yyyy
|
|
173
|
+
'md': 0, # 0 — без пересадок, 1 — с пересадками
|
|
174
|
+
})
|
|
175
|
+
print(routes) # JSON-строка
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## API
|
|
181
|
+
|
|
182
|
+
### `RzdClient(config=None, api=None)`
|
|
183
|
+
|
|
184
|
+
Высокоуровневый интерфейс для использования пакета как библиотеки.
|
|
185
|
+
Методы возвращают обычные Python-объекты (`list` / `dict`) и принимают станции как коды или названия.
|
|
186
|
+
|
|
187
|
+
| Метод | Описание |
|
|
188
|
+
|---|---|
|
|
189
|
+
| `search_tickets(from_station, to_station, departure_date, return_date=None, *, only_with_seats=True, include_transfers=False, transport_type='all')` | Удобный поиск билетов |
|
|
190
|
+
| `find_stations(query, compact_mode='y')` | Поиск станций по части названия |
|
|
191
|
+
| `resolve_station_code(station)` | Получить код станции по названию или вернуть переданный код |
|
|
192
|
+
| `get_carriages(from_station, to_station, departure_date, departure_time, train_number)` | Вагоны и свободные места |
|
|
193
|
+
| `get_route_stations(train_number, departure_date)` | Список станций маршрута |
|
|
194
|
+
|
|
195
|
+
#### `search_tickets`
|
|
196
|
+
|
|
197
|
+
| Параметр | Описание |
|
|
198
|
+
|---|---|
|
|
199
|
+
| `from_station` / `to_station` | Код станции (`2004000`) или название (`Санкт-Петербург`) |
|
|
200
|
+
| `departure_date` / `return_date` | `str`, `datetime.date` или `datetime.datetime` |
|
|
201
|
+
| `only_with_seats` | `True` — только поезда с билетами |
|
|
202
|
+
| `include_transfers` | `True` — искать варианты с пересадками |
|
|
203
|
+
| `transport_type` | `'trains'`, `'suburban'`, `'all'` |
|
|
204
|
+
|
|
205
|
+
### `Api(config=None)`
|
|
206
|
+
|
|
207
|
+
Низкоуровневый совместимый интерфейс. Методы ниже сохраняют текущее поведение и возвращают **JSON-строку**.
|
|
208
|
+
Если нужен Python-объект без `json.loads`, можно использовать парные методы с суффиксом `_data`.
|
|
209
|
+
|
|
210
|
+
| Метод | Описание |
|
|
211
|
+
|---|---|
|
|
212
|
+
| `train_routes(params)` | Маршруты в одну сторону |
|
|
213
|
+
| `train_routes_data(params)` | Маршруты в одну сторону как `list[dict]` |
|
|
214
|
+
| `train_routes_return(params)` | Маршруты туда-обратно |
|
|
215
|
+
| `train_routes_return_data(params)` | Маршруты туда-обратно как `dict` |
|
|
216
|
+
| `train_carriages(params)` | Вагоны и свободные места |
|
|
217
|
+
| `train_carriages_data(params)` | Вагоны и свободные места как `dict` |
|
|
218
|
+
| `train_station_list(params)` | Все станции на маршруте поезда |
|
|
219
|
+
| `train_station_list_data(params)` | Все станции на маршруте как `dict` |
|
|
220
|
+
| `station_code(params)` | Поиск кода станции по части названия |
|
|
221
|
+
| `station_code_data(params)` | Поиск кода станции как `list[dict]` |
|
|
222
|
+
|
|
223
|
+
#### `train_routes` / `train_routes_return`
|
|
224
|
+
|
|
225
|
+
| Параметр | Описание |
|
|
226
|
+
|---|---|
|
|
227
|
+
| `code0` | Код станции отправления |
|
|
228
|
+
| `code1` | Код станции прибытия |
|
|
229
|
+
| `dt0` | Дата отправления `dd.mm.yyyy` |
|
|
230
|
+
| `dt1` | Дата возврата `dd.mm.yyyy` (только для `train_routes_return`) |
|
|
231
|
+
| `dir` | `0` — в одну сторону, `1` — туда-обратно |
|
|
232
|
+
| `tfl` | `1` — поезда, `2` — электрички, `3` — всё |
|
|
233
|
+
| `checkSeats` | `1` — только с билетами, `0` — все |
|
|
234
|
+
| `md` | `0` — без пересадок, `1` — с пересадками |
|
|
235
|
+
|
|
236
|
+
#### `train_carriages`
|
|
237
|
+
|
|
238
|
+
| Параметр | Описание |
|
|
239
|
+
|---|---|
|
|
240
|
+
| `code0` / `code1` | Коды станций |
|
|
241
|
+
| `dt0` | Дата отправления `dd.mm.yyyy` |
|
|
242
|
+
| `time0` | Время отправления `HH:MM` |
|
|
243
|
+
| `tnum0` | Номер поезда (например `054Г`) |
|
|
244
|
+
|
|
245
|
+
#### `train_station_list`
|
|
246
|
+
|
|
247
|
+
| Параметр | Описание |
|
|
248
|
+
|---|---|
|
|
249
|
+
| `trainNumber` | Номер поезда (например `054Г`) |
|
|
250
|
+
| `depDate` | Дата отправления `dd.mm.yyyy` |
|
|
251
|
+
|
|
252
|
+
#### `station_code`
|
|
253
|
+
|
|
254
|
+
| Параметр | Описание |
|
|
255
|
+
|---|---|
|
|
256
|
+
| `stationNamePart` | Часть названия станции (мин. 2 символа, например `ЧЕБ`) |
|
|
257
|
+
| `compactMode` | Формат ответа, по умолчанию `y` |
|
|
258
|
+
|
|
259
|
+
### `Config`
|
|
260
|
+
|
|
261
|
+
| Поле | По умолчанию | Описание |
|
|
262
|
+
|---|---|---|
|
|
263
|
+
| `language` | `'ru'` | Язык ответа (`'ru'`, `'en'`) |
|
|
264
|
+
| `timeout` | `5.0` | Таймаут запроса (сек) |
|
|
265
|
+
| `debug` | `False` | HTTP-лог в stderr (уровень DEBUG) |
|
|
266
|
+
| `proxy` | `None` | URL прокси |
|
|
267
|
+
| `user_agent` | `None` | User-Agent |
|
|
268
|
+
| `referer` | `None` | Referer |
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## MCP-сервер
|
|
273
|
+
|
|
274
|
+
MCP-сервер позволяет использовать API РЖД напрямую из Claude Desktop или любого MCP-клиента.
|
|
275
|
+
|
|
276
|
+
Для локального запуска нужен extra `mcp`:
|
|
277
|
+
```sh
|
|
278
|
+
pip install "rzd-api[mcp]"
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Инструменты
|
|
282
|
+
|
|
283
|
+
| Инструмент | Описание |
|
|
284
|
+
|---|---|
|
|
285
|
+
| `train_routes` | Поиск поездов в одну сторону |
|
|
286
|
+
| `train_routes_return` | Поиск поездов туда-обратно |
|
|
287
|
+
| `train_carriages` | Информация о вагонах |
|
|
288
|
+
| `train_station_list` | Станции на маршруте |
|
|
289
|
+
| `station_code` | Поиск кода станции |
|
|
290
|
+
|
|
291
|
+
### Запуск локально (stdio)
|
|
292
|
+
|
|
293
|
+
```sh
|
|
294
|
+
rzd-mcp-server
|
|
295
|
+
# или
|
|
296
|
+
make run
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
**Настройка в Claude Desktop** (`~/Library/Application Support/Claude/claude_desktop_config.json`):
|
|
300
|
+
|
|
301
|
+
```json
|
|
302
|
+
{
|
|
303
|
+
"mcpServers": {
|
|
304
|
+
"rzd": {
|
|
305
|
+
"command": "rzd-mcp-server"
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### Запуск через Docker (HTTP)
|
|
312
|
+
|
|
313
|
+
```sh
|
|
314
|
+
docker compose up -d
|
|
315
|
+
# или
|
|
316
|
+
make docker-up
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
Сервер запустится на `http://localhost:8000` (транспорт `streamable-http`).
|
|
320
|
+
|
|
321
|
+
**Настройка в Claude Desktop** для удалённого сервера:
|
|
322
|
+
|
|
323
|
+
```json
|
|
324
|
+
{
|
|
325
|
+
"mcpServers": {
|
|
326
|
+
"rzd": {
|
|
327
|
+
"type": "streamable-http",
|
|
328
|
+
"url": "http://localhost:8000/mcp"
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Переменные окружения MCP-сервера
|
|
335
|
+
|
|
336
|
+
| Переменная | По умолчанию | Описание |
|
|
337
|
+
|---|---|---|
|
|
338
|
+
| `MCP_TRANSPORT` | `stdio` | Транспорт: `stdio`, `sse`, `streamable-http` |
|
|
339
|
+
| `MCP_HOST` | `0.0.0.0` | Хост для HTTP-транспортов |
|
|
340
|
+
| `MCP_PORT` | `8000` | Порт для HTTP-транспортов |
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Docker
|
|
345
|
+
|
|
346
|
+
```sh
|
|
347
|
+
# Сборка образа
|
|
348
|
+
docker build -t rzd-api .
|
|
349
|
+
|
|
350
|
+
# Запуск
|
|
351
|
+
docker run -p 8000:8000 rzd-api
|
|
352
|
+
|
|
353
|
+
# С кастомным портом
|
|
354
|
+
docker run -p 9000:9000 -e MCP_PORT=9000 rzd-api
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
---
|
|
358
|
+
|
|
359
|
+
## Тесты
|
|
360
|
+
|
|
361
|
+
```sh
|
|
362
|
+
pytest tests/ -v
|
|
363
|
+
# или
|
|
364
|
+
make test
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
Тесты интеграционные — работают с живым API pass.rzd.ru.
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## Как работает протокол RZD
|
|
372
|
+
|
|
373
|
+
1. Первый запрос возвращает статус `RID` / `REQUEST_ID` + cookie
|
|
374
|
+
2. Повторный запрос с тем же `rid` и cookie возвращает статус `OK` с данными
|
|
375
|
+
3. Библиотека управляет сессией и повторными запросами автоматически (до 10 попыток, интервал 1 сек)
|
|
376
|
+
|
|
377
|
+
## Популярные коды станций
|
|
378
|
+
|
|
379
|
+
| Станция | Код |
|
|
380
|
+
|---|---|
|
|
381
|
+
| Санкт-Петербург Главный | `2004000` |
|
|
382
|
+
| Москва (Ленинградский вокзал) | `2000000` |
|
|
383
|
+
| Москва (Казанский вокзал) | `2000001` |
|
|
384
|
+
| Новосибирск Главный | `2060600` |
|
|
385
|
+
| Екатеринбург Пасс. | `2030000` |
|
|
386
|
+
|
|
387
|
+
Для поиска кода любой станции используйте метод `station_code`.
|
|
388
|
+
|
|
389
|
+
## Лицензия
|
|
390
|
+
|
|
391
|
+
MIT
|