# 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)
始发 终点站 附近几站 全部查询 原来代码基本弃用 数组见上篇文章
最新推荐文章于 2020-07-08 11:55:39 发布