国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python自動(dòng)12306搶票軟件實(shí)現(xiàn)代碼

2020-02-22 23:19:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

昨天我發(fā)的是抓取的12306數(shù)據(jù)包,然后分析了一下,今天按照昨天的分析 用代碼實(shí)現(xiàn)了,如果有需要的同學(xué)們可以看一下,實(shí)現(xiàn)的功能有,登錄,驗(yàn)證碼識(shí)別,自動(dòng)查票,有余票點(diǎn)擊預(yù)定, 差了最后一步提交訂單。同學(xué)們可以自己研究一下。

import requestsimport timeimport dmptimport reimport randomfrom copyheaders import headers_raw_to_dictDEFAULT_HEADERS={'Host':'kyfw.12306.cn','Connection':'keep-alive','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Referer':'https://kyfw.12306.cn/otn/index/init','Accept-Language':'zh-CN,zh;q=0.9',}def get_random():  return str(random.random()) #生產(chǎn)一個(gè)18位的隨機(jī)數(shù)def get_13_time(): #一個(gè)十三位的時(shí)間戳  return str(int(time.time()*1000))class CN12306(object):  def __init__(self):    self.chufa='2018-02-03'    self.s=requests.session()    self.s.verify = False  # 忽略https 證書(shū)驗(yàn)證  def get_init(self): #請(qǐng)求了一個(gè)首頁(yè)    url='https://kyfw.12306.cn/otn/login/init'    r=self.s.get(url)    print('首頁(yè)獲取成功,狀態(tài)碼:',r)  def get_newpasscode(self): #這個(gè)頁(yè)面不知道是干啥的,但是12306 請(qǐng)求了,咱們?yōu)榱四7碌南褚稽c(diǎn)也去請(qǐng)求    url='https://kyfw.12306.cn/otn/resources/js/newpasscode/captcha_js.js?_={}'.format(get_13_time())    r=self.s.get(url)    print('newpasscode獲取成功,狀態(tài)碼:',r)  def get_auth_code(self): #獲取驗(yàn)證碼    url='https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&{}'.format(get_random())    r=self.s.get(url)    with open('auth_code.png', 'wb') as auth:      auth.write(r.content)      auth.flush()      auth.close()    return str(r) == '<Response [200]>'  def analysis_auth_code(self): # 調(diào)用打碼平臺(tái),返回驗(yàn)證碼坐標(biāo)    dmt = dmpt.DamatuApi("打碼平臺(tái)帳號(hào)", "打碼平臺(tái)密碼")    analysis_auth = dmt.decode('auth_code.png', 287) # 上傳打碼    analysis_auth = re.sub('/|', ',', analysis_auth)    li = analysis_auth.split(',')    for i in range(len(li)):      if i % 2 == 0:        pass      else:        li[i] = str(int(li[i]) - 30)    analysis_auth = str(li)    analysis_auth = re.sub("'", '', analysis_auth)    analysis_auth = re.sub("/]", '', analysis_auth)    analysis_auth = re.sub("/[", '', analysis_auth)    analysis_auth = re.sub(" ", '', analysis_auth)    print('驗(yàn)證碼坐標(biāo)', analysis_auth)    self.analysis_auth= analysis_auth # 驗(yàn)證碼坐標(biāo)  def auth_auth_code(self): #驗(yàn)證驗(yàn)證碼是否正確提交方式post    url='https://kyfw.12306.cn/passport/captcha/captcha-check'    data={      'answer':self.analysis_auth ,      'login_site':'E',      'rand':'sjrand',    }    r=self.s.post(url=url,data=data)    print(r.text)    if r.text == '''{"result_message":"驗(yàn)證碼校驗(yàn)成功","result_code":"4"}''': #驗(yàn)證碼校驗(yàn)成功      return True    else: #如果驗(yàn)證碼校驗(yàn)失敗      print('驗(yàn)證碼錯(cuò)誤,刷新驗(yàn)證碼,重新提交')      if self.get_auth_code():  #獲取驗(yàn)證碼        self.analysis_auth_code() #調(diào)用打碼平臺(tái)        self.auth_auth_code() #重新校驗(yàn)驗(yàn)證碼  def login(self):    url='https://kyfw.12306.cn/passport/web/login'    data={    'username' : '12306帳號(hào)',    'password' : '12306密碼',    'appid' : 'otn',    }    r=self.s.post(url=url,data=data)    self.uamtk=r.json()["uamtk"]    print(r.text)  def userLogin(self):    url='https://kyfw.12306.cn/otn/login/userLogin'    r=self.s.post(url=url)    # print(r.text)  def getjs(self):  #不知道是干啥的,但是也提交吧    url='https://kyfw.12306.cn/otn/HttpZF/GetJS'    r=self.s.get(url)  def post_uamtk(self):    url='https://kyfw.12306.cn/passport/web/auth/uamtk'    data={ 'appid':'otn'}    r=self.s.post(url=url,data=data,allow_redirects=False)    self.newapptk=r.json()["newapptk"]    r.encoding='utf-8'    print(r.text)  def post_uamauthclient(self):    url='https://kyfw.12306.cn/otn/uamauthclient'    data={      'tk':self.newapptk    }    r=self.s.post(url=url,data=data)    self.apptk = r.json()["apptk"]    r.encoding='utf-8'    print(r.text)  def get_userLogin(self):    url='https://kyfw.12306.cn/otn/login/userLogin'    r=self.s.get(url)    r.encoding='utf-8'    # print(r.text)  def get_leftTicket(self):    url='https://kyfw.12306.cn/otn/leftTicket/init'    r=self.s.get(url)    r.encoding='utf-8'    # print(r.text)  def get_GetJS(self):    url='https://kyfw.12306.cn/otn/HttpZF/GetJS'    self.s.get(url)  def get_qufzjql(self):    url = 'https://kyfw.12306.cn/otn/dynamicJs/qufzjql'    self.s.get(url)  def get_queryZ(self):    url='https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={}&leftTicketDTO.from_station={}&leftTicketDTO.to_station={}&purpose_codes={}'.format(self.chufa,'BJP','TBP','ADULT')    r=self.s.get(url)    r.encoding='utf-8'    # print(r.text)    cheliang=r.json()["data"]["result"]    for i in cheliang:      dandulist=str(i).split('|')      if len(str(dandulist[0]))>=100:        self.secretStr=dandulist[0]        # secretStr = str(x[0])        車(chē)次=str(dandulist[3])        出發(fā)時(shí)間=str(dandulist[8])        到達(dá)時(shí)間 = str(dandulist[9])        歷時(shí)=str(dandulist[10])        軟臥 = str(dandulist[23])        硬臥=str(dandulist[28])        print(i)        print('可預(yù)訂車(chē)次列表,','車(chē)次:',車(chē)次,'出發(fā)時(shí)間:', 出發(fā)時(shí)間,'到達(dá)時(shí)間:', 到達(dá)時(shí)間,'歷時(shí):', 歷時(shí),'軟臥剩余: ',軟臥,' 硬臥剩余: ',硬臥)        if (軟臥 != '' and 軟臥 != '0' and 軟臥 != '無(wú)' and 軟臥 != '空') or (硬臥 != '' and 硬臥 != '0' and 硬臥 != '無(wú)' and 硬臥 != '空'):          #執(zhí)行下單操作          self.post_submitOrderRequest()          self.post_initDc()          self.post_getPassengerDTOs()          return False      print('*****************************************************')    return True  # 點(diǎn)擊預(yù)定下單  def post_submitOrderRequest(self):    url='https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'    data={      'secretStr':self.secretStr,      'train_date':self.chufa, #出發(fā)時(shí)間      'back_train_date':self.chufa ,#返回時(shí)間      'tour_flag':'dc',      'purpose_codes':'ADULT',      'query_from_station_name':'北京',      'query_to_station_name':'天津北',      'undefined':''       }    r=self.s.post(url=url,data=data)    print(r.text)  def post_initDc(self):    url='https://kyfw.12306.cn/otn/confirmPassenger/initDc'    r=self.s.post(url)    # r.text    self.REPEAT_SUBMIT_TOKEN=re.findall("globalRepeatSubmitToken = '(.*?)';",r.text)[0]  def post_getPassengerDTOs(self): #獲取乘客信息    url='https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs'    data={      'REPEAT_SUBMIT_TOKEN':self.REPEAT_SUBMIT_TOKEN,      '_json_att':''    }    r=self.s.post(url=url,data=data)    r.encoding='utf-8'    print(r.text)if __name__ == '__main__':  print(get_random())  cn=CN12306()  cn.get_init()  cn.get_newpasscode()  if cn.get_auth_code():    #如果驗(yàn)證碼獲取成功,就調(diào)用打碼平臺(tái)    print('驗(yàn)證碼獲取成功')    print('正在調(diào)用打碼平臺(tái)...')    cn.analysis_auth_code()    if cn.auth_auth_code(): #驗(yàn)證驗(yàn)證碼是否正確      cn.login()      cn.userLogin()      cn.getjs()      cn.post_uamtk()      cn.post_uamauthclient()      cn.get_userLogin()      cn.get_leftTicket()      cn.get_GetJS()      cn.get_qufzjql()      while cn.get_queryZ():        time.sleep(30)            
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 信阳市| 五原县| 塔城市| 八宿县| 河东区| 凌海市| 安溪县| 高台县| 新巴尔虎右旗| 永平县| 五原县| 民权县| 孟州市| 威海市| 文水县| 错那县| 建阳市| 内黄县| 双流县| 竹山县| 吴江市| 芮城县| 蓝田县| 建宁县| 琼中| 彭山县| 赤峰市| 海南省| 富源县| 高邮市| 会同县| 东方市| 云阳县| 和田县| 太白县| 六安市| 新密市| 托克逊县| 廉江市| 乌什县| 桐城市|