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