12306自动抢票软件代码实现
昨天我发的是抓取的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自动抢票软件代码实现相关推荐
- 12306自动抢票软件哪个好?记者亲测体验
春运期间的火车票可谓一票难求,广大购票者抢票需求难以满足.在网上,铺天盖地的抢票插件也弄不清到底选哪家好.不要急,下面为大家介绍几款小编亲身实践过的功能强大的抢票软件,希望可以帮助大家顺利回家过年! ...
- 12306爬虫抢票软件代码
'''1.需要登录页面,手动输入账号密码! 2.地查询车次,输入 起点.目的.出发时间,找到车次,就进行选择 3.选择完成后,就查询该车次是否有余票(进行显示)如果有就进行购买,没有就进行循环 4.如 ...
- 【Bypass】12306铁路自动抢票软件,增强通知
Bypass12306分流抢票软件(全自动抢票+后补) 一年一度的抢票大战又要开始啦.Bypass-(分流抢票),来自大佬@Cheney.小风,原12306Bypass分流抢票客户端,它是一款电脑端自 ...
- python编写12306窗体抢票软件(二)
python编写12306窗体抢票软件(二) 本文这次介绍如何获取12306网站的验证码并登陆. 1 获取验证码 12306它是一个服务器,每次我们访问它都是以客户端的方式去向它索取信息. 建议用谷歌 ...
- python编写12306窗体抢票软件(一)
python编写12306窗体抢票软件(一) 第一次写博客,拿写过的软件练个手~ 12306是学习爬虫的比较好的一个练手网站.本文带你重零开始编写一个python窗体,十分简单,小白进来看哈~这节只说 ...
- 基于python的12306自动抢票系统的设计与实现
铁路售票系统12306网站作为一个广受人们的日常使用工具,受大极大的关注.铁路售票的管理者都主要考虑降低成本,提升售票服务满意度.一年一度的春运和节假日出行高峰期,给众多的出行群众者带来了极大的烦恼, ...
- python 100行代码实现 12306 自动抢票
基于Selenium和Chrome浏览器实现. 默认抢票类型为普通票,硬座.需求多的话可以在源码里改,我写的注释挺详细. 复制粘贴就能使用,2019年8月13日 测试可用. from selenium ...
- python抢票软件代码_Python 写一个抢票软件
总体设计 所谓抢票软件,本质上就是基于浏览器驱动,实现登录.预定.确认信息的自动化.购买列车票涉及4个网页,相应的基本流程如下: 登录:输入用户名.密码,识别验证码,点击"登录": ...
- python 学习笔记一 自动抢票软件
这是一个系列,记录我练习python时的代码,有些是参考网上代码,送给那些想要学习python的人.可以相互交流, wx: Lxp911221 喜欢的加我吧 这篇是一个抢票软件,有登录,自动选座,自动 ...
- 用Python实现12306自动抢票脚本,五一假期出行无忧!
用python另一个抢票神器,你get到了吗? 2017年时间飞逝,转眼间距离2018年春节还有不到1个月的时间,还在为抢不到火车票发愁吗?作为程序员的我们撸一个抢票软件可好? ... 难以想象的数据 ...
最新文章
- DeepMind成功使用深度强化学习技术完美控制核聚变反应堆!
- axios使用post请求的时候后台接收不到参数
- mysql怎么执行任务_Mysql怎么定时执行任务
- 同一个Spring-AOP的坑,我一天踩了两次,深坑啊
- spwm逆变器双极性matlab教程,基于MATLAB/Simulink的SPWM逆变电源的建模与仿真
- UA MATH564 概率论 计算至少有一个发生的概率:容斥原理与庞加莱公式
- 17道因为太难而被禁用的Google面试题
- mysql 读取properties_JDBC中使用Properties读取配置文件有什么用
- Mysql之七种连接查询
- postgresql 修改表字段_关于一些postgresql特有的概念以及安装方法的叙述
- Wireshake抓包数据怎么看(一)
- python数据结构与算法第10讲_Python数据结构与算法10:基本结构:练习题1
- Android的双进程守护,广播和双进程
- DisplayTag应用指南
- 电脑重启只剩下c盘怎么办_我的电脑正在正常运行突然自动重启了,重启后发现系统只剩下C盘了,请教怎么恢复?...
- ArcGIS为什么计算面积被禁用
- 如何用matlab画超越方程组的图像,【求助】超越方程组的fsolve解法
- 新浪微博上市好故事难讲
- OpenCV + ORC 实现身份证识别
- 模拟丢包、慢网速的测试工具