用Python模拟识别图片验证码并发送手机验证码

article/2025/8/27 19:16:28

1、导语

大家好,好久不见。又到每日分享Python小技能的时候了。最近因为疫情影响,所以更新内容比较慢…今天周一,就来更新一波,心血来潮,是时候上线经营了。其实也没想到有啥好分享的,不如分享一些干货给大家,今天就分享一下如何识别图片验证码并发送手机验证码的思路和代码(基于python,对于过程中的涉及的浏览器技术原理我不过多赘述,不懂且想了解的小伙伴请自行搜索学习)。

在这里插入图片描述

2、目录

首先,我们的程序分为三部分:

1、代理部分(防止频繁请求被封,非必须)

2、识别部分(主要是某些验证码识别网站的demo,自己下载后进行相应改进)

3、执行部分

在这里插入图片描述

3、选择例子

选取一个网站作为例子,例如这个网站,它的验证形式为图片验证码验证,且图片比较复杂,对打码平台的要求较高:

我们打开开发者模式,切换到network窗口,手动输入手机号码,并输入图片验证码的内容,点击发送,进行抓包分析(框出或者标识部分都是重要部分,由于部分字段涉及个人及网站隐私安全,已做马赛克处理):

上面就是我们模拟发送短信验证码抓到的包,这个表单数据(form data)还是相对简单,除了phone(输入的手机号)和Verify(输入的图片验证码)是变化的,其他都是固定格式。有些相对复杂的,会有其他的加密方式,如md5对手机号加某些信息加密后传输,这些往往需要我们进行js解析(此处不过多赘述,请自行了解)。现在我们要做的就是识别验证码后将数据传入并模拟发送,话不多说,我们开始。

4、代理部分

什么代理:

 代理服务器(Proxy Server)的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中转站,是个人网络和Internet服务商之间的中间代理机构,负责转发合法的网络信息,对转发进行控制和登记。代理服务器作为连接Internet与Intranet的桥梁,在实际应用中发挥着极其重要的作用,它可用于多个目的,最基本的功能是连接,此外还包括安全性、缓存、内容过滤、访问控制管理等功能。更重要的是,代理服务器是Internet链路级网关所提供的一种重要的安全功能,它的工作主要在开放系统互联(OSI)模型的对话层。

(更多详情,如专享ip、隧道ip这些请自行了解)

   我们这里做代理ip,主要是为了安全起见,由于我们的频繁访问,网站管理者发现异常后极有可能将我们的ip封禁,所以我们需要使用代理ip,通过代理ip作为桥梁去访问。市面上有很多的代理ip提供,有免费的、收费的,当然,免费的代理ip体验上是很差的,很多都不能用。我们自己可以去购买一些网站的套餐使用会流畅很多。至于哪家网站的代理ip好用,可以自行查找相关信息。我这里使用的是 芝麻HTTP。为了使代码看起来更简单,我使用单个ip进行演示,代码如下:
#proxy.pyproxy = '113.128.28.102:4231'proxies = {    'http':'http://'+proxy}

在这里插入图片描述

5、识别部分

识别验证码我们仍然使用的是第三方的网站的代码,python有Tesseract-OCR模块供识别图片,但识别率低。

市面上很多打码平台,识别率最好的是超级鹰,但收费较贵。其他的还有 图鉴、斐斐打码 之类的平台,收费较为亲民,但识别率不是很高。

对于我们这个例子,验证码较为复杂,一般的打码平台识别不出,所以我们选择使用超级鹰。

对于这类的打码平台,我们一般是注册充值后,复制他们提供的demo代码,将账号信息填入使用。每次使用需要下载图片验证码到本地,由于验证码具有时效性,每次访问都会变化,我们为了保证两次访问一致,主要保证两次访问的cookies一致。

在这里插入图片描述

代码如下:

####Python学习交流群:906715085####
!/usr/bin/env python# coding:utf-8
#这个代码是超级鹰提供的demo的基础上,本人为了方便调用自行改造后的代码
import osfrom proxyimport proxiesimport requestsfrom hashlibimport md5headers={    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}class Chaojiying_Client(object):def __init__(self, username, password, soft_id):       self.username = username        password =  password.encode('utf8')        self.password = md5(password).hexdigest()        self.soft_id = soft_id        self.base_params = {            'user': self.username,            'pass2': self.password,            'softid': self.soft_id,        }        self.headers = {            'Connection': 'Keep-Alive',            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',        }def PostPic(self, im, codetype):        """       im: 图片字节      codetype: 题目类型 参考 http://www.chaojiying.com/price.html        """       params = {            'codetype': codetype,        }       params.update(self.base_params)       files = {'userfile': ('ccc.jpg', im)}      r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)        return r.json()def ReportError(self, im_id):        """        im_id:报错题目的图片ID        """        params = {            'id': im_id,        }        params.update(self.base_params)       r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)      return r.json()
def main(imgPath,CodeType):
#这一行填写自己在超级鹰官网的账号信息,记得把我在代码标的中文替换  chaojiying = Chaojiying_Client('账号', '密码', '校验码')   im = open(imgPath, 'rb').read()    res=chaojiying.PostPic(im, CodeType)   code=res['pic_str']   return code#imgDispose这一函数是执行代码和识别代码之间调用的桥梁,不使用代理请将  ,proxies=proxies 删除def imgDispose(img_url,val):   response=requests.get(url=img_url,headers=headers,proxies=proxies)   img_data=response.content   cookies=response.cookies.get_dict()    #每次识别先将图片保存到本地,识别完删除   with open('img\CJYcodeImg.png',mode='wb') as f:        f.write(img_data)    code = main('img\CJYcodeImg.png', val)    os.remove('img\CJYcodeImg.png')   return code,cookies

在这里插入图片描述

6、执行部分

执行部分会用到我们抓包的信息,并相关信息填对就行,请自行举一反三。

mport reimport time
import chaojiyingDemofrom proxy 
import proxiesimport requests
phoneNumber='手机号'
headers2={    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'}userAgent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'def identify(code_url,typeId,sendCode_url,headers,data,dataCode,funcName):    try:        
result=chaojiyingDemo.imgDispose(code_url,typeId)       imgCode=result[0]       cookies=result[1]       data[dataCode]=imgCode       response = requests.post(url=sendCode_url,headers=headers,cookies=cookies,data=data, proxies=proxies, timeout=10)        return '函数'+funcName+' 执行返回的结果为>>>>>>'+response.content.decode('utf-8')  except Exception as e:        return '函数' + funcName + ' 发生错误!' + str(e.args)def cjy2():#上学吧    headers = {        'Accept': 'text/plain, */*; q=0.01',        'Accept-Encoding': 'gzip, deflate, br',        'Accept-Language': 'zh-CN,zh;q=0.9',       'Connection': 'keep-alive',       'Content-Length': '60',       'Content-Type': 'application/x-www-form-urlencoded',       'Host': '',        'Origin': '',       'Referer': '',        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',        'sec-ch-ua-mobile': '?0',        'Sec-Fetch-Dest': 'empty',        'Sec-Fetch-Mode': 'cors',        'Sec-Fetch-Site': 'same-origin',       'User-Agent': userAgent,        'X-Requested-With': 'XMLHttpRequest'    }    data={        'phone': phoneNumber,        'dataid': '0',        'action': 'SMSSend',        'typeid': '0',    }   #6601是打码平台识别的验证码类型码    identify('图片验证码的url',6001,'发送的url(抓包得到的)',headers,data,'Verify','cjy2')
cjy2()

7、最后
最近各地疫情爆发,大家一定要保护好自己。这一篇的小技巧还是比较简单的,学会了就可以开始练练手了。码代码还是有点辛苦(点赞),到这里就跟大家说再见了,不会的可以告诉我,我一般看见都会回复。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/VS8P7KN9.shtml

相关文章

springboot发送短信验证码

学习目标: 阿里云短信服务 准备工作: 注册阿里云账户开通短信服务申请签名和模板拿到AccessKey 大概说一下测试和申请流程,输入https://www.aliyun.com/进入官网,然后注册账号,直接在搜索框输入短信服务就能找到&…

SpringBoot 通过阿里云的短信功能 实现发送手机验证码

我们在项目中经常遇到 需要通过手机号发送验证码实现登录注册等功能。 这里讲一下,Springboot项目中如果通过阿里云的短信功能, 实现发送手机验证码并验证 一、准备工作 1、购买阿里云的短信服务 https://free.aliyun.com/product/cloudcommunication-…

使用node实现向手机发送验证码

步骤一:安装node.js Node官方网站https://nodejs.org/en/ 下载node.js 安装好之后输入 node -v 能够显示版本号表示安装成功了 步骤二:注册并登陆聚合科技,申请短信API服务 我们来到聚合科技的官网中https://www.juhe.cn/ ,注册…

项目接入腾讯云短信服务SMS实现向用户发送手机验证码

1、自述 早在18年的时候,我就在项目中使用过阿里云的短信服务,现在我上阿里云短信控制台看,还能看到当时创建的短信签名,如下图所示。 出于某种原因,我现在想重新申请一个新的签名,却审批失败了&#xf…

SpringBoot+vue 使用阿里云的短信功能发送手机验证码

前言: 小编后端用的是Springboot 前端用的是vue ,小编主要是写后台,前端页面比较简陋,后期还要调优,写的不对处还望多多包涵。 环境: 需要先准备好阿里云的账号和一些必要的参数。详情见我的另一篇博客。 https://blo…

腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现)

文章目录 腾讯云短信服务实现 Java 发送手机验证码(SpringBootRedis 实现)1、打开腾讯云短信服务2、创建短信签名3、创建短信正文模板4、等待全部审核完毕即可5、发送短信6、短信业务实战(SpringBootRedis)(1&#xff…

Spring boot 发送手机验证码

由于阿里云现在的短信签名无法通过申请,所以我这里选择了中国网建SMS短信平台(手机号注册即用,有免费赠送的几条短信测试) demo代码地址:https://github.com/mer97/springboot-sendmessage Spring boot 实现发送手机验…

Java实现发送手机验证码,发送短信

要发送短信,我们需要第三方提供的短信接口,这里我使用阿里云的短信服务。 首先进入阿里云的官网,然后注册。登陆之后选择云通信——》短信服务 然后点击免费开通。 开通后进入控制中心,选择右上方的支持与服务,选择帮…

Java实现手机发送短信验证码

发送短信验证码首先要在互亿无线短信平台去开通短信服务,地址"ihuyi.com" 一定要留好自己申请的API ID,API key和模板参数说明:代码示例: pom导包 <!-- 短信 --> <dependency><groupId>dom4j</groupId><artifactId>dom4…

SSM发送手机验证码——以网建SMS为例

整理一下从大二开始写的东东 后台源码链接&#xff1a; 点我自取 到网建申请一个帐号&#xff0c;好像可以免费用10条短信 设置用户名、密钥&#xff0c;在发送的时候需要携带该信息 前端代码简化后如下&#xff0c;提交表单我用的是ajax&#xff0c;如果直接提交表单记得name…

Java实现发送手机验证码

向手机发送验证码在用户注册等等业务中会用到&#xff0c;下面我来介绍如何用Java实现向手机发送验证码。 笔者此处使用的是阿里云的短信服务&#xff0c;首先需要登录阿里云官方网站&#xff0c;找到并开通短信服务&#xff0c;然后需要申请短信签名和模版&#xff0c; 短信签…

java 实现发送手机验证码的功能 (超详细)

我这里使用的旦米&#xff08;http://www.danmi.com/&#xff09;你们用阿里的就去看看其他博客 1.首先注册一个旦米的账号,第一次注册会免费的送你10元。足够你去测试用&#xff0c;不用担心自己去充钱。 2.注册好了登录进去&#xff0c;必须要公司认证&#xff0c;认证通过之…

java实现发送手机验证码功能

1. 进入秒嘀科技&#xff08;http://www.miaodiyun.com/&#xff09;&#xff0c;注册一个账号 2. 注册好之后&#xff0c;点击 用户中心 -> 账户管理&#xff0c;就会进入如下界面 &#xff08;顺便提一下&#xff0c;新注册的用户&#xff0c;平台会免费赠送你10元&#…

vue使用element发送手机验证码倒计时

发送验证码倒计时 html <el-form class"form" :model"form" labeal-position"left"> <el-form-item label"姓名"><el-input v-model"form.Name" placeholder"请输入姓名"></el-input>…

C# WinForm 使用SMS接口发送手机验证码+图形验证码+IP限制

文章目录 前言功能实现一、功能界面二、创建图形验证码类三、创建存储IP地址的数据库表四、创建手机验证码类五、在Form1中调用以上两个类中的函数&#xff0c;实现功能 前言 1.发送手机验证码用的是网建的SMS接口&#xff08;http://sms.webchinese.cn/&#xff09;   2.手机…

uniapp | 发送手机验证码 button组件

一、功能和效果展示 1.组件功能 uniapp &#xff08;1&#xff09;按钮初始显示“发送”&#xff0c;点击按钮后按钮显示倒计时60s&#xff1b; &#xff08;2&#xff09;倒计时60s期间点击按钮&#xff0c;不会重置计时器&#xff1b; &#xff08;3&#xff09;倒计时60s结…

发送手机验证码

手机验证码不能自己生成&#xff0c;需要由第三方来完成发送。本文选择网易云作为第三方来发送验证码。 首先&#xff0c;我们要注册网易云账号&#xff0c;完成登陆。选择“产品与服务”选项中的“通信与视频”&#xff0c;点击创建应用&#xff0c;完成后&#xff0c;下方有…

java发送手机验证码实现

正文 今天来用java实现手机验证码的发送。 短信平台有很多&#xff0c;中国网建提供的SMS短信通&#xff0c;注册免费5条短信&#xff0c;3条彩信&#xff0c; http://sms.webchinese.cn/ 但是刚才试了&#xff0c;第一次用官方提供的demo发送成功&#xff0c;然后整合到自…

Excel 字符串拼接

例子&#xff1a;“exec sp_addextendedproperty N’MS_Description’, N’”&B1&“‘, N’SCHEMA’, N’dbo’,N’table’, N’”&A1&“” &#xff1a;公式 “ abc ” &#xff1a; “”中间为任意字符/字符串 & A1 &&#xff1a;&&中间为拼…

Excel如何插入文本字符串或字符

目录 1.用“&”连接的方法插入文本或字符的办法及实例 2.用TEXT函数插入“&#xffe5;”或“$"字符 3.用TEXT函数以及“&”连接符插入文本或符号 1.用“&”连接的方法插入文本或字符的办法及实例 &#xff08;1&#xff09;方法&#xff1a;关键在于用“&a…