利用python代码写的12306订票代码
本文实例讲述了python代码写的12306订票代码,分享给大家供大家参考。
具体实现方法如下:
importdatetime
importjson
importre
importsys
importtime
importImage
importPyV8
importrequests
importtools.email_helperasemailHelper
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(WindowsNT5.1;rv:34.0)Gecko/20100101Firefox/34.0"
}
##定火车票
deforderTicket(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)
printaryKV
#初始化订票
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)
printorderInitReq.content
orderInitJson=orderInitReq.json()
iforderInitJson.get("status")==FalseororderInitJson.get("httpstatus")!=200:
raiseException("订票出现错误")
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("varglobalRepeatSubmitToken='(.*?)';",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()
#验证码
#开始做验证码
whileTrue:
r=reqSingle.get("https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=passenger&rand=randp&",verify=False,timeout=5,headers=header)
withopen("orderRand.jpg","wb")asrimg:
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()
ifrandRes.get("status")andrandRes.get("httpstatus")==200andrandRes.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()
ifcheckOrderInfoJson.get("status")==FalseorcheckOrderInfoJson.get("httpstatus")!=200:
raiseException("检查票出现错误")
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:%SGMT+0800'),
"train_no":train_no
},headers=header)
queueCountJson=queueCountReq.json()
printqueueCountReq.content
ifqueueCountJson.get("status")==FalseorqueueCountJson.get("httpstatus")!=200:
raiseException("获取队列错误")
#确认队列
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()
printsingleForQueueReq.content
ifsingleForQueueJson.get("status")==FalseorsingleForQueueJson.get("httpstatus")!=200:
raiseException("confirmSingleForQueue异常")
ifsingleForQueueJson.get("data")isNoneorsingleForQueueJson.get("data").get("submitStatus")==False:
raiseException("confirmSingleForQueue异常")
#等待orderid
whileTrue:
orderWaitReq=reqSingle.get("https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime",data={"REPEAT_SUBMIT_TOKEN":ticketToken,
"_json_att":"",
"random":time.time(),
"tourFlag":"dc"
},headers=header)
printorderWaitReq.content
orderWaitJson=orderWaitReq.json()
iforderWaitJson.get("status")andorderWaitJson.get("httpstatus")==200:
iforderWaitJson.get("data")isnotNoneandorderWaitJson.get("data").get("orderId")isnotNone:
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()
ifdcQueueJson.get("status")anddcQueueJson.get("httpstatus")==200anddcQueueJson.get("data")isnotNoneanddcQueueJson.get("data").get("submitStatus"):
print"订票成功"
pass
else:
printdcQueueJson.content
print"订票失败"
pass
#https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue
pass
#检查是否登录
defcheckIsLogin():
checkReq=reqSingle.post("https://kyfw.12306.cn/otn/login/checkUser",data={"_json_att":""},headers=header)
printu"检查是否登录"+checkReq.content
checkReqJson=checkReq.json()
ifcheckReqJson.get("status")andcheckReqJson.get("httpstatus")==200:
ifcheckReqJson.get("data")isnotNoneandcheckReqJson.get("data").get("flag"):
returnTrue
pass
returnFalse
pass
#提取js加密内容后的key和value
defextractKey(htmlContent,headerxx):
loginMatch=re.search(r'<scriptsrc="(/otn/dynamicJs/.*?)"type="text/javascript"xml:space="preserve"></script>',htmlContent)
jsUrl="https://kyfw.12306.cn"+loginMatch.group(1)
jsReq=reqSingle.get(jsUrl,verify=False,timeout=15,headers=headerxx)
jsContent=jsReq.content
jsMatch=re.search("(functionbin216.*?)functionaj",jsContent)
jsEncode=jsMatch.group(1)#获取加密的js内容
keyMatch=re.search("varkey='(.*?)'",jsContent)
loginKey=keyMatch.group(1)#获取登录的key
ctx=PyV8.JSContext()
ctx.enter()
ctx.eval(jsEncode)
loginValue=ctx.locals.encode32(ctx.locals.bin216(ctx.locals.Base32.encrypt("1111",loginKey)))
return[loginKey,loginValue]
pass
#登录操作
deflogin():
header["Referer"]="https://kyfw.12306.cn/otn/login/init"
r=reqSingle.get("https://kyfw.12306.cn/otn/login/init",verify=False,timeout=15,headers=header)
loginContent=r.content
aryKV=extractKey(loginContent,header)
#开始做验证码
whileTrue:
r=reqSingle.get("https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&",verify=False,timeout=5,headers=header)
withopen("loginRand.jpg","wb")asrimg:
rimg.write(r.content)
pass
img=Image.open("loginRand.jpg")
img.show()
randCode=raw_input("请输入登录验证码:")
#验证验证码
randReq=reqSingle.post("https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn",data={"rand":"sjrand","randCode":randCode},headers=header)
randRes=randReq.json()
ifrandRes.get("status")andrandRes.get("httpstatus")==200andrandRes.get("data").get("result")=="1":
break;
pass
print"验证码输入正确!"
#开始登陆
loginRes=reqSingle.post("https://kyfw.12306.cn/otn/login/loginAysnSuggest",data={
aryKV[0]:aryKV[1],
"loginUserDTO.user_name":username,
"userDTO.password":password,
"randCode":randCode,
"myversion":"undefined",
"randCode_validate":""
},headers=header)
printrepr(r.request)
printloginRes.content
loginResJson=loginRes.json()
ifloginResJson.get("status")andloginResJson.get("httpstatus")==200:
ifloginResJson.get("data")isnotNoneandloginResJson.get("data").get("loginCheck")=="Y":
print"登录成功"
else:
raiseException(loginRes.content)
else:
login()
pass
defcheckTicket(dtStr):
printdt
whileTrue:
try:
r=requests.get("https://kyfw.12306.cn/otn/leftTicket/queryT?leftTicketDTO.train_date="+dtStr+"&leftTicketDTO.from_station=BXP&leftTicketDTO.to_station=HDP&purpose_codes=ADULT",verify=False,timeout=5,headers=header)
break
exceptException:
pass
pass
#printr.contentfd
printr.content
try:
queryDataJson=json.loads(r.content)
exceptException:
return
ifqueryDataJson["httpstatus"]==200andqueryDataJson["status"]:
#printqueryDataJson["data"]
forcheciinqueryDataJson["data"]:
tmpData=checi["queryLeftNewDTO"]
trainCode=tmpData.get("station_train_code")
#yzNum=tmpData.get("yz_num")
yzNum=tmpData.get("ze_num")
iftrainCodeinattCheCi:
ifyzNum!="--"andyzNum!="无"and(yzNum=="有"orint(yzNum)>=2):
#发邮件
fromStation=tmpData.get("start_station_name")
toStation=tmpData.get("end_station_name")
secretStr=checi.get("secretStr")
orderTicket(fromStation,toStation,dtStr,secretStr)
#body=dtStr+"-"+trainCode+"-"+yzNum+u"个硬座"
#printbody
#mailer=emailHelper.email_helper("smtp.qq.com","fd","fss","qq.com","plain")
#mailer.send("630419595@qq.com",u"有火车票了",body)
#raiseException("有票了")
pass
printtrainCode+yzNum
pass
pass
pass
if__name__=='__main__':
#login()
#ifcheckIsLogin():
#print"登录成功"
#
#orderTicket("北京西","邯郸东","2015-01-14","MjAxNS0wMS0xNCMwMCNHNjczMSMwMjoxNSMwNzowNSMyNDAwMEc2NzMxMDUjQlhQI0hQUCMwOToyMCPljJfkuqzopb8j6YKv6YO45LicIzAxIzA2I08wMDAwMDA4MThNMDAwMDAwMTEwOTAwMDAwMDAyNiNQMiMxNDE5MDg2OTU2MTA0IzI5NEI0QkY0QTU2ODE2RDU1MzE5RkRCRkVEQzQ3Mzk2MUEyRUEwOEM0MUVCMjZGMDc3RUUyNzc0")
#exit()
login()
ifcheckIsLogin():
print"登录成功"
whileTrue:
checkCount=0
fordtindateList:
checkTicket(dt)
time.sleep(2)
checkCount+=1
ifcheckCount%10==0:
ifcheckIsLogin():
print"成功状态"
else:
print"被踢了"
pass
pass
大家抢到回家过年的车票了吗?
希望本文所述对大家的Python程序设计有所帮助。