侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python自动12306抢票软件实现代码

Python  /  管理员 发布于 7年前   178

昨天我发的是抓取的12306数据包,然后分析了一下,今天按照昨天的分析 用代码实现了,如果有需要的同学们可以看一下,实现的功能有,登录,验证码识别,自动查票,有余票点击预定, 差了最后一步提交订单。同学们可以自己研究一下。

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()) #生产一个18位的随机数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('首页获取成功,状态码:',r)  def get_newpasscode(self): #这个页面不知道是干啥的,但是12306 请求了,咱们为了模仿的像一点也去请求    url='https://kyfw.12306.cn/otn/resources/js/newpasscode/captcha_js.js?_={}'.format(get_13_time())    r=self.s.get(url)    print('newpasscode获取成功,状态码:',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): # 调用打码平台,返回验证码坐标    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() #调用打码平台        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])        出发时间=str(dandulist[8])        到达时间 = str(dandulist[9])        历时=str(dandulist[10])        软卧 = str(dandulist[23])        硬卧=str(dandulist[28])        print(i)        print('可预订车次列表,','车次:',车次,'出发时间:', 出发时间,'到达时间:', 到达时间,'历时:', 历时,'软卧剩余: ',软卧,' 硬卧剩余: ',硬卧)        if (软卧 != '' and 软卧 != '0' and 软卧 != '无' and 软卧 != '空') or (硬卧 != '' and 硬卧 != '0' and 硬卧 != '无' and 硬卧 != '空'):          #执行下单操作          self.post_submitOrderRequest()          self.post_initDc()          self.post_getPassengerDTOs()          return False      print('*****************************************************')    return True  # 点击预定下单  def post_submitOrderRequest(self):    url='https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'    data={      'secretStr':self.secretStr,      'train_date':self.chufa, #出发时间      '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():    #如果验证码获取成功,就调用打码平台    print('验证码获取成功')    print('正在调用打码平台...')    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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    python3操作微信itchat实现发送图片
    下一条:
    浅谈Python中的zip()与*zip()函数详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客