Skip to content

The China Railway Toolbox with Python & SQL Interpreters

License

Notifications You must be signed in to change notification settings

Arnie97/moerail-tools

Repository files navigation

中国铁路 12306 工具箱

用 Python 3 来检索中国铁路客户服务中心提供的各项数据。

车站信息查询

依赖说明

  • 各联网访问 API 的组件均依赖 requests
  • 如果你的 Python 版本低于 Python 3.5,则需安装标准库中新增的 typing
  • 可选装 IPython 来增强交互式终端的易用性。
  • provinces.py 依赖 mwclient 来读取维基百科上的条目。

组件介绍

  • hyfw.py 交互式查询车站的电报码、TMIS 代码、所属省级行政区等。

    • 请输入站名的拼音首字母,匹配方式为前方一致。
      • 示例输入:GLDS
      • 示例输出:{ZMHZ: 嘎拉德斯汰, TMIS: 13188, DBM: GLC, PYM: GLDST, SSJC: 蒙, LJDM: 00004}
    • 数据来自货运运费查询页面。
  • kyfw.py 解析客运车站的电报码、拼音码、拼音等。

  • tmis.py 交互式查询车站的 TMIS 代码。

    • 请输入汉字站名,匹配方式为前方一致。
      • 示例输入:津沪
      • 示例输出:津沪所 10348
    • 数据来自货运营业站服务信息查询页面,该接口的亮点在于可以查到线路所及不办货车站的代码。感谢维基人 N509FZ 指出此接口。
  • dump.py 从以上三个接口分别读取数据,合并重复数据,并保存于本地的 station_name.js

    • 发生合并冲突时,会弹出 Python Shell,以便用户准确解决。
    • 输出结果已通过铁路信息查询网站呈现。
    • 输出结果的格式与 12306 网站提供的 station_name.js 相同,即以 @ | 作为分隔符。
  • provinces.py 读取中文维基百科各车站条目中的信息框,查询车站所属的省级行政区,以填补 station_name.js 中的对应字段。

  • stations.py 启动一个 Shell,用于交互式查询上述 station_name.js(以及其他类似格式的文件)。

    • 启动后首先会进入 Python 解释器,退出该解释器后则会进入 SQLite 解释器。
    • 由于 SQL 中不能用编号代指字段,因此表中各字段依次用 A 至 Z 的字母命名。
    • 示例:中国铁路名字最短的车站是?
      • 输入:
        sorted(s, key=lambda i: len(i[1]))[0]
        SELECT * FROM s
        ORDER BY LENGTH(b) ASC
        LIMIT 1;
      • 输出:
        ('son', '宋', 'SOB', '57368', '黑')
    • 思考题:请模仿港铁的站名拼词
       利国
       布强格
        万年
      马三家
       李旺
      
      宋城路
       东通化
        百子湾
       创业村
        兴隆店
      

车辆车次查询

依赖说明

  • 环境要求与上一节相同。
  • 可选装 Pillow 来自动显示验证码图片。
  • 如果安装有 Pillow 并启用了 Git 子模块 captcha,将自动识别验证码文字。

组件介绍

  • wifi12306.py 查询客运列车的运行时刻、交路、编组、动车组列车当日使用车底。

    • 请输入联网售票的客运列车车次。
  • tracking.py 查询货运车辆的类别型号、编入列车车次、当前位置、装载货物类型、发站到站等。亦可查询经由铁路运输的集装箱。

    • 请输入货运车辆的编号(七位纯数字)或集装箱的编号(四位大写字母,七位数字)。
  • tickets.py 启动 Python 解释器,查询两座车站之间的客运列车车次及确切的余票数量。需要登录 12306 账户。

  • trains.py 启动一个 Shell,用于交互式查询 train_list.js 中记录的车次。

    • 示例:Z1 到 Z100 的一百个车次中,哪些车次目前闲置?
      • 输入:
        {'Z%d' % i for i in range(1, 101)}.difference(i[1] for i in t)
        WITH range AS (SELECT 1 i UNION SELECT i + 1 FROM range WHERE i < 100)
        SELECT 'Z' || i FROM range
        EXCEPT SELECT b FROM t;
      • 输出:
        {'Z73', 'Z74', 'Z83', 'Z84'}
    • 示例:哪十座车站的始发车次最多?
      • 输入:
        from collections import Counter
        distinct_trains = {i[0]: i[2] for i in t}
        Counter(distinct_trains.values()).most_common(10)
        SELECT c, COUNT(*) AS n
        FROM (SELECT DISTINCT a, c FROM t)
        GROUP BY c
        ORDER BY n DESC
        LIMIT 10;
      • 输出:
        ('广州南', 384)
        ('上海虹桥', 335)
        ('北京西', 242)
        ('北京南', 242)
        ('上海', 193)
        ('深圳北', 187)
        ('西安北', 180)
        ('北京', 175)
        ('成都东', 161)
        ('武汉', 132)
    • 数据来自车次查询页面中的 train_list.js
  • otp.py 交互式查询某车次的正晚点信息。

    • 请输入车次与车站。
      • 示例输入:6419 张辛 顺义 庙城 怀柔 统军庄 密云北
      • 示例输出:略
    • 数据来自正晚点查询页面。

交路查询

依赖说明

  • 交路数据来自于新浪微博用户「CRH380AL动车组」编写的动车组交路查询软件。

    • 在此对原作者坚持不懈的数据整理工作表示感谢。
    • 运行以下各组件前,请先下载并启动上述软件。
    • 由于上述软件系 Visual Basic 6.0 编写,因此交路查询相关的功能只能在 Windows 上运行。
  • 截图功能依赖 Pillow

    • 建议使用默认 DPI 与 Windows 经典主题,以保证图片正确裁切;参见 mask.png
    • 建议关闭 ClearType 使用点阵字体,以保证单色位图的清晰度。
  • 文字的提取依赖早期版本 Windows 的特定内存结构,参见 internals.c

    • 注意,Python 3.5 及以上版本不再支持早期版本的 Windows。
    • 因此,建议使用 Windows XP 虚拟机安装 Python 3.4 来运行下列组件。
  • 批量查询功能依赖 12306 提供的车次数据 train_list.js

    • 因此,原软件中的少量车次因在 12306 上不存在而被遗漏,如 DJ7488 等。

组件介绍

  • shot.py 对单个车次进行查询,包括对动车组型号的提取及对整个窗口的截图。

  • cache.py 对 12306 上列出的所有车次进行批量查询。

  • group.py 对批量查询的文本输出按照车型进行分组,并转存为 JSON 格式。

  • web.py 基于 Flask 框架编写,响应浏览器的 HTTP 请求,动态返回截图。

    • 由于该方案难以应对并发查询,且依赖 Windows 服务器,目前已被抛弃,仅作为开发历史予以保留。