簡單,好玩,有趣的命令列版12306(golang)
前言
17年的春節即將臨近的時候,跟大多數人一樣都需要搶一下回家的票,慶幸我買到了回家的票,因為目的地離家還有一段距離,所以需要知道到達的時間,然後安排下中轉回家的行程。就想到如果再terminal中直接可以查就好了,接著就是google了一下,果然網上有很多類似的東西,但是查詢火車時刻表的功能好像沒有,那就自己寫吧。
環境
- chrome
- 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/reso ... .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,他的使用是很簡單。你也可以加一些自己的序列化控制符,事實上我也是這樣乾的。
查詢火車時刻表
查詢火車餘票
更新本地資料
新增了對window console的color支援,同時支援cygwin和mysys 如果有同學願意和我一起做這個事情,隨時都歡迎!
相關文章
- 娛樂 | 14個簡單、有趣、好玩的Linux命令Linux
- 記錄 golang 命令列庫 cobra 的簡單使用Golang命令列
- 有趣的css—簡單的下雨效果2.0版CSS
- DB2_簡單命令列DB2命令列
- 用命令列去發掘有趣的“前十”命令列
- Python裡的17個“騷操作”好玩有趣Python
- 5個經典有趣的 Linux 命令列技巧Linux命令列
- 好玩的linux命令Linux
- Pet:一個簡單的命令列片段管理器命令列
- Golang命令列拷貝檔案Golang命令列
- golang flag簡單用法Golang
- 任天堂:遊戲最初的目的,不過是好玩和有趣遊戲
- 基於Golang的CLI 命令列程式開發Golang命令列
- Simple Laravel Cmd Gui - 簡單的 Windows 下的 命令列工具 GUILaravelGUIWindows命令列
- gRPC的Golang簡單應用RPCGolang
- Golang介面簡單瞭解Golang
- golang 切片簡單運用Golang
- transfer.sh:通過命令列簡單的建立檔案分享命令列
- 這款小程式可以生成有趣好玩可以炫耀的圖片
- 短小精悍之 Redis 命令列工具有趣的罕見用法Redis命令列
- 你值得了解的 10 個有趣的 Linux 命令列小技巧Linux命令列
- 終端中的樂趣:6個有趣的Linux命令列工具Linux命令列
- 用 Golang 跑「佇列任務」,也可以像 Laravel 一樣簡單Golang佇列Laravel
- Git常用的簡單命令Git
- Golang 對MongoDB的操作簡單封裝GolangMongoDB封裝
- 有趣常用的linux命令Linux
- 一道有趣的golang排錯題Golang
- git簡單命令Git
- zookeeper簡單命令
- docker簡單命令Docker
- Linux的命令列介面簡介Linux命令列
- 簡單解析C++基於Boost庫實現命令列C++命令列
- laravel 佇列的簡單使用Laravel佇列
- yiigo - 簡單易用的 Golang 輔助庫Golang
- golang開發一個簡單的grpcGolangRPC
- aix的幾個簡單命令AI
- rename命令的簡單應用
- C語言 簡單的佇列(陣列佇列)C語言佇列陣列