-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtrain_table_search.go
112 lines (104 loc) · 4.22 KB
/
train_table_search.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package main
import (
"fmt"
"github.com/go-resty/resty"
"github.com/liyu4/tablewriter"
"github.com/tidwall/gjson"
"os"
"strings"
)
const (
baseTicketParseURL string = "https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date={date}&leftTicketDTO.from_station={from}&leftTicketDTO.to_station={to}&purpose_codes={ticketType}"
)
const (
HXHBed int = 33 // 动卧
SeatBusiness int = 32 // 商务座
SeatFirst int = 31 // 一等座
SeatSecond int = 30 // 二等座
HardSeat int = 29 // 硬座
HardBed int = 28 // 硬卧
NoSeat int = 26 // 无座
SeatSpecial int = 25 // 特等座
SoftSeat int = 23 // 软座
)
type TrainTable struct {
FromStation string
ToStation string
Date string
PurposeCodes string
RestClient *resty.Client
TableURL string
}
func (t *TrainTable) runParser() *TrainTable {
dataResp, err := t.RestClient.R().
SetHeader("Host", "kyfw.12306.cn").
SetHeader("Referer", "https://kyfw.12306.cn/otn/leftTicket/init").
SetHeader("Cookie", "JSESSIONID=962FAEAB08FA8C00A10A471326B20B4E;").
SetHeader("User-Agent", userAgent).
SetHeader("X-Requested-With", "XMLHttpRequest").
Get(t.TableURL)
if err != nil {
logger.Fatalf("[12306查询助手]查询异常, 错误原因: %v", err)
}
if dataResp != nil {
jsonData := gjson.Parse(dataResp.String())
table := tablewriter.NewColorWriter(os.Stdout)
table.SetAlignment(tablewriter.ALIGN_LEFT)
table.SetHeader([]string{"车次", "始发站", "终到站", "出发站", "到达站", "出发时间", "到达时间", "历时", "商务/特等座", "一等座", "二等座", "动卧", "硬卧", "软座", "硬座", "无座"})
for _, data := range jsonData.Get("data").Get("result").Array() {
rowData := strings.Split(data.String(), "|")
// 解析表格
trainCode := fmt.Sprintf("%s", rowData[3])
BeginStation := fmt.Sprintf("\033[31m(始)\033[0m:%s", codeToStation[rowData[4]])
EndStation := fmt.Sprintf("\033[32m(终)\033[0m:%s", codeToStation[rowData[5]])
FromStation := fmt.Sprintf("%s", codeToStation[rowData[6]])
ToStation := fmt.Sprintf("%s", codeToStation[rowData[7]])
FromStationStartTime := fmt.Sprintf("出发时间: %s", rowData[8])
ToStationArriveTime := fmt.Sprintf("到达时间: %s", rowData[9])
DurationTime := fmt.Sprintf("历时: %s", rowData[10])
TrainHeadSeat := fmt.Sprintf("商务/特等座: %s", If(len(rowData[SeatBusiness]) > 0, rowData[SeatBusiness], "--"))
TrainFirstSeat := fmt.Sprintf("一等座: %s", If(len(rowData[SeatFirst]) > 0, rowData[SeatFirst], "--"))
TrainSecondSeat := fmt.Sprintf("二等座: %s", If(len(rowData[SeatSecond]) > 0, rowData[SeatSecond], "--"))
TrainSpecialHXHBed := fmt.Sprintf("动卧: %s", If(len(rowData[HXHBed]) > 0, rowData[HXHBed], "--"))
TrainHardBed := fmt.Sprintf("硬卧: %s", If(len(rowData[HardBed]) > 0, rowData[HardBed], "--"))
TrainSoftSeat := fmt.Sprintf("软座: %s", If(len(rowData[SoftSeat]) > 0, rowData[SoftSeat], "--"))
TrainHardSeat := fmt.Sprintf("硬座: %s", If(len(rowData[HardSeat]) > 0, rowData[HardSeat], "--"))
TrainNoSeat := fmt.Sprintf("无座: %s", If(len(rowData[NoSeat]) > 0, rowData[NoSeat], "--"))
row := []string{
trainCode, BeginStation, EndStation, FromStation,
ToStation, FromStationStartTime, ToStationArriveTime, DurationTime,
TrainHeadSeat, TrainFirstSeat, TrainSecondSeat, TrainSpecialHXHBed,
TrainHardBed, TrainSoftSeat, TrainHardSeat, TrainNoSeat,
}
table.Append(row)
}
table.Render()
}
return t
}
func (t *TrainTable) initTrainTable() *TrainTable {
t.FromStation = stationToCode[t.FromStation]
if t.FromStation == "" {
logger.Fatalf("[12306查询助手]起始站输入有误!")
}
t.ToStation = stationToCode[t.ToStation]
if t.ToStation == "" {
logger.Fatalf("[12306查询助手]到达站输入有误!")
}
t.RestClient = resty.New()
t.TableURL = stringFormat(baseTicketParseURL, "{date}", t.Date, "{from}", t.FromStation, "{to}", t.ToStation, "{ticketType}", t.PurposeCodes)
return t
}
func NewTrainTable(from, to, date, purposeCodes string) *TrainTable {
if purposeCodes == "" {
purposeCodes = "ADULT"
}
table := &TrainTable{
FromStation: from,
ToStation: to,
Date: date,
PurposeCodes: purposeCodes,
}
table.initTrainTable()
return table
}