昨天我发的是抓取的12306数据包,然后分析了一下,今天按照昨天的分析 用代码实现了,如果有需要的同学们可以看一下

,实现的功能有,登录,验证码识别,自动查票,有余票点击预定, 差了最后一步提交订单。同学们可以自己研究一下。

import requests
import time
import dmpt
import re
import random
from 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)

12306自动抢票软件代码实现相关推荐

  1. 12306自动抢票软件哪个好?记者亲测体验

    春运期间的火车票可谓一票难求,广大购票者抢票需求难以满足.在网上,铺天盖地的抢票插件也弄不清到底选哪家好.不要急,下面为大家介绍几款小编亲身实践过的功能强大的抢票软件,希望可以帮助大家顺利回家过年! ...

  2. 12306爬虫抢票软件代码

    '''1.需要登录页面,手动输入账号密码! 2.地查询车次,输入 起点.目的.出发时间,找到车次,就进行选择 3.选择完成后,就查询该车次是否有余票(进行显示)如果有就进行购买,没有就进行循环 4.如 ...

  3. 【Bypass】12306铁路自动抢票软件,增强通知

    Bypass12306分流抢票软件(全自动抢票+后补) 一年一度的抢票大战又要开始啦.Bypass-(分流抢票),来自大佬@Cheney.小风,原12306Bypass分流抢票客户端,它是一款电脑端自 ...

  4. python编写12306窗体抢票软件(二)

    python编写12306窗体抢票软件(二) 本文这次介绍如何获取12306网站的验证码并登陆. 1 获取验证码 12306它是一个服务器,每次我们访问它都是以客户端的方式去向它索取信息. 建议用谷歌 ...

  5. python编写12306窗体抢票软件(一)

    python编写12306窗体抢票软件(一) 第一次写博客,拿写过的软件练个手~ 12306是学习爬虫的比较好的一个练手网站.本文带你重零开始编写一个python窗体,十分简单,小白进来看哈~这节只说 ...

  6. 基于python的12306自动抢票系统的设计与实现

    铁路售票系统12306网站作为一个广受人们的日常使用工具,受大极大的关注.铁路售票的管理者都主要考虑降低成本,提升售票服务满意度.一年一度的春运和节假日出行高峰期,给众多的出行群众者带来了极大的烦恼, ...

  7. python 100行代码实现 12306 自动抢票

    基于Selenium和Chrome浏览器实现. 默认抢票类型为普通票,硬座.需求多的话可以在源码里改,我写的注释挺详细. 复制粘贴就能使用,2019年8月13日 测试可用. from selenium ...

  8. python抢票软件代码_Python 写一个抢票软件

    总体设计 所谓抢票软件,本质上就是基于浏览器驱动,实现登录.预定.确认信息的自动化.购买列车票涉及4个网页,相应的基本流程如下: 登录:输入用户名.密码,识别验证码,点击"登录": ...

  9. python 学习笔记一 自动抢票软件

    这是一个系列,记录我练习python时的代码,有些是参考网上代码,送给那些想要学习python的人.可以相互交流, wx: Lxp911221 喜欢的加我吧 这篇是一个抢票软件,有登录,自动选座,自动 ...

  10. 用Python实现12306自动抢票脚本,五一假期出行无忧!

    用python另一个抢票神器,你get到了吗? 2017年时间飞逝,转眼间距离2018年春节还有不到1个月的时间,还在为抢不到火车票发愁吗?作为程序员的我们撸一个抢票软件可好? ... 难以想象的数据 ...

最新文章

  1. DeepMind成功使用深度强化学习技术完美控制核聚变反应堆!
  2. axios使用post请求的时候后台接收不到参数
  3. mysql怎么执行任务_Mysql怎么定时执行任务
  4. 同一个Spring-AOP的坑,我一天踩了两次,深坑啊
  5. spwm逆变器双极性matlab教程,基于MATLAB/Simulink的SPWM逆变电源的建模与仿真
  6. UA MATH564 概率论 计算至少有一个发生的概率:容斥原理与庞加莱公式
  7. 17道因为太难而被禁用的Google面试题
  8. mysql 读取properties_JDBC中使用Properties读取配置文件有什么用
  9. Mysql之七种连接查询
  10. postgresql 修改表字段_关于一些postgresql特有的概念以及安装方法的叙述
  11. Wireshake抓包数据怎么看(一)
  12. python数据结构与算法第10讲_Python数据结构与算法10:基本结构:练习题1
  13. Android的双进程守护,广播和双进程
  14. DisplayTag应用指南
  15. 电脑重启只剩下c盘怎么办_我的电脑正在正常运行突然自动重启了,重启后发现系统只剩下C盘了,请教怎么恢复?...
  16. ArcGIS为什么计算面积被禁用
  17. 如何用matlab画超越方程组的图像,【求助】超越方程组的fsolve解法
  18. 新浪微博上市好故事难讲
  19. OpenCV + ORC 实现身份证识别
  20. 模拟丢包、慢网速的测试工具

热门文章

  1. 取消百度SiteApp转码
  2. 阿里云服务器一年多少钱?阿里云企业级云服务器报价表
  3. 跨平台报表和仪表板工具Stimulsoft v2020.1,一键自动激活移动模式
  4. CentOS-6.3安装配置Tomcat-7 - Constantin - 博客园
  5. Bandizip下载安装教程
  6. bert中的cls和sep等等
  7. EasyOrtho卫星影像处理软件
  8. Excel制作增长趋势图
  9. hdu5773 LIS+贪心
  10. HDOJ-----5773The All-purpose Zero(LIS)