最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

利用python代码写的12306订票代码

来源:动视网 责编:小采 时间:2020-11-27 14:35:05
文档

利用python代码写的12306订票代码

利用python代码写的12306订票代码:本文实例讲述了python代码写的12306订票代码,分享给大家供大家参考。 具体实现方法如下: import datetime import json import re import sys import time import Image import PyV8 import requests import to
推荐度:
导读利用python代码写的12306订票代码:本文实例讲述了python代码写的12306订票代码,分享给大家供大家参考。 具体实现方法如下: import datetime import json import re import sys import time import Image import PyV8 import requests import to


本文实例讲述了python代码写的12306订票代码,分享给大家供大家参考。

具体实现方法如下:

import datetime
import json
import re
import sys
import time
 
import Image
import PyV8
import requests
 
import tools.email_helper as emailHelper
 
 
reload(sys)
sys.setdefaultencoding('utf-8') # @UndefinedVariable
reqSingle = requests.Session()
attCheCi=["G655","G6741","G67","G491"] #关注的车次
dateList=["2015-02-18"] #关注的日期
username="12306登录用户名"
password="登录密码"
#这个是需要手动提交订单后f12自己找的,挨个post请求去找,参数名为:oldPassengerStr 格式如下
oldPassengerStr="姓名,1,130434199802036011,1_姓名2,1,130434199204238069,1_"
#这个是需要手动提交订单后f12自己找的,挨个post请求去找,参数名为:passengerTicketStr 格式如下
passengerTicketStr="O,0,1,姓名,1,130434199802036011,13683456789,N_O,0,1,姓名2,1,130434199204238069,13683456789,N"
header={
 "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
 "Accept-Encoding":"gzip, deflate",
 "Accept-Language":"zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3",
 "Connection":"keep-alive",
 "Host":"kyfw.12306.cn",
 "Referer":"https://kyfw.12306.cn/otn/safeguard/init",
 "User-Agent":"Mozilla/5.0 (Windows NT 5.1; rv:34.0) Gecko/20100101 Firefox/34.0"
 }
##定火车票 
def orderTicket(fromStation,toStation,trainDate,secretStr):
 header["Referer"]="https://kyfw.12306.cn/otn/leftTicket/init"
 orderInitReq= reqSingle.get("https://kyfw.12306.cn/otn/leftTicket/init",headers=header)
 header["Referer"]="https://kyfw.12306.cn/otn/leftTicket/init"
 aryKV=extractKey(orderInitReq.content,header)
 print aryKV
 #初始化订票
 header["Referer"]="https://kyfw.12306.cn/otn/leftTicket/init"
 orderInitReq= reqSingle.post("https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest",data={
 aryKV[0]:aryKV[1],
 "train_date":trainDate,
 "myversion":"undefined",
 "purpose_codes":"ADULT",
 "query_from_station_name":fromStation,
 "query_to_station_name":toStation,
 "secretStr":secretStr,
 "tour_flag":"dc",
 "back_train_date":time.strftime('%Y-%m-%d',time.localtime(time.time())),
 "undefined":""
 },headers=header)
 print orderInitReq.content
 orderInitJson=orderInitReq.json()
 if orderInitJson.get("status")==False or orderInitJson.get("httpstatus")!=200:
 raise Exception("订票出现错误")
 initDcReq= reqSingle.post("https://kyfw.12306.cn/otn/confirmPassenger/initDc", data={"_json_att":""},headers=header)
 header["Referer"]="https://kyfw.12306.cn/otn/confirmPassenger/initDc"
 aryKV=extractKey(initDcReq.content,header)
 match =re.search("var globalRepeatSubmitToken = '(.*?)';", initDcReq.content)
 ticketToken=match.group(1)
 lianxirenReq=reqSingle.post("https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs", data={"REPEAT_SUBMIT_TOKEN":ticketToken,"_json_att":""},headers=header)
 lianxirenJson=lianxirenReq.json()
 #验证码
 #开始做验证码
 while True:
 r=reqSingle.get("https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=passenger&rand=randp&",verify=False,timeout=5,headers=header)
 with open("orderRand.jpg","wb") as rimg:
 rimg.write(r.content)
 pass
 img=Image.open("orderRand.jpg")
 img.show()
 randCode=raw_input("请输入登录验证码:")
 #验证验证码
 randReq= reqSingle.post("https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn",data={
 "REPEAT_SUBMIT_TOKEN":ticketToken,
 "_json_att":"",
 "rand":"randp",
 "randCode":randCode},headers=header)
 randRes=randReq.json()
 if randRes.get("status") and randRes.get("httpstatus")==200 and randRes.get("data").get("result")=="1":
 break;
 pass
 print "验证码输入正确!"
 #检查票
 checkOrderInfoReq=reqSingle.post("https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo", data={
 aryKV[0]:aryKV[1],
 "REPEAT_SUBMIT_TOKEN":ticketToken,
 "_json_att":"",
 "bed_level_order_num":"000000000000000000000000000000",
 "cancel_flag":2,
 "oldPassengerStr":oldPassengerStr,
 "passengerTicketStr":passengerTicketStr,
 "randCode":randCode,
 "tour_flag":"dc"
 })
 checkOrderInfoJson=checkOrderInfoReq.json()
 if checkOrderInfoJson.get("status")==False or checkOrderInfoJson.get("httpstatus")!=200:
 raise Exception("检查票出现错误")
 pass
 fromStationTelecode=re.search("'from_station_telecode':'(.*?)'", initDcReq.content).group(1)
 leftTicket=re.search("'ypInfoDetail':'(.*?)'", initDcReq.content).group(1)
 purpose_codes=re.search("'purpose_codes':'(.*?)'", initDcReq.content).group(1)
 station_train_code=re.search("'station_train_code':'(.*?)'", initDcReq.content).group(1)
 to_station_telecode=re.search("'to_station_telecode':'(.*?)'", initDcReq.content).group(1)
 train_no=re.search("'train_no':'(.*?)'", initDcReq.content).group(1)
 queueCountReq=reqSingle.post("https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount",data={
 "REPEAT_SUBMIT_TOKEN":ticketToken,
 "_json_att":"",
 "fromStationTelecode":fromStationTelecode,
 "leftTicket":leftTicket,
 "purpose_codes":purpose_codes,
 "seatType":0,
 "stationTrainCode":station_train_code,
 "toStationTelecode":to_station_telecode,
 "train_date":datetime.datetime.fromtimestamp(time.mktime(time.strptime(trainDate,'%Y-%m-%d'))).strftime('%a %b %d %Y %H:%M:%S GMT+0800'),
 "train_no":train_no
 },headers=header)
 queueCountJson=queueCountReq.json()
 print queueCountReq.content
 if queueCountJson.get("status")==False or queueCountJson.get("httpstatus")!=200:
 raise Exception("获取队列错误")
 
 #确认队列
 key_check_isChange=re.search("'key_check_isChange':'(.*?)'", initDcReq.content).group(1)
 train_location=re.search("'train_location':'(.*?)'", initDcReq.content).group(1)
 
 singleForQueueReq=reqSingle.post("https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue",data={
 "REPEAT_SUBMIT_TOKEN":ticketToken,
 "_json_att":"",
 "dwAll":"N",
 "key_check_isChange":key_check_isChange,
 "leftTicketStr":leftTicket,
 "oldPassengerStr":oldPassengerStr,
 "passengerTicketStr":passengerTicketStr,
 "purpose_codes":purpose_codes,
 "randCode":randCode,
 "train_location":train_location
 },headers=header)
 
 singleForQueueJson=singleForQueueReq.json()
 print singleForQueueReq.content
 if singleForQueueJson.get("status")==False or singleForQueueJson.get("httpstatus")!=200:
 raise Exception("confirmSingleForQueue异常")
 if singleForQueueJson.get("data") is None or singleForQueueJson.get("data").get("submitStatus")==False:
 raise Exception("confirmSingleForQueue异常")
 #等待orderid
 while True:
 orderWaitReq= reqSingle.get("https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime",data={"REPEAT_SUBMIT_TOKEN":ticketToken,
 "_json_att":"",
 "random":time.time(),
 "tourFlag":"dc"
 },headers=header)
 print orderWaitReq.content
 orderWaitJson=orderWaitReq.json()
 if orderWaitJson.get("status") and orderWaitJson.get("httpstatus")==200:
 if orderWaitJson.get("data") is not None and orderWaitJson.get("data").get("orderId") is not None:
 orderId=orderWaitJson.get("data").get("orderId")
 break
 pass
 pass
 #进入队列
 dcQueueReq=reqSingle.post("https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue",data={
 "REPEAT_SUBMIT_TOKEN":ticketToken,
 "_json_att":"",
 "orderSequence_no":orderId
 }
 ,headers=header)
 dcQueueJson=dcQueueReq.json()
 if dcQueueJson.get("status") and dcQueueJson.get("httpstatus")==200 and dcQueueJson.get("data") is not None and dcQueueJson.get("data").get("submitStatus"):
 print "订票成功"
 pass
 else:
 print dcQueueJson.content
 print "订票失败"
 pass
 
 
 #https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue
 pass
#检查是否登录 
def checkIsLogin():
 checkReq= reqSingle.post("https://kyfw.12306.cn/otn/login/checkUser", data={"_json_att":""},headers=header)
 print u"检查是否登录"+checkReq.content
 checkReqJson=checkReq.json()
 if checkReqJson.get("status") and checkReqJson.get("httpstatus")==200:
 if checkReqJson.get("data") is not None and checkReqJson.get("data").get("flag"):
 return True
 pass
 return False
 pass
#提取js加密内容后的key和value
def extractKey(htmlContent,headerxx):
 loginMatch=re.search(r'

大家抢到回家过年的车票了吗?

希望本文所述对大家的Python程序设计有所帮助。

文档

利用python代码写的12306订票代码

利用python代码写的12306订票代码:本文实例讲述了python代码写的12306订票代码,分享给大家供大家参考。 具体实现方法如下: import datetime import json import re import sys import time import Image import PyV8 import requests import to
推荐度:
标签: 12306 火车票 订票
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top