python打造12306余票实时监控
# encoding=utf-8
from Tkinter import *
from ScrolledText import ScrolledText
import urllib2
import json
import ssl
import time
import threading
'''
根据chrome 开发者模式取得城市代码参数,此步骤的目的通过中文去定位到对应英文城市代码
'''
citylist = open('C:\Users\Think\Desktop\citylist.txt')
city = citylist.read() # 把文件内容赋值给city
citylist.close()
# 取出城市对应代码,进行分割得到所需
tmp_c = city.split('@')
city_d = {}
for i in tmp_c:
if not i:
continue # 因为第一位为空所以判断如果为空则继续循环,不为空继续
city_d[i.split('|')[1]] = i.split('|')[2]
# 城市对应城市代码生成的dic
# 对应的座位类型,这里是硬卧
city_s = city_d['北京']
city_a = city_d['天津']
seat = 'queryLeftNewDTO'
yw = 'yw_num'
'''
12306证书验证会影响访问,所以要关闭掉
'''
ssl._create_default_https_context = ssl._create_unverified_context # 关闭证书验证
#格式化字符串,把往返城市和时间写入并且访问
def getList():
s_time = '2017-04-20'
html = urllib2.urlopen(
"https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=%s&leftTicketDTO.from_station=%s&leftTicketDTO.to_station=%s&purpose_codes=ADULT" % (
s_time, city_s, city_a))
content = html.read()
text1 = json.loads(content) # json不是一个类型是一种表达方式
# print text1
return text1 # 转换成dic
#根据座位类型查询火车票余票
def train_name():
train_name = getList()
for i in train_name['data']: # 通过键值取到想要的信息,这里有个坑需要注意,这个字典里面又嵌套了一个字典以queryLeftNewDTO作为key,同时它也是一个value
x = 0
while i[seat][yw] == u'无': # 如果没票打印无票并且循环直到有票
x += 1
time1 = time.strftime('%Y-%m-%d %H:%M:%S')
text.insert(END, u'检测时间%s:\n' % time1)
text.insert(END, u'第%d次查询:\n' % x)
text.insert(END, u'无票\n')
time.sleep(2)
else:
print u'有票%s'%(i[seat][yw])
# print u'第%d次查询:'%x
# print u'无票'
if i[seat][yw]!=u'无':#如果有票就打印出对应车次时间等等
tmp = u'''车次:%s
出发时间:%s
到达时间:%s
历时:%s
硬卧:%s\n''' % (i['queryLeftNewDTO']['station_train_code'], i['queryLeftNewDTO']['start_time'],
i['queryLeftNewDTO']['arrive_time'], i['queryLeftNewDTO']['lishi'], i[seat][yw])
text.insert(END,tmp)#将数据插入GUI用于显示
# print trainlist
#采用多线程进行处理
def start():
t1 = threading.Thread(target=train_name)
t1.start()
#建立一个GUI界面
root = Tk()
root.title(u'查询火车余票')
root.state("zoomed")
root.geometry('300x500')
text = ScrolledText(root, font=('微软雅黑', 16))
text.pack()
button = Button(root, text=u'开始抢票', font=('微软雅黑', 16), command=start) # target目标函数名字切记不要()不然点击按钮就失效了
button.pack()
root.mainloop()