爱意满满的作品展示区。
liyu4

##简单,好玩,有趣的命令行版 12306( golang)

  •  
  •   liyu4 · Jan 25, 2017 · 7411 views
    This topic created in 3570 days ago, the information mentioned may be changed or developed.

    ##前言 17 年的春节即将临近的时候,跟大多数人一样都需要抢一下回家的票,庆幸我买到了回家的票,因为目的地离家还有一段距离,所以需要知道到达的时间,然后安排下中转回家的行程。就想到如果再 terminal 中直接可以查就好了,接着就是 google 了一下,果然网上有很多类似的东西,但是查询火车时刻表的功能好像没有,那就自己写吧。

    ##环境

    1. chrome
    2. mac

    ##项目地址 https://github.com/JingDa-open-source-community/go-home

    ##旅途 从 12306 官网开始 ###查找火车时刻表 api 登陆 12306 输入出发地和目的地,会出来很多车子,然后选择你已经买到的那趟。见下图。 打开调试工具 command+shift+j ),查看网络,可以看到请求的 url ,点击这个 url 可以看到返回一个 json ,包含了这趟车的时刻信息和其他的一些状态信息

    时刻表 url--》 https://kyfw.12306.cn/otn/czxx/queryByTrainNo?train_no=5l000G138920&from_station_telecode=AOH&to_station_telecode=NXG&depart_date=2017-01-25 ,可以看到中间有 train_no 车次编号 from_station_telecode 出发站(代号) to_station_telecode 到达站(代号) depart_date 出发日期,重点看一下车次编号是一个经过了处理的数据,这趟车是 G1389 后面还带了两个数,出发城市和到达城市也是一个映射关系。 google 一下发现城市的映射关系保存在 https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8968 ,这样我们通过一些简单的处理就能得到城市和相对应的代码,很容易想到把他们放在一个 map 里面是再好不过的。

    下面是完整的处理:

    func Stations(stationTetx []byte) map[string]string {
       comp, _ := regexp.Compile("([\u4e00-\u9fa5]+)\\|([A-Z]+)")
    
       datas := comp.FindAll(stationTetx, -1)
    
       cityMap2Code := make(map[string]string, len(datas))
       for _, v := range datas {
       	temp := strings.Split(string(v), "|")
       	cityMap2Code[temp[0]] = temp[1]
       }
       return cityMap2Code
    }
    

    还有一个问题就是车次编号的代码是如何生成的,好在他们也是可以通过 url 访问到的。 https://kyfw.12306.cn/otn/resources/js/query/train_list.js?scriptVersion=1.5462 这个文件稍微有些大,我们经过一次处理保存在了本地(最好的方式是保存的 mysql 中,但是鉴于这是一个简单的项目就没有这样做),大概的形式是:

    {
      "2017-01-03": {
        "1095": {
          "Train_no": "270000109500",
          "From": "太原",
          "To": "兰州西"
        }
        // 省略很多
     }
       
    

    可以看到这个结构包含一趟车的时间,车次,车次编号,出发地和终点。

    ##渲染数据 terminal 中显示表格的包有很多,我用了 github 上的 tablewriter ,他的使用是很简单。你也可以加一些自己的序列化控制符,事实上我也是这样干的。

    ###最终效果 查询火车时刻表: 查询火车余票

    33 replies  •  2017-02-26 01:20:38 +08:00
    JackyBao
    JackyBao
    Jan 25, 2017 via Android
    1
    挺好玩的
    carnival
    carnival
    Jan 25, 2017
    2
    好
    liyu4
    liyu4
    OP
    Jan 25, 2017
    3
    @JackyBao 这次是年前的最后版本了。谢谢喜欢!
    JackyBao
    JackyBao
    Jan 25, 2017 via Android
    4
    @liyu4 年后回来再加个智能换乘吧,速度最快,价格最低这种,这样会好玩很多。
    Unknwon
    Unknwon
    Jan 25, 2017
    5
    厉害了!支持一下
    horipse
    horipse
    Jan 26, 2017
    6
    有点类似机票 eTerm 系统啊...中航信那个
    liyu4
    liyu4
    OP
    Jan 26, 2017
    7
    @JackyBao 不是特别明白
    liyu4
    liyu4
    OP
    Jan 26, 2017
    8
    @Unknwon 哈哈
    liyu4
    liyu4
    OP
    Jan 26, 2017
    9
    @horipse 是吧 没接触过
    JackyBao
    JackyBao
    Jan 26, 2017
    10
    @liyu4 就是比如我要从上海到北京,直达票没有了,自动找出中转有票的车站。这样可以解决一些春运票难买的问题。
    aheadlead
    aheadlead
    Jan 26, 2017
    11
    赞一个!
    liyu4
    liyu4
    OP
    Jan 27, 2017
    12
    @JackyBao 这样运算量会不会有点大?
    liyu4
    liyu4
    OP
    Jan 27, 2017
    13
    @aheadlead 谢谢! 新年快乐!
    JackyBao
    JackyBao
    Jan 27, 2017 via iPad
    14
    @liyu4 不大的吧?以前那种查公交换乘的软件,不都是这样的吗?
    aheadlead
    aheadlead
    Jan 28, 2017
    15
    @liyu4 话说你觉得可以把 12306 网络交互的部分单独写一个库吗
    liyu4
    liyu4
    OP
    Jan 28, 2017
    16
    @aheadlead 有这个必要吗?
    liyu4
    liyu4
    OP
    Jan 28, 2017
    17
    @JackyBao 你有例子吗?
    yuedingwangji
    yuedingwangji
    Jan 30, 2017
    18
    不知道能否加入输入目的地和出发点,没找到的时候直接出中转介绍的路线
    mingyun
    mingyun
    Feb 5, 2017
    19
    赞
    liyu4
    liyu4
    OP
    Feb 6, 2017 via iPhone
    20
    @yuedingwangji 出发点和目的地是支持输入的,现在还没有实现推荐中转路线。
    liyu4
    liyu4
    OP
    Feb 6, 2017 via iPhone
    21
    @mingyun 谢谢!
    liyu4
    liyu4
    OP
    Feb 6, 2017
    22
    @yuedingwangji 看了下官网的,一般都要自己输入中转站。
    liyu4
    liyu4
    OP
    Feb 6, 2017
    23
    @yuedingwangji 12306 提供了手动输入和自动推荐
    houxg09
    houxg09
    Feb 7, 2017
    24
    在 github 找到一个类似的 12306API 分析文章 https://github.com/metromancn/Parse12306
    我基于楼主和这篇文章的分析写了一个后端 https://github.com/houxg/12306-api ,可以输入车次及日期,以 JSON 格式输出时刻表
    liyu4
    liyu4
    OP
    Feb 7, 2017 via iPhone
    25
    @houxg09 看了你的 GitHub ,数据更新那块,就像你说的,要做成自动导入,和自动更新。我前天已经加了更新命令,话说你的 mysql 版本怎么那么低。
    houxg09
    houxg09
    Feb 7, 2017
    26
    @liyu 自动导入和更新的其实已经做了,只是在另外一个工程里,还没想好怎么加进去。 mysql 版本的问题,我用的是 community version
    yuedingwangji
    yuedingwangji
    Feb 8, 2017
    27
    @liyu4 12306 中转功能太烂了, 要自己输入, 好无语
    liyu4
    liyu4
    OP
    Feb 8, 2017
    28
    @yuedingwangji 12306 的特别差,如果自己不输入,推荐的结果是没有的,我用了一下携程的,自动推荐是 ok 的,这个 feature 就在下一个版本实现吧!
    yuedingwangji
    yuedingwangji
    Feb 9, 2017
    29
    @liyu4 恩 ,期待着
    liyu4
    liyu4
    OP
    Feb 9, 2017
    30
    @yuedingwangji 感觉是个大坑等我跳进去
    yuedingwangji
    yuedingwangji
    Feb 10, 2017
    31
    挖个大坑,相信你能跳过去
    liyu4
    liyu4
    OP
    Feb 25, 2017
    32
    @yuedingwangji 坑暂时填上了一大半,中转查询功能已经完成了,不过有点瑕疵,但是从早上到现在还没吃饭,我还是身体要紧,找到工作了再弄。 也算是兑现诺言
    yuedingwangji
    yuedingwangji
    Feb 26, 2017
    33
    @liyu4 辛苦了,我代表广大受众感谢你了!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1948 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 16:35 · PVG 00:35 · LAX 08:35 · JFK 11:35
    ♥ Do have faith in what you're doing.