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

# 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值