您的位置:首页 > 编程语言

始发 终点站 附近几站 全部查询 原来代码基本弃用 数组见上篇文章

2018-02-05 14:11 435 查看
# coding:utf-8

"""命令行火车票查看器

Usage:
tickets [-gdtkz] <from> <to> <date>

"""

import time
from docopt import docopt
from stations import stations
import requests
from prettytable import PrettyTable
from colorama import init, Fore

from tkMessageBox import *

import sys
reload(sys)
sys.setdefaultencoding('utf8')

g_date=""
g_from = ""
g_to = ""
g_list_record=[]
g_che = ""

requests.packages.urllib3.disable_warnings()

init()

class TrainsCollection:
#header = '车次 车站 时间 历时 一等 二等 高级软卧 软卧 硬卧 硬座 无座'.split()
header = '车次 车站 时间 历时 商务 一等 二等   高软 软卧 硬卧 软座 硬座 无座 其他'.split()

def __init__(self, available_trains,available_place, options):
"""查询的火车班次集合
:param available_trains: 一个列表, 包含可获得的火车班次, 每个
火车班次是一个字典
:param options: 查询的选项, 如高铁, 动车, etc...
"""
self.available_trains = available_trains
self.available_place = available_place
self.options = options
self.trains_no=[]

#@property
def get_train(self):
print "no--"
return self.trains_no
@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 initial in self.options:
global g_che
if train_no != g_che:
continue
self.trains_no.append({"no":train_no,"num":raw_train_list[2]})
#for i in raw_train_list:
#    print raw_train_list.index(i),":--",i
#print ""
global g_list_record

t_be = " %s-%s %s %s" % (raw_train_list[6],raw_train_list[7], raw_train_list[8],raw_train_list[9])
print "no_num list", g_che, train_no, g_from, g_to, g_date, raw_train_list[-7], t_be
#print "t_be", t_be, type(t_be)
dd = {"from":g_from, "to":g_to, "date":g_date, "二等":raw_train_list[-7],"no": train_no,"tbe":t_be,"duration":raw_train_list[8]}
if (dd not in g_list_record):
g_list_record.append(dd)
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[-5] if raw_train_list[-5] else '--',
raw_train_list[-6] if raw_train_list[-6] else '--',
raw_train_list[-7] if raw_train_list[-7] else '--',
raw_train_list[-8] if raw_train_list[-8] else '--',
raw_train_list[-9] if raw_train_list[-9] else '--',
raw_train_list[-10] if raw_train_list[-10] else '--',
raw_train_list[-11] if raw_train_list[-11] else '--',
raw_train_list[-12] if raw_train_list[-12] else '--',
raw_train_list[-13] if raw_train_list[-13] else '--',
raw_train_list[-14] if raw_train_list[-14] 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"""
import chardet
#print stations[0].name, type(stations[0].name)
#print __doc__,sys.stdin.encoding
arguments = docopt(__doc__)
print chardet.detect(arguments['<from>'])
aa = arguments['<from>'].decode("gb18030")

#print "---",type(aa),aa
#reload(sys)
#sys.setdefaultencoding("utf-8")
#bb = aa.decode('UTF-8')
#aa = str(arguments['<from>'])
#print type(bb),bb

#print arguments, arguments['<from>'],type(arguments['<from>'])
cc= 1
if (0==cc):
date = arguments['<date>']
from_s = arguments['<from>'].decode("gb18030")
to_s = arguments['<to>'].decode("gb18030")
else:
date = "2018-02-12"
from_s = u"杭州"
to_s = u"郑州"
from_station = stations.get(from_s)
to_station = stations.get(to_s)
#from_station = 'HGH'
#to_station ='ZZF'

#print date, from_station, to_station

url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(
date, from_station, to_station)
#print url
#url="https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2018-02-12&leftTicketDTO.from_station=HZH&leftTicketDTO.to_station=ZZF&purpose_codes=ADULT"
#https://kyfw.12306.cn/otn/czxx/queryByTrainNo?train_no=56000G187430&from_station_telecode=HGH&to_station_telecode=ZAF&depart_date=2018-02-12
print url
r = requests.get(url, verify=False)
#print r.json()
available_trains = r.json()['data']['result']
#print available_trains
available_place = r.json()['data']['map']
#print available_place
options = ''.join([
key for key, value in arguments.items() if value is True
])
c_train = TrainsCollection(available_trains,available_place, options)
c_train.pretty_print()
print c_train.get_train()

def find_list_trians(from_s, to_s, date, arguments):
from_station = stations.get(from_s)
to_station = stations.get(to_s)
#from_station = 'HGH'
#to_station ='ZZF'

#print date, from_station, to_station

url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(
date, from_station, to_station)
#print url
#url="https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2018-02-12&leftTicketDTO.from_station=HZH&leftTicketDTO.to_station=ZZF&purpose_codes=ADULT"
#https://kyfw.12306.cn/otn/czxx/queryByTrainNo?train_no=56000G187430&from_station_telecode=HGH&to_station_telecode=ZAF&depart_date=2018-02-12
print url
try:
r = requests.get(url, verify=False)
#print r.json()
available_trains = r.json()['data']['result']
#print available_trains
available_place = r.json()['data']['map']
#print available_place

options = ''.join([
key for key, value in arguments.items() if value is True
])
#print options, available_trains
trains_no = []
for raw_train in available_trains:
raw_train_list = raw_train.split('|')
train_no = raw_train_list[3]
initial = train_no[0].lower()
#print initial, train_no, raw_train_list[2]
if initial in options:
trains_no.append({"no": train_no, "num": raw_train_list[2]})
#print trains_no
return trains_no
except:
print "err url find_list_trians"
return ""
else:
print "-----------------"
return ""

def find_ticket(from_s, to_s, date, arguments):
'''
date = "2018-02-12"
from_s = u"杭州"
to_s = u"郑州"
'''
#arguments = docopt(__doc__)
'''
arguments = {'-d': False,
'-g': True,
'-k': False,
'-t': False,
'-z': False,
'<date>': '2018-02-12',
'<from>': '\xba\xbc\xd6\xdd',
'<to>': '\xd6\xa3\xd6\xdd'}
'''
from_station = stations.get(from_s)
to_station = stations.get(to_s)
#from_station = 'HGH'
#to_station ='ZZF'
print arguments
print date, from_station, to_station

url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes=ADULT'.format(
date, from_station, to_station)
#print url
#url="https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2018-02-12&leftTicketDTO.from_station=HZH&leftTicketDTO.to_station=ZZF&purpose_codes=ADULT"
#https://kyfw.12306.cn/otn/czxx/queryByTrainNo?train_no=56000G187430&from_station_telecode=HGH&to_station_telecode=ZAF&depart_date=2018-02-12
print "url",url
try:
r = requests.get(url, verify=False)

#print r.json()
available_trains = r.json()['data']['result']
print available_trains
available_place = r.json()['data']['map']
print available_place
options = ''.join([
key for key, value in arguments.items() if value is True
])
c_train = TrainsCollection(available_trains,available_place, options)
c_train.pretty_print()
except:
print "err url"
return False
else:
return True

def find_station(train_num):
url = 'https://kyfw.12306.cn/otn/czxx/queryByTrainNo?train_no=%s&from_station_telecode=HGH&to_station_telecode=ZAF&depart_date=2018-02-12' % train_num
print url
try:
r = requests.get(url, verify=False)
print r.json()
available_trains = r.json()['data']['data']

#print type(available_trains), available_trains, "find_station"
l_name = []
for i in available_trains:
#print i['station_no'], i['station_name']
l_name.append(i['station_name'])
return l_name
except:
print "err url find_station"
return ""
else:
return ""
#for idx, r in enumerate(available_trains):
#    print 'idx[%d]\tlevel: %d\t star: %d\t time: %d\t' % (idx, r['level'], r['star'], r['time'])
#available_place = r.json()['data']['map']

if __name__ == '__main__':
global g_to
global g_from
global g_date
global g_list_record
global g_che

num_diff = 3
l_date = ["2018-02-13", "2018-02-14"]
from_s = u"杭州东"
to_s = u"徐州东"
arguments = {'-d': False, '-g': True, '-k': False, '-t': False, '-z': False}
for k in range(0, 5):
l_num_no = find_list_trians(from_s, to_s, l_date[0], arguments)
if ("" != l_num_no):
break
time.sleep(5)
print type(l_num_no), l_num_no
for i in l_num_no:
print i
time.sleep(5)
while(True):
print "-- loop ---"
g_list_record = []
l_station_point = []

for i in l_num_no:
g_che = i['no']
print i
print "no_num", g_che, i['num']
for k in range(0, 5):
l_station_point = find_station(i['num'])
if ("" != l_station_point):
break
time.sleep(5)
time.sleep(5)

print "l_station_point",i['no'],l_num_no.index(i)
i_form = 0xff
i_to = 0xff
for l in l_station_point:
if from_s in l:
i_form = l_station_point.index(l)
break
#i_form = l_station_point.index(from_s)
for l in l_station_point:
if to_s in l:
i_to = l_station_point.index(l)
break
#i_to = l_station_point.index(to_s)
print i_form, i_to, "index"
for j in l_station_point:
print "cur station",j, i['no']
print num_diff, l_station_point.index(j), i_form, i_to, j
if (num_diff >= abs(l_station_point.index(j) - i_form) and l_station_point.index(j) < i_to):
g_from = j
g_to = to_s
for ld in l_date:
g_date = ld
for k in range(0,5):
print "send ", j, g_to,ld
if (find_ticket(j, g_to,ld, arguments)):
break
time.sleep(5)
time.sleep(5)

elif (num_diff >= abs(l_station_point.index(j) - i_to) and i_form < l_station_point.index(j)):
g_from = from_s
g_to = j
for ld in l_date:
g_date = ld
if (find_ticket(g_from, j,ld, arguments)):
break
time.sleep(5)
time.sleep(5)

else:
print "--not fill"
#'''
#break
print "------------------------------find done---------------------------"

flg = 0
with open("t.txt","wb") as f:
for i in g_list_record:
ss = "%s %s %s %s %s %s %s\n" % (i['no'], i['date'],i['from'].encode("UTF-8"),i['to'].encode("UTF-8"),i['二等'].encode("UTF-8"),i['tbe'], i['duration'])
print ss
f.write(ss)
print "----------------二等-----------------------------------------"
f.write("----------------二等-----------------------------------------\n")
for i in g_list_record:
if(u"无" != i['二等']):
ss = "%s %s %s %s %s %s %s\n" % (i['no'], i['date'], i['from'].encode("UTF-8"), i['to'].encode("UTF-8"), i['二等'].encode("UTF-8"),i['tbe'], i['duration'])
print ss
f.write(ss)
flg = 1

if (flg):
showinfo(title='Tip', message='二等座')
else:
time.sleep(5)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐