-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtickets.py
More file actions
96 lines (83 loc) · 3.48 KB
/
tickets.py
File metadata and controls
96 lines (83 loc) · 3.48 KB
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
# coding: utf-8
"""命令行火车票查看器
Usage:
tickets [-gdtkz] <from> <to> <date>
Options:
-h,--help 显示帮助菜单
-g 高铁
-d 动车
-t 特快
-k 快速
-z 直达
Example:
tickets 重庆 成都 2018-11-11
tickets -dg 重庆 杭州 2018-11-11
"""
import requests
from docopt import docopt
from stations import stations
from prettytable import PrettyTable
from colorama import init, Fore
init()
class TrainsCollection:
header = '车次 车站 时间 历时 一等 二等 高级软卧 软卧 硬卧 硬座 无座'.split()
def __init__(self, available_trains, available_place, options):
"""查询的火车班次集合
:param available_trains: 一个列表, 包含可获得的火车班次,每个火车班次是一个字典
:param options: 查询的选项,如高铁,动车 ...
"""
self.available_trains = available_trains
self.available_place = available_place
self.options = options
@property
def trains(self):
for raw_train in self.available_trains:
raw_train_list = raw_train.split('|')
train_no = raw_train_list[3]
initial = train_no[0].lower()
duration = raw_train_list[10]
if not self.options or initial in self.options:
train = [
train_no,
'\n'.join([Fore.LIGHTGREEN_EX + self.available_place[raw_train_list[6]] + Fore.RESET, #始发站
Fore.LIGHTRED_EX + self.available_place[raw_train_list[7]] + Fore.RESET]), #终点站
'\n'.join([Fore.LIGHTGREEN_EX + raw_train_list[8] + Fore.RESET,# 发车时间
Fore.LIGHTRED_EX + raw_train_list[9] + Fore.RESET]),# 到站时间
duration, #时长
raw_train_list[-6] if raw_train_list[-6] else '--',# 一等
raw_train_list[-7] if raw_train_list[-7] else '--',# 二等
raw_train_list[-15] if raw_train_list[-15] else '--',# 高级软卧
raw_train_list[-8] if raw_train_list[-8] else '--',# 软卧
raw_train_list[-14] if raw_train_list[-14] else '--',# 硬卧
raw_train_list[-11] if raw_train_list[-11] else '--',# 硬座
raw_train_list[-9] if raw_train_list[-9] else '--',# 无座
]
yield train
def pretty_print(self):
pt = PrettyTable()
pt._set_field_names(self.header)
for train in self.trains:
pt.add_row(train)
print(pt)
def cli():
"""command-line interface"""
arguments = docopt(__doc__)
from_station = stations.get(arguments['<from>'])
to_station = stations.get(arguments['<to>'])
date = arguments['<date>']
url = ('https://kyfw.12306.cn/otn/leftTicket/query?'
'leftTicketDTO.train_date={}&'
'leftTicketDTO.from_station={}&'
'leftTicketDTO.to_station={}&'
'purpose_codes=ADULT').format(
date, from_station, to_station
)
r = requests.get(url, verify=False)
available_trains = r.json()['data']['result']
available_place = r.json()['data']['map']
options = ''.join([
key for key, value in arguments.items() if value is True
])
TrainsCollection(available_trains, available_place, options).pretty_print()
if __name__ == "__main__":
cli()