简单、好玩、有趣的命令行版 12306(Golang)

pkry4798 8年前
   <h2>简单,好玩,有趣的命令行版12306(golang)</h2>    <h2>前言</h2>    <p>17年的春节即将临近的时候,跟大多数人一样都需要抢一下回家的票,庆幸我买到了回家的票,因为目的地离家还有一段距离,所以需要知道到达的时间,然后安排下中转回家的行程。就想到如果再terminal中直接可以查就好了,接着就是google了一下,果然网上有很多类似的东西,但是查询火车时刻表的功能好像没有,那就自己写吧。</p>    <h2>环境</h2>    <ol>     <li>chrome</li>     <li>mac</li>    </ol>    <h2>项目地址</h2>    <p><a href="/misc/goto?guid=4959735707930429790" rel="nofollow,noindex">https://github.com/JingDa-open-source-community/go-home</a></p>    <h2>旅途</h2>    <p>从12306官网开始</p>    <h3>查找火车时刻表api</h3>    <p>登陆12306输入出发地和目的地,会出来很多车子,然后选择你已经买到的那趟。见下图。</p>    <p><img src="https://simg.open-open.com/show/122aea53050f6df0f66ad33ea942be4c.jpg"></p>    <p>打开调试工具command+shift+j),查看网络,可以看到请求的url,点击这个url可以看到返回一个json,包含了这趟车的时刻信息和其他的一些状态信息</p>    <p><img src="https://simg.open-open.com/show/9717a9b393583a4b21e6b7d0b8bb4525.jpg"></p>    <p>时刻表url--》 <a href="https://kyfw.12306.cn/otn/czxx/queryByTrainNo?train_no=5l000G138920&from_station_telecode=AOH&to_station_telecode=NXG&depart_date=2017-01-25" rel="nofollow,noindex">https://kyfw.12306.cn/otn/czxx/queryByTrainNo?train_no=5l000G138920&from_station_telecode=AOH&to_station_telecode=NXG&depart_date=2017-01-25</a> ,可以看到中间有train_no车次编号from_station_telecode出发站(代号) to_station_telecode到达站(代号) depart_date出发日期,重点看一下车次编号是一个经过了处理的数据,这趟车是G1389后面还带了两个数,出发城市和到达城市也是一个映射关系。google一下发现城市的映射关系保存在 <a href="/misc/goto?guid=4959735708122056764" rel="nofollow,noindex">https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.8968</a> ,这样我们通过一些简单的处理就能得到城市和相对应的代码,很容易想到把他们放在一个map里面是再好不过的。</p>    <p>下面是完整的处理:</p>    <p>```</p>    <p>func Stations(stationTetx []byte) map[string]string {</p>    <p>comp, _ := regexp.Compile("([\u4e00-\u9fa5]+)\|([A-Z]+)")</p>    <pre>  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</pre>    <p>}</p>    <p>```</p>    <p>还有一个问题就是车次编号的代码是如何生成的,好在他们也是可以通过url访问到的。</p>    <p><a href="/misc/goto?guid=4959735708191137748" rel="nofollow,noindex">https://kyfw.12306.cn/otn/resources/js/query/train_list.js?scriptVersion=1.5462</a> 这个文件稍微有些大,我们经过一次处理保存在了本地(最好的方式是保存的mysql中,但是鉴于这是一个简单的项目就没有这样做),大概的形式是:</p>    <pre>  {   "2017-01-03": {   "1095": {   "Train_no": "270000109500",   "From": "太原",   "To": "兰州西"   }   // 省略很多   }  </pre>    <p>可以看到这个结构包含一趟车的时间,车次,车次编号,出发地和终点。</p>    <h2>渲染数据</h2>    <p>terminal中显示表格的包有很多,我用了github上的tablewriter,他的使用是很简单。你也可以加一些自己的序列化控制符,事实上我也是这样干的。</p>    <h3>最终效果</h3>    <p>查询火车时刻表:</p>    <p><img src="https://simg.open-open.com/show/8b81bebe21b3d09e27e01ec192965f2d.gif"></p>    <p>查询火车余票</p>    <p><img src="https://simg.open-open.com/show/3943a808bd4a89e17aa0bde091655563.gif"></p>    <p> </p>    <p>来自:https://www.zybuluo.com/aliasliyu4/note/641535</p>    <p> </p>