# 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, Forefrom 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_trainsself.available_place = available_placeself.options = optionsself.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_cheif 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_recordt_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 traindef 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 urlr = 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 urltry: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_noexcept: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 argumentsprint date, from_station, to_stationurl = '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",urltry:r = requests.get(url, verify=False)#print r.json()
        available_trains = r.json()['data']['result']print available_trainsavailable_place = r.json()['data']['map']print available_placeoptions = ''.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_numprint urltry: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_nameexcept: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_toglobal g_fromglobal g_dateglobal g_list_recordglobal g_chenum_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_nofor i in l_num_no:print itime.sleep(5)while(True):print "-- loop ---"
        g_list_record = []l_station_point = []for i in l_num_no:g_che = i['no']print iprint "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, jif (num_diff >= abs(l_station_point.index(j) - i_form) and l_station_point.index(j) < i_to):g_from = jg_to = to_sfor ld in l_date:g_date = ldfor k in range(0,5):print "send ", j, g_to,ldif (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_sg_to = jfor ld in l_date:g_date = ldif (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 ssf.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 ssf.write(ss)flg = 1

        if (flg):showinfo(title='Tip', message='二等座')else:time.sleep(5)

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

  1. G304电量查询与灯光讲解(驱动下载见上篇文章)

    罗技鼠标G304电量查询与灯光变换代表不同含义的讲解 这里以罗技鼠标G304的装5号电池版本作为例子讲解,数据线充电版大同小异. 1.电量查询 罗技鼠标的电量查询可在驱动中找到,首先打开鼠标的驱动面板 ...

  2. java跨域权重_爱站权重查询 API 接口请求调用

    原标题:爱站权重查询 API 接口请求调用 爱站权重查询 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以GET/POST方式提交即可.爱站权重查询 API 接口可以 ...

  3. delphi 调用php接口_爱站权重查询 API 接口请求调用

    爱站权重查询 API 接口在网上已经很多且大都封装成了 API 供别人调用.支持前台跨域请求,以GET/POST方式提交即可.爱站权重查询 API 接口可以查询百度权重.搜狗等级.360权重.神马权重 ...

  4. 给AWStats关键词统计增加去百度,谷歌等搜索引擎的站内查询链接

    有时候看关键词的统计并不知道具体的关键词是从那个搜索引擎过来的,具体落到了自己网站的那个页面上.给AWStats的关键词列表增加了几个链接,直接指向相应关键词的在百度,谷歌,雅虎3个引擎上的站内搜索结 ...

  5. 航班实时起降查询调用代码实现

    航班实时起降查询代码实现功能: 当日航班,含国际 orgCity dstCity 通过始发城市查询航班 | flightNo 通过航班号查询航班. 接口名称:航班实时起降查询 接口平台:聚合数据 接口 ...

  6. php查询mysql放到数组中_php查询mysql数据库并将结果保存到数组的方法

    本文实例讲述了php查询mysql数据库并将结果保存到数组的方法..具体分析如下: 这里主要用到了mysql_fetch_assoc函数 mysql_fetch_assoc语法如下: array my ...

  7. mysql多表联查分页_sqlserver多表联合查询和多表分页查询的代码讲解

    sqlserver多表联合查询和多表分页查询的代码讲解 发布时间:2020-05-14 14:42:07 来源:亿速云 阅读:700 作者:Leah 这篇文章主要为大家详细介绍了sqlserver多表 ...

  8. mysql一对多前端实现_MySQL实现一对多查询的代码示例

    本篇文章给大家带来的内容是关于MySQL实现一对多查询的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 这次要实现的是一对多查询,使用 MySQL 的 group_conca ...

  9. 一站式快速自助建站-超低价0代码建站套餐助你轻松拥有自己的网站

    简介:一站式快速自助建站-超低价0代码建站套餐助你轻松拥有自己的网站 点击链接,一站式快速自助建站助你轻松拥有自己的网站 https://developer.aliyun.com/plan/activ ...

最新文章

  1. centos7开放端口
  2. 大型高并发系统的系统设计要点
  3. 【uni-app】动态计算图片高度且保持宽高比
  4. nx set 怎么实现的原子性_【redis进阶(1)】redis的Lua脚本控制(原子性)
  5. 记录x86调试命令总结
  6. MetadataType的使用
  7. 【289】◀▶ Python I/O 读写文本文件
  8. c语言中static变量
  9. python自动化输入不了中文_appium+python自动化61-中文输入乱码问题解决
  10. hdu 4442 Physical Examination
  11. malloc()与calloc区别
  12. 解析button和input type=”button”的区别
  13. MySQL入门:如何创建数据库?
  14. c语言中的makefile编写步骤详解
  15. c语言对英文字母循环加密,RSA加密算法(C语言实现)
  16. 每周分享第 18 期
  17. vue+css3 旋转木马效果
  18. 微信聊天软件测试用例设计,微信页面测试用例_20140819
  19. cpu.h-栈的宏定义-满减栈
  20. 推荐印度电影《起跑线》,让家长加入观影一点不为过

热门文章

  1. 百度地图开发只显示网格不显示地图信息
  2. SQL PASS西雅图之行——会议篇
  3. Reporting Services 在WIN7和2008下出现“授予的权限不足,无法执行此操作。 (rsAccessDenied)”的解决办...
  4. exploring spring
  5. net core 2 读取appsettings.json
  6. App专项测试之弱网测试
  7. 关于编写过程中进制之间的转换
  8. HTML5---offline application(application cache)
  9. 简明Linux命令行笔记:locate
  10. 老旧漏洞不修复,西部数据存储设备数据遭擦除