最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python自動12306搶票軟件實現(xiàn)代碼

 更新時間:2018年02月24日 09:55:14   作者:趙韶暉_  
這篇文章主要為大家詳細介紹了python自動12306搶票軟件的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

import requests
import time
import dmpt
import re
import random
from copyheaders import headers_raw_to_dict

DEFAULT_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)一個18位的隨機數(shù)
def get_13_time(): #一個十三位的時間戳
  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 證書驗證
  def get_init(self): #請求了一個首頁
    url='https://kyfw.12306.cn/otn/login/init'
    r=self.s.get(url)
    print('首頁獲取成功,狀態(tài)碼:',r)

  def get_newpasscode(self): #這個頁面不知道是干啥的,但是12306 請求了,咱們?yōu)榱四7碌南褚稽c也去請求
    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): #獲取驗證碼
    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)用打碼平臺,返回驗證碼坐標
    dmt = dmpt.DamatuApi("打碼平臺帳號", "打碼平臺密碼")
    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('驗證碼坐標', analysis_auth)
    self.analysis_auth= analysis_auth # 驗證碼坐標

  def auth_auth_code(self): #驗證驗證碼是否正確提交方式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":"驗證碼校驗成功","result_code":"4"}''': #驗證碼校驗成功
      return True
    else: #如果驗證碼校驗失敗
      print('驗證碼錯誤,刷新驗證碼,重新提交')
      if self.get_auth_code():  #獲取驗證碼
        self.analysis_auth_code() #調(diào)用打碼平臺
        self.auth_auth_code() #重新校驗驗證碼

  def login(self):
    url='https://kyfw.12306.cn/passport/web/login'
    data={
    'username' : '12306帳號',
    '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])
        車次=str(dandulist[3])
        出發(fā)時間=str(dandulist[8])
        到達時間 = str(dandulist[9])
        歷時=str(dandulist[10])
        軟臥 = str(dandulist[23])
        硬臥=str(dandulist[28])
        print(i)
        print('可預(yù)訂車次列表,','車次:',車次,'出發(fā)時間:', 出發(fā)時間,'到達時間:', 到達時間,'歷時:', 歷時,'軟臥剩余: ',軟臥,' 硬臥剩余: ',硬臥)
        if (軟臥 != '' and 軟臥 != '0' and 軟臥 != '無' and 軟臥 != '空') or (硬臥 != '' and 硬臥 != '0' and 硬臥 != '無' and 硬臥 != '空'):
          #執(zhí)行下單操作
          self.post_submitOrderRequest()
          self.post_initDc()
          self.post_getPassengerDTOs()
          return False

      print('*****************************************************')
    return True


  # 點擊預(yù)定下單
  def post_submitOrderRequest(self):
    url='https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'
    data={
      'secretStr':self.secretStr,
      'train_date':self.chufa, #出發(fā)時間
      'back_train_date':self.chufa ,#返回時間
      '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():
    #如果驗證碼獲取成功,就調(diào)用打碼平臺
    print('驗證碼獲取成功')
    print('正在調(diào)用打碼平臺...')
    cn.analysis_auth_code()
    if cn.auth_auth_code(): #驗證驗證碼是否正確
      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)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Python實現(xiàn)在Excel工作表中添加、修改及刪除超鏈接

    使用Python實現(xiàn)在Excel工作表中添加、修改及刪除超鏈接

    在創(chuàng)建Excel工作簿時,內(nèi)部文檔的互鏈、報告自動化生成或是創(chuàng)建外部資源快速訪問路徑是比較常見的需求,本文將介紹如何使用Python實現(xiàn)在Excel工作表中對超鏈接進行添加、修改及刪除的操作,需要的朋友可以參考下
    2024-10-10
  • python異步任務(wù)隊列示例

    python異步任務(wù)隊列示例

    這篇文章主要介紹了python異步任務(wù)隊列示例,需要的朋友可以參考下
    2014-04-04
  • python3正則模塊re的使用方法詳解

    python3正則模塊re的使用方法詳解

    這篇文章主要介紹了python3正則模塊re的使用方法詳解,需要的朋友可以參考下
    2020-02-02
  • 關(guān)于python處理大型json文件的方法

    關(guān)于python處理大型json文件的方法

    這篇文章主要介紹了python處理大型json文件的方法,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 談?wù)凱ython:為什么類中的私有屬性可以在外部賦值并訪問

    談?wù)凱ython:為什么類中的私有屬性可以在外部賦值并訪問

    這篇文章主要介紹了談?wù)凱ython:為什么類中的私有屬性可以在外部賦值并訪問,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python的help函數(shù)如何使用

    python的help函數(shù)如何使用

    在本篇文章里小編給大家整理的是關(guān)于python的help函數(shù)的相關(guān)用法和知識點總結(jié),需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • vscode配置anaconda3的方法步驟

    vscode配置anaconda3的方法步驟

    這篇文章主要介紹了vscode配置anaconda3的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 使用python操作lmdb對數(shù)據(jù)讀取的實例

    使用python操作lmdb對數(shù)據(jù)讀取的實例

    這篇文章主要介紹了使用python操作lmdb對數(shù)據(jù)讀取的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Python實現(xiàn)生成對角矩陣和對角塊矩陣

    Python實現(xiàn)生成對角矩陣和對角塊矩陣

    這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)生成對角矩陣和對角塊矩陣,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-04-04
  • Pycharm之快速定位到某行快捷鍵的方法

    Pycharm之快速定位到某行快捷鍵的方法

    今天小編就為大家分享一篇Pycharm之快速定位到某行快捷鍵的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01

最新評論

屏边| 大同市| 彰化市| 芒康县| 竹溪县| 盘山县| 香格里拉县| 喜德县| 和田县| 六盘水市| 饶河县| 梁河县| 五指山市| 都江堰市| 新营市| 贞丰县| 阳山县| 栖霞市| 开鲁县| 承德县| 保靖县| 吉木萨尔县| 祥云县| 凤山市| 灯塔市| 红安县| 肥乡县| 云和县| 沾益县| 新巴尔虎右旗| 彭阳县| 凤台县| 渭源县| 漾濞| 格尔木市| 桃源县| 德格县| 石河子市| 乌兰浩特市| 上虞市| 武宁县|