學習筆記——12306成功登入(4)
阿新 • • 發佈:2019-01-03
本節程式碼為登入成功並打印出賬戶名稱
#-*-coding:utf-8 -*- import urllib2 import urllib # 驗證碼登入同步 import cookielib import damatuWeb import ssl from json import loads from cons import station_name import time header={ "Referer":"https://kyfw.12306.cn/otn/leftTicket/init", "User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36" } #證書驗證 ssl._create_default_https_context = ssl._create_unverified_context # 請求驗證碼圖片 c=cookielib.LWPCookieJar()#生成一個儲存cookie的物件 cookie=urllib2.HTTPCookieProcessor(c)#繫結 opener=urllib2.build_opener(cookie) urllib2.install_opener(opener) # opener繫結,用opener.open請求,自帶cookie,實現驗證碼與登陸同步 city={} for i in station_name.split("@"): if not i: continue tmp_list=i.split("|") city[tmp_list[1]]=tmp_list[2] # print city["長沙"] # print city["上海"] from_station=city["長沙"] to_station=city["上海"] train_date="2017-11-08" def getCode(): req=urllib2.Request("https://kyfw.12306.cn/passport/captcha/" "captcha-image?login_site=E&module=" "login&rand=sjrand&0.3835166812770916") codeing=opener.open(req).read()#opener fn=open('code/code.png','wb') #儲存到本地 fn.write(codeing) fn.close() def code(): getCode() req=urllib2.Request('https://kyfw.12306.cn/passport' '/captcha/captcha-check') code=damatuWeb.calcCode() # code=raw_input(">>") print code data={ "answer":code, "login_site":"E", "rand":"sjrand", } data=urllib.urlencode(data)#把字典型別轉變為查詢字串 html=opener.open(req,data=data).read() result=loads(html) if result["result_code"]=="4": print"驗證碼校驗成功!" return True else: print "驗證碼校驗失敗" code() def login(): #登入 req=urllib2.Request('https://kyfw.12306.cn/passport' '/web/login') data={ 'username':'test', 'password':'test', 'appid':'otn', } data = urllib.urlencode(data) html = opener.open(req, data=data).read() result = loads(html) req = urllib2.Request('https://kyfw.12306.cn/passport/web/auth/uamtk') req.headers = header html = opener.open(req, data='appid=otn').read() print html result = loads(html) newapptk = result['newapptk'] req = urllib2.Request('https://kyfw.12306.cn/otn/uamauthclient') req.headers = header html = opener.open(req, data='tk=%s' % newapptk).read() print html if result['result_code'] == 0: print '登入成功!' return True else: print '登入失敗' def getTrain(): req=urllib2.Request("https://kyfw.12306.cn/otn/leftTicket/query?" "leftTicketDTO.train_date=%s&leftTicketDTO" ".from_station=%s&leftTicketDTO.to_station=%s&" "purpose_codes=ADULT" %(train_date,from_station,to_station)) req.headers=header html=opener.open(req).read() try: result = loads(html) return result['data']['result'] except Exception,e: time.sleep(2) getTrain() #下單 def order(secretStr): #第1個請求 req = urllib2.Request('https://kyfw.12306.cn/otn/login/checkUser') html = opener.open(req,data='_json_att=').read() # print html #第2個請求 req = urllib2.Request('https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest') data = { 'secretStr':secretStr, 'train_date':'2017-11-08', 'back_train_date':'2017-11-05', 'tour_flag':'dc', 'purpose_codes':'ADULT', 'query_from_station_name':'長沙', 'query_to_station_name':'上海', 'undefined':'' } data = urllib.urlencode(data) req.headers = header html = opener.open(req,data=data) # print html.read() # print html.geturl() req = urllib2.Request('https://kyfw.12306.cn/otn/index/initMy12306') req.headers = header html = opener.open(req).read() print html code() login() # print getTrain() #查票 for i in getTrain(): tmp_list=i.split("|") # tmp_list[3]="車次" # tmp_list[8]="出發時間" # tmp_list[9]="到達時間" # tmp_list[26]="無座" # tmp_list[29]="硬座" # tmp_list[25]="特等座" # tmp_list[31]="一等座" # tmp_list[30]="二等座" # tmp_list[23]="軟臥" secretStr=tmp_list[0] # a=0 # for n in tmp_list: # print "[%s]%s"%(a,n) # a+=1 # break # print tmp_list if tmp_list[30]!=u"無" and tmp_list[30]!="": print "有票","車次:",tmp_list[3] break else: print "沒票" # print secretStr order(secretStr)