{"id":21865723,"url":"https://github.com/arnie97/moerail-tools","last_synced_at":"2025-10-13T14:32:23.276Z","repository":{"id":89005747,"uuid":"90232788","full_name":"Arnie97/moerail-tools","owner":"Arnie97","description":"The China Railway Toolbox with Python \u0026 SQL Interpreters","archived":false,"fork":false,"pushed_at":"2023-07-26T23:30:49.000Z","size":136,"stargazers_count":76,"open_issues_count":1,"forks_count":9,"subscribers_count":2,"default_branch":"bot","last_synced_at":"2025-08-02T09:43:15.178Z","etag":null,"topics":["12306","qqbot","userscript","win32"],"latest_commit_sha":null,"homepage":"https://greasyfork.org/scripts/33266","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Arnie97.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-05-04T07:12:17.000Z","updated_at":"2025-05-28T07:04:30.000Z","dependencies_parsed_at":"2025-04-14T21:08:25.109Z","dependency_job_id":"924be82f-5458-4e78-ba65-72395a150892","html_url":"https://github.com/Arnie97/moerail-tools","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Arnie97/moerail-tools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arnie97%2Fmoerail-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arnie97%2Fmoerail-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arnie97%2Fmoerail-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arnie97%2Fmoerail-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Arnie97","download_url":"https://codeload.github.com/Arnie97/moerail-tools/tar.gz/refs/heads/bot","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arnie97%2Fmoerail-tools/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279015739,"owners_count":26085748,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-13T02:00:06.723Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["12306","qqbot","userscript","win32"],"created_at":"2024-11-28T04:18:02.871Z","updated_at":"2025-10-13T14:32:23.259Z","avatar_url":"https://github.com/Arnie97.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 中国铁路 12306 工具箱\n\n用 Python 3 来检索[中国铁路客户服务中心](http://www.12306.cn)提供的各项数据。\n\n### 车站信息查询\n#### 依赖说明\n* 各联网访问 API 的组件均依赖 [requests](http://docs.python-requests.org)。\n* 如果你的 Python 版本低于 Python 3.5，则需安装标准库中新增的 [typing](https://pypi.python.org/pypi/typing)。\n* 可选装 [IPython](https://ipython.org) 来增强交互式终端的易用性。\n* `provinces.py` 依赖 [mwclient](https://mwclient.readthedocs.io) 来读取维基百科上的条目。\n\n#### 组件介绍\n* `hyfw.py` 交互式查询车站的电报码、TMIS 代码、所属省级行政区等。\n    - 请输入站名的拼音首字母，匹配方式为前方一致。\n        - 示例输入：`GLDS`\n        - 示例输出：`{ZMHZ: 嘎拉德斯汰, TMIS: 13188, DBM: GLC, PYM: GLDST, SSJC: 蒙, LJDM: 00004}`\n    - 数据来自[货运运费查询](http://hyfw.95306.cn/hyinfo/page/home-hyzx-yfss)页面。\n\n* `kyfw.py` 解析客运车站的电报码、拼音码、拼音等。\n    - 数据来自[车票预订](https://kyfw.12306.cn/otn/leftTicket/init)页面中的 [station_name.js](https://kyfw.12306.cn/otn/resources/js/framework/station_name.js)。\n\n* `tmis.py` 交互式查询车站的 TMIS 代码。\n    - 请输入汉字站名，匹配方式为前方一致。\n        - 示例输入：`津沪`\n        - 示例输出：`津沪所\t10348`\n    - 数据来自[货运营业站服务信息查询](http://hyfw.12306.cn/hyinfo/action/FwcszsAction_index?type=1)页面，该接口的亮点在于可以查到线路所及不办货车站的代码。感谢维基人 [N509FZ](https://zh.wikipedia.org/zh-cn/User:N509FZ/线路所) 指出此接口。\n\n* `dump.py` 从以上三个接口分别读取数据，合并重复数据，并保存于本地的 `station_name.js`。\n    - 发生合并冲突时，会弹出 Python Shell，以便用户准确解决。\n    - 输出结果已通过[铁路信息查询](https://moerail.ml)网站呈现。\n    - 输出结果的格式与 12306 网站提供的 `station_name.js` 相同，即以 `@` `|` 作为分隔符。\n\n* `provinces.py` 读取中文维基百科[各车站条目中的信息框](https://zh.wikipedia.org/zh-cn/Template:Infobox_China_railway_station)，查询车站所属的省级行政区，以填补 `station_name.js` 中的对应字段。\n\n* `stations.py` 启动一个 Shell，用于交互式查询上述 `station_name.js`（以及其他类似格式的文件）。\n    - 启动后首先会进入 Python 解释器，退出该解释器后则会进入 SQLite 解释器。\n    - 由于 SQL 中不能用编号代指字段，因此表中各字段依次用 A 至 Z 的字母命名。\n    - 示例：中国铁路名字最短的车站是？\n        - 输入：\n            ```python\n            sorted(s, key=lambda i: len(i[1]))[0]\n            ```\n            ```sql\n            SELECT * FROM s\n            ORDER BY LENGTH(b) ASC\n            LIMIT 1;\n            ```\n        - 输出：\n            ```python\n            ('son', '宋', 'SOB', '57368', '黑')\n            ```\n    - 思考题：请模仿[港铁的站名拼词](https://zh.wikipedia.org/zh-cn/港鐵文化#站名拼詞)。\n        ```\n        　利国\n        　布强格\n        　　万年\n        马三家\n        　李旺\n\n        宋城路\n        　东通化\n        　　百子湾\n        　创业村\n        　　兴隆店\n        ```\n\n### 车辆车次查询\n#### 依赖说明\n* 环境要求与[上一节](#车站信息查询)相同。\n* 可选装 [Pillow](https://pillow.readthedocs.io) 来自动显示验证码图片。\n* 如果安装有 Pillow 并启用了 Git 子模块 `captcha`，将自动识别验证码文字。\n\n#### 组件介绍\n* `wifi12306.py` 查询客运列车的运行时刻、交路、编组、动车组列车当日使用车底。\n    - 请输入联网售票的客运列车车次。\n\n* `tracking.py` 查询货运车辆的类别型号、编入列车车次、当前位置、装载货物类型、发站到站等。亦可查询经由铁路运输的集装箱。\n    - 请输入货运车辆的编号（七位纯数字）或集装箱的编号（四位大写字母，七位数字）。\n\n* `tickets.py` 启动 Python 解释器，查询两座车站之间的客运列车车次及确切的余票数量。需要登录 12306 账户。\n\n* `trains.py` 启动一个 Shell，用于交互式查询 `train_list.js` 中记录的车次。\n    - 示例：Z1 到 Z100 的一百个车次中，哪些车次目前闲置？\n        - 输入：\n            ```python\n            {'Z%d' % i for i in range(1, 101)}.difference(i[1] for i in t)\n            ```\n            ```sql\n            WITH range AS (SELECT 1 i UNION SELECT i + 1 FROM range WHERE i \u003c 100)\n            SELECT 'Z' || i FROM range\n            EXCEPT SELECT b FROM t;\n            ```\n        - 输出：\n            ```python\n            {'Z73', 'Z74', 'Z83', 'Z84'}\n            ```\n    - 示例：哪十座车站的始发车次最多？\n        - 输入：\n            ```python\n            from collections import Counter\n            distinct_trains = {i[0]: i[2] for i in t}\n            Counter(distinct_trains.values()).most_common(10)\n            ```\n            ```sql\n            SELECT c, COUNT(*) AS n\n            FROM (SELECT DISTINCT a, c FROM t)\n            GROUP BY c\n            ORDER BY n DESC\n            LIMIT 10;\n            ```\n        - 输出：\n            ```python\n            ('广州南', 384)\n            ('上海虹桥', 335)\n            ('北京西', 242)\n            ('北京南', 242)\n            ('上海', 193)\n            ('深圳北', 187)\n            ('西安北', 180)\n            ('北京', 175)\n            ('成都东', 161)\n            ('武汉', 132)\n            ```\n    - 数据来自[车次查询](https://kyfw.12306.cn/otn/queryTrainInfo/init)页面中的 [train_list.js](https://kyfw.12306.cn/otn/resources/js/query/train_list.js)。\n\n* `otp.py` 交互式查询某车次的正晚点信息。\n    - 请输入车次与车站。\n      - 示例输入：`6419 张辛 顺义 庙城 怀柔 统军庄 密云北`\n      - 示例输出：略\n    - 数据来自[正晚点查询](http://www.12306.cn/mormhweb/kyfw/lczwdcx)页面。\n\n### 交路查询\n#### 依赖说明\n* 交路数据来自于[新浪微博用户「CRH380AL动车组」](https://weibo.com/u/2646253421)编写的动车组交路查询软件。\n    - 在此对原作者坚持不懈的数据整理工作表示感谢。\n    - 运行以下各组件前，请先下载并启动上述软件。\n    - 由于上述软件系 Visual Basic 6.0 编写，因此交路查询相关的功能只能在 Windows 上运行。\n\n* 截图功能依赖 [Pillow](http://python-pillow.org)。\n    - 建议使用默认 DPI 与 Windows 经典主题，以保证图片正确裁切；参见 `mask.png`。\n    - 建议关闭 ClearType 使用点阵字体，以保证单色位图的清晰度。\n\n* 文字的提取依赖早期版本 Windows 的特定内存结构，参见 `internals.c`。\n    - 注意，Python 3.5 及以上版本不再支持早期版本的 Windows。\n    - 因此，建议使用 Windows XP 虚拟机安装 [Python 3.4](https://www.python.org/ftp/python/3.4.4/python-3.4.4.msi) 来运行下列组件。\n\n* 批量查询功能依赖 12306 提供的车次数据 [train_list.js](https://kyfw.12306.cn/otn/resources/js/query/train_list.js)。\n    - 因此，原软件中的少量车次因在 12306 上不存在而被遗漏，如 DJ7488 等。\n\n#### 组件介绍\n* `shot.py` 对单个车次进行查询，包括对动车组型号的提取及对整个窗口的截图。\n\n* `cache.py` 对 12306 上列出的所有车次进行批量查询。\n    - 输出的截图已通过[铁路信息查询](https://moerail.ml)网站呈现。\n\n* `group.py` 对批量查询的文本输出按照车型进行分组，并转存为 JSON 格式。\n    - 输出结果已用于[动车组交路查询](https://greasyfork.org/scripts/33266)浏览器扩展及[动车组查询 Android 客户端](https://github.com/Arnie97/webview-inject)。\n\n* `web.py` 基于 Flask 框架编写，响应浏览器的 HTTP 请求，动态返回截图。\n    - 由于该方案难以应对并发查询，且依赖 Windows 服务器，目前已被抛弃，仅作为开发历史予以保留。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farnie97%2Fmoerail-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farnie97%2Fmoerail-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farnie97%2Fmoerail-tools/lists"}