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

2017-01-25 22:08:13 +08:00
 liyu4

##前言 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 ,他的使用是很简单。你也可以加一些自己的序列化控制符,事实上我也是这样干的。

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

5782 次点击
所在节点    分享创造
33 条回复
JackyBao
2017-01-25 22:14:58 +08:00
挺好玩的
carnival
2017-01-25 22:17:08 +08:00
liyu4
2017-01-25 22:17:44 +08:00
@JackyBao 这次是年前的最后版本了。谢谢喜欢!
JackyBao
2017-01-25 22:21:09 +08:00
@liyu4 年后回来再加个智能换乘吧,速度最快,价格最低这种,这样会好玩很多。
Unknwon
2017-01-25 22:38:25 +08:00
厉害了!支持一下
horipse
2017-01-26 02:04:26 +08:00
有点类似机票 eTerm 系统啊...中航信那个
liyu4
2017-01-26 07:16:33 +08:00
@JackyBao 不是特别明白
liyu4
2017-01-26 07:16:45 +08:00
@Unknwon 哈哈
liyu4
2017-01-26 07:16:58 +08:00
@horipse 是吧 没接触过
JackyBao
2017-01-26 08:22:19 +08:00
@liyu4 就是比如我要从上海到北京,直达票没有了,自动找出中转有票的车站。这样可以解决一些春运票难买的问题。
aheadlead
2017-01-26 13:40:27 +08:00
赞一个!
liyu4
2017-01-27 23:22:24 +08:00
@JackyBao 这样运算量会不会有点大?
liyu4
2017-01-27 23:22:39 +08:00
@aheadlead 谢谢! 新年快乐!
JackyBao
2017-01-27 23:37:45 +08:00
@liyu4 不大的吧?以前那种查公交换乘的软件,不都是这样的吗?
aheadlead
2017-01-28 01:11:30 +08:00
@liyu4 话说你觉得可以把 12306 网络交互的部分单独写一个库吗
liyu4
2017-01-28 20:10:42 +08:00
@aheadlead 有这个必要吗?
liyu4
2017-01-28 20:12:26 +08:00
@JackyBao 你有例子吗?
yuedingwangji
2017-01-30 19:25:08 +08:00
不知道能否加入输入目的地和出发点,没找到的时候直接出中转介绍的路线
mingyun
2017-02-05 00:14:00 +08:00
liyu4
2017-02-06 09:07:03 +08:00
@yuedingwangji 出发点和目的地是支持输入的,现在还没有实现推荐中转路线。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/336932

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX