##简单,好玩,有趣的命令行版 12306( golang) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
liyu4
V2EX    分享创造

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

  •  
  •   liyu4 2017-01-25 22:08:13 +08:00 6470 次点击
    这是一个创建于 3193 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ##前言 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 条回复    2017-02-26 01:20:38 +08:00
    JackyBao
        1
    JackyBao  
       2017-01-25 22:14:58 +08:00 via Android
    挺好玩的
    carnival
        2
    carnival  
       2017-01-25 22:17:08 +08:00
    liyu4
        3
    liyu4  
    OP
       2017-01-25 22:17:44 +08:00
    @JackyBao 这次是年前的最后版本了。谢谢喜欢!
    JackyBao
        4
    JackyBao  
       2017-01-25 22:21:09 +08:00 via Android
    @liyu4 年后回来再加个智能换乘吧,速度最快,价格最低这种,这样会好玩很多。
    Unknwon
        5
    Unknwon  
       2017-01-25 22:38:25 +08:00
    厉害了!支持一下
    horipse
        6
    horipse  
       2017-01-26 02:04:26 +08:00
    有点类似机票 eTerm 系统啊...中航信那个
    liyu4
        7
    liyu4  
    OP
       2017-01-26 07:16:33 +08:00
    @JackyBao 不是特别明白
    liyu4
        8
    liyu4  
    OP
       2017-01-26 07:16:45 +08:00
    @Unknwon 哈哈
    liyu4
        9
    liyu4  
    OP
       2017-01-26 07:16:58 +08:00
    @horipse 是吧 没接触过
    JackyBao
        10
    JackyBao  
       2017-01-26 08:22:19 +08:00
    @liyu4 就是比如我要从上海到北京,直达票没有了,自动找出中转有票的车站。这样可以解决一些春运票难买的问题。
    aheadlead
        11
    aheadlead  
       2017-01-26 13:40:27 +08:00
    赞一个!
    liyu4
        12
    liyu4  
    OP
       2017-01-27 23:22:24 +08:00
    @JackyBao 这样运算量会不会有点大?
    liyu4
        13
    liyu4  
    OP
       2017-01-27 23:22:39 +08:00
    @aheadlead 谢谢! 新年快乐!
    JackyBao
        14
    JackyBao  
       2017-01-27 23:37:45 +08:00 via iPad
    @liyu4 不大的吧?以前那种查公交换乘的软件,不都是这样的吗?
    aheadlead
        15
    aheadlead  
       2017-01-28 01:11:30 +08:00
    @liyu4 话说你觉得可以把 12306 网络交互的部分单独写一个库吗
    liyu4
        16
    liyu4  
    OP
       2017-01-28 20:10:42 +08:00
    @aheadlead 有这个必要吗?
    liyu4
        17
    liyu4  
    OP
       2017-01-28 20:12:26 +08:00
    @JackyBao 你有例子吗?
    yuedingwangji
        18
    yuedingwangji  
       2017-01-30 19:25:08 +08:00
    不知道能否加入输入目的地和出发点,没找到的时候直接出中转介绍的路线
    mingyun
        19
    mingyun  
       2017-02-05 00:14:00 +08:00
    liyu4
        20
    liyu4  
    OP
       2017-02-06 09:07:03 +08:00 via iPhone
    @yuedingwangji 出发点和目的地是支持输入的,现在还没有实现推荐中转路线。
    liyu4
        21
    liyu4  
    OP
       2017-02-06 09:07:14 +08:00 via iPhone
    @mingyun 谢谢!
    liyu4
        22
    liyu4  
    OP
       2017-02-06 10:56:10 +08:00
    @yuedingwangji 看了下官网的,一般都要自己输入中转站。
    liyu4
        23
    liyu4  
    OP
       2017-02-06 10:57:57 +08:00
    @yuedingwangji 12306 提供了手动输入和自动推荐
    houxg09
        24
    houxg09  
       2017-02-07 00:28:45 +08:00
    在 github 找到一个类似的 12306API 分析文章 https://github.com/metromancn/Parse12306
    我基于楼主和这篇文章的分析写了一个后端 https://github.com/houxg/12306-api ,可以输入车次及日期,以 JSON 格式输出时刻表
    liyu4
        25
    liyu4  
    OP
       2017-02-07 07:50:34 +08:00 via iPhone
    @houxg09 看了你的 GitHub ,数据更新那块,就像你说的,要做成自动导入,和自动更新。我前天已经加了更新命令,话说你的 mysql 版本怎么那么低。
    houxg09
        26
    houxg09  
       2017-02-07 10:28:26 +08:00
    @liyu 自动导入和更新的其实已经做了,只是在另外一个工程里,还没想好怎么加进去。 mysql 版本的问题,我用的是 community version
    yuedingwangji
        27
    yuedingwangji  
       2017-02-08 01:42:56 +08:00
    @liyu4 12306 中转功能太烂了, 要自己输入, 好无语
    liyu4
        28
    liyu4  
    OP
       2017-02-08 11:49:24 +08:00
    @yuedingwangji 12306 的特别差,如果自己不输入,推荐的结果是没有的,我用了一下携程的,自动推荐是 ok 的,这个 feature 就在下一个版本实现吧!
    yuedingwangji
        29
    yuedingwangji  
       2017-02-09 00:17:35 +08:00
    @liyu4 恩 ,期待着
    liyu4
        30
    liyu4  
    OP
       2017-02-09 13:46:34 +08:00
    @yuedingwangji 感觉是个大坑等我跳进去
    yuedingwangji
        31
    yuedingwangji  
       2017-02-10 00:28:00 +08:00
    挖个大坑,相信你能跳过去
    liyu4
        32
    liyu4  
    OP
       2017-02-25 16:43:10 +08:00
    @yuedingwangji 坑暂时填上了一大半,中转查询功能已经完成了,不过有点瑕疵,但是从早上到现在还没吃饭,我还是身体要紧,找到工作了再弄。 也算是兑现诺言
    yuedingwangji
        33
    yuedingwangji  
       2017-02-26 01:20:38 +08:00
    @liyu4 辛苦了,我代表广大受众感谢你了!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 07:06 PVG 15:06 LAX 00:06 JFK 03:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86