前言:

初入Python,打算搞个练手项目,正巧又到了抢票的季节,那就12306了,反正也早就被玩坏了,哈哈哈哈。。。由于是边练手边写的,为了方便,没有啥优雅的姿势,每个功能一个方法大概如下:

1.获取登录需要的验证码图片保存到本地
2.自动识别验证码(或手动识别)
3.验证验证码并登录
4.多重验证(验证之后才能获取真正的登录状态)
5.扫票
6.下订单
7.获取联系人
8....大概是这么个样子,那么就开始吧~~~~~~~~
复制代码

直奔主题:

用到的包:
import json
import random
import re
import time
import requests
复制代码

第一步:获取验证码图片保存到本地

# 首先为了之后能保持登录状态,我们要先弄一个全局的会话,以后的session都是这个了
session = requests.session()
# 获取验证码图片并保存
def get_code():# 这是验证码图片接口 后面是个随机数code_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&{}'.format(str(random.random()))r = session.get(code_url)with open('code.png', 'wb') as f:f.write(r.content)print('获取验证码并保存成功')
复制代码

第二步:获取验证码的正确坐标

首先我们看到保存的验证图片如下(已打上编号):

那么就先说下手动验证,就是用你的钛合金狗眼分辨上图 然后输入:4 6

# 对8个小图坐标化,因为最终验证接口是得用坐标做参数的,比如上图对应的参数就应该是: 260,40,110,120
code = ['40,40', '110,40', '180,40', '260,40', '40,120', '110,120', '180,120', '260,120']
# 识别验证码 并得到正确坐标
def code_answer():num = input('请输入:')try:num = [int(num)]except ValueError:num = list(map(int, num.split()))answer = ''  # 构建一个空字符串for i in num:  # 对验证码序号列表进行遍历answer += code[i - 1] + ','  # 将每个验证码序号对应的位置信息添加到字符串中,并加上','号answer_result = answer.rstrip(',')print('得到验证码坐标:', answer_result)return answer_result
复制代码

然后就是高科技了,使用一个牛X的网站自动识别(最近不大稳定,可能要多几次):

# 识别验证码 并得到正确坐标
def code_answer():# 自动识别的网站 url = 'http://littlebigluo.qicp.net:47720/'files = {'file': open('code.png', 'rb')}r = session.post(url, files=files)num = r.text.split('<B>')[1].split('<')[0]#其实也就是上面这块获取 num 手动改成自动了 有兴趣的朋友可以做个判断,自动不稳定时提醒手动输入try:num = [int(num)]except ValueError:num = list(map(int, num.split()))print(num)answer = ''  # 构建一个空字符串for i in num:  # 对验证码序号列表进行遍历answer += code[i - 1] + ','  # 将每个验证码序号对应的位置信息添加到字符串中,并加上','号answer_result = answer.rstrip(',')print('得到验证码坐标:', answer_result)return answer_result
复制代码

第三步:验证验证码并登录

def check_and_login():# 如果之前没加 User-Agent 这里加一下headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}# 验证验证码的接口check_url = 'https://kyfw.12306.cn/passport/captcha/captcha-check'# 登录接口login_url = 'https://kyfw.12306.cn/passport/web/login'# 验证参数check_data = {'answer': code_answer(),# 这里就是上面我们得到的验证码坐标'login_site': 'E','rand': 'sjrand'}# 登录参数login_data = {'username': '12306账号','password': '12306密码','appid': 'otn'}print('开始验证验证码...')check_r = session.post(check_url, data=check_data, headers=headers, verify=False)  # 注意关掉SSL验证check_result = json.loads(check_r.text)if check_result['result_code'] == '4':  # 4代表成功,5代表验证码错误,8代表验证信息为空print(check_result['result_message'])login_r = session.post(login_url, data=login_data, headers=headers, verify=False)login_result = json.loads(login_page.text)print(login_result)# 这里就是表面上登录成功了,但是是得不到用户信息得,还得需要多次验证validate_apptk(get_apptk()) # 获取tk并验证tkisLogin() # 验证登录 如果正确 返回带有实名的结果 至此登录完成else:print('验证失败,开始重新验证')get_code()check_and_login()return
复制代码

第四步:验证登录

# 首先获取一个 apptk
def get_apptk():url = 'https://kyfw.12306.cn/passport/web/auth/uamtk'data = {'appid': 'otn'}r = session.post(url, data=data)result = json.loads(r.text)return result['newapptk']
# tk验证 把上面获取到的 apptk Post去验证
def validate_apptk(newapptk):url = 'https://kyfw.12306.cn/otn/uamauthclient'data = {'tk': newapptk}r = session.post(url, data=data)result = json.loads(r.text)print('postTk', result)
# 最后验证
def isLogin():url = 'https://kyfw.12306.cn/otn/login/conf'r = session.get(url)result = json.loads(r.text)print(result) # 打印结果 如果结果有 name = 你的实名 则真正登录成功,接下来就可以用这个保存登录状态的session去浪了~
复制代码

第五步: 下面就是真正的骚操作了

都已经拿到保存登录状态的session了,接下来 就是抓接口 去扫票下单了。 接口就不说了,我用的google浏览器 打开12306网站 F12 然后正常操作一遍扫票流程,就可以在右找到了。吃饭前给到大家发个红包 滑稽~滑稽~

转载于:https://juejin.im/post/5c18be5cf265da610e800541

Python-又到了抢票的季节(带验证码识别验证)相关推荐

  1. python编程实践(3):python+selenium实现12306抢票脚本

    又到了一年一度的春运时节,抢个票? 1.设计思路 如果我们要买一张火车票,我们会怎么做?打开12306,登陆,输入出发地和目的地,选择出行日期,然后点击查询,有余票的话就下单购买,没有票就点刷新或者等 ...

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

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

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

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

  4. fill splinter 延迟_学习python +splinter自动刷新抢票

    一年一度的春运又来了, 今年我自己写了个抢票脚本. python +splinter自动刷新抢票,可以成功抢到(依赖自己的网络环境太厉害,还有机器的好坏), 但是感觉不是很完美, 有大神请指导完善一下 ...

  5. python +splinter自动刷新抢票

    一年一度的春运又来了, 今年我自己写了个抢票脚本. python +splinter自动刷新抢票,可以成功抢到(依赖自己的网络环境太厉害,还有机器的好坏), 但是感觉不是很完美, 有大神请指导完善一下 ...

  6. python+selenium实现12306抢票

    python+selenium实现12306抢票 一.准备工作 1.要先下载相关的包,selenium.interval.最好使用国内清华源 pip install (which package) - ...

  7. python实现网站的自动登录(selenium实现,带验证码识别)

    python实现网站自动登录(selenium实现,带验证码识别) 一.前言 这是鄙人写的第一篇博客,旨在总结一下近期所学,本文通过selenium工具实现工作所用网站的自动登录,下图为网站登录界面. ...

  8. Python版实现12306抢票功能,真的能帮你抢到春运回家的票吗?

    背景 每逢佳节倍思亲,年关将近,思乡的情绪是不是愈发强烈了,筒子们是不是又要准备开始抢票了,还是在找黄牛吗?但是,今年在考虑是否能抢到票以外,还需要考虑是否能回得去,没错,因为疫情,需要全国人民同心协 ...

  9. 想去看演唱却总是抢不到票?教你用Python制作一个自动抢票脚本

    前言 嗨喽!大家好,这里是魔王!! 大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会. 话剧.音乐剧.体育赛事等领域. 但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票 ...

最新文章

  1. 读后感与机翻《整体的三维场景解析和重建从单一的RGB图像》
  2. tensorflow生产环境部署
  3. python c#_【分享】C# 调用 Python 脚本, 与 Python 调用 C# 类库
  4. 《组织行为学》_09 彩虹理论:人力资本越来越高怎么办?
  5. 机器学习模型,能分清川菜和湘菜吗?
  6. docker修改容器映射的端口_解密 Docker 挂载文件,宿主机修改后容器里文件没有修改...
  7. android 更新平台,Android更新平台架构方案
  8. nacos 整合Dubbo 多服务
  9. Java集合的线程安全用法
  10. 基于注解的 Spring MVC 简单入门
  11. 遇到Python中文目录名问题,未解决
  12. VMware Funsion 修改vmnet1/vmnet8默认网络地址及DHCP地址
  13. linux 网口对应网卡_【电脑知识】在纯DOS下更改BIOS中网卡MAC地址教程
  14. UBUNTU18.04系统安装打印机
  15. python语言的运行效率高吗_为什么Python效率这么低,还这么火?
  16. layui-模糊查询后在数据表格中显示
  17. 2021年小米校招java编程题
  18. IOS Appstore 预览图尺寸
  19. 直击|为防虚假信息 百合佳缘引入第三方征信查询合作
  20. 2022-2000-1978:世纪前后22年

热门文章

  1. Ubuntu配置TFTP服务器
  2. Android学习笔记----Java中的字符串比较
  3. JavaScript和jQuery的学习
  4. servlet/filter/listener/interceptor区别与联系(转)
  5. [翻译]创建ASP.NET WebApi RESTful 服务(9)
  6. javax.imageio.IIOException: Unsupported Image Type
  7. C#回顾 - 3.NET的IO:字节流
  8. 远程调试tomcat
  9. oracle mysql 常用语句(查询表中某字段有几种类型,及每种类型有多少个数、插入多行、查询前几行)
  10. python 如何判断excel单元格为空_如何用python处理excel(二)