Python反爬案例——验证码的识别

news2024/12/23 13:48:07

验证码的识别

使用打码平台识别验证码

利用打码平台可以轻松识别各种各样的验证码,图形验证码、滑动验证码、点选验证码和逻辑推理验证码。打码平台提供了一系列API,只需要向API上传验证码图片,它便会返回对应的识别结果。

使用超级鹰平台,官网:https://www.chaojiying.com/ ,首页如图所示:
在这里插入图片描述

超级鹰打码平台支持识别的内容包括但不限于:简单数字、字母、中文字符、滑动拼图验证等类型的验证码。同时,该平台还提供云端识别服务,可为所有软件提供验证码识别自动化解决方案,帮助客户进行验证码识别、远程答题、人工打码,以实现价值。

使用超级鹰打码平台进行验证码识别的步骤通常包括以下几点:

  • 注册并登录超级鹰打码平台的账号。
  • 下载需要识别的验证码图片,并将其保存在本地。
  • 调用平台提供的API或示例代码,将图片数据发送到超级鹰打码平台进行识别。
  • 接收平台返回的识别结果,并进行后续的操作。

通过这个平台,用户可以轻松地对各种类型的验证码进行识别,从而提高自动化流程的效率和准确性。

  1. 准备工作

安装两个Python库——opencv-python和Pillow,安装命令如下:

pip3 install opencv-python pillow

自行下载测试所用的验证码,地址为https://github.com/Python3WebSpider/CaptchaPlatform,可以先复制下来:

git clone [https://github.com/Python3WebSpider/CaptchaPlatform](https://github.com/Python3WebSpider/CaptchaPlatform).git

复制之后,本地出现一个CaptchaPlatform-master文件夹,内部存放的是测试需要的验证码图片。还有一个chaojiying.py文件,内容如下:

import requests
from hashlib import md5

class Chaojiying(object):
    
    def __init__(self, username, password, soft_id):
        self.username = username
        self.password = md5(password.encode('utf-8')).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
        }
    
    def post_pic(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 report_error(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()

定义了一个Chaojiying类,其构造方法接收三个参数。

  • username:超级鹰账户的用户名
  • password:超级鹰账户和密码
  • soft_id:软件ID,需要到超级鹰后台的“软件ID”中获取,如图所示,就生成一个软件ID928939:

在这里插入图片描述

这个类还实现了两个方法,post_pic方法用于上传验证码并获取识别结果,report_error方法用于上报识别错误,识别错误时不扣提分,就是不花钱。

以上内容都准备好后,开始识别验证码,首先是图像验证码。

在这里插入图片描述

  1. 图形验证码

这是一个由英文字母和数字组合而成的验证码,一共六位,查阅价格文档https://www.chaojiying.com/price.html,和这个验证码相符合的描述是“1-6位英文数字”,类型是“1006”,如图所示:

在这里插入图片描述

接着就可以编写实现代码:

from chaojiying import Chaojiying

"""
USERNAME、PASSWORD、SOFT_ID需要更改为自己的用户名、密码和软件ID
"""
USERNAME = 'lxw1973'
PASSWORD = '2~~~-**w'
SOFT_ID = '928939'
CAPTCHA_KIND = '1006'
FILE_NAME = 'captcha1.png'
client = Chaojiying(USERNAME, PASSWORD, SOFT_ID)
result = client.post_pic(open(FILE_NAME, 'rb').read(), CAPTCHA_KIND)
print(result)

这里首先利用USERNAME, PASSWORD和SOFT_ID三个信息初始化了一个Chaojiying对象,赋值为client变量,然后调用client的post_pic方法上传了图片中的二进制内容,这里把post_pic方法的第二个参数设置为CAPTCHA_KIND,即1006。

返回结果如下:

{'err_no': 0, 'err_str': 'OK', 'pic_id': '2246121180794820046', 'pic_str': '6m44nn', 'md5': '275d14cb7a43b2ce7c9aa1745be2aafd'}

可以看到,返回结果中的pic_str字段出现了正确的识别结果,识别成功。

  1. 点选验证码

12306的验证码就是非常典型的一种点选验证码。如下图所示的点选验证码:

在这里插入图片描述

比较符合这个验证码的描述是“坐标多选”,类型是“9004”,会返回1~4个坐标,如图所示:

在这里插入图片描述

将“图形验证码”代码中的CAPTCHA_KIND改为9004,FILE_NAME改成captcha2.png,然后重新运行代码,结果如下:

{'err_no': 0, 'err_str': 'OK', 'pic_id': '2246121320794820047', 'pic_str': '94,121|206,139', 'md5': 'b7ab91737bc958b6dd47bf63921a615d'}

可以看到返回结果中的pic_str字段变成了’94,121|206,139’,使用OpenCV技术在上图中标注出这个点:

import cv2

image = cv2.imread('captcha2.png')
image = cv2.circle(image, (94, 121), radius=10, color=(0,0,255), thickness=-1)
image = cv2.circle(image, (206,139), radius=10, color=(0,0,255), thickness=-1)
cv2.imwrite('captcha2_label_test.png', image)

运行结果如下图:

在这里插入图片描述

可以看到标注出来的正是第1张和第2张图片,没问题,验证成功!

另外,还有些验证码也属于点选类型,例如指定点击物品的颜色的验证码,如图所示:

在这里插入图片描述

指定文字点击顺序的验证码,如图所示:

在这里插入图片描述

要求按照语序点击文字的验证码,如图所示:

在这里插入图片描述

  1. 滑动验证码

我们再来验证滑块验证码,这里以下图为例进行讲解,如下图所示:

在这里插入图片描述

查阅价格文档,比较符合这个验证码的描述是“坐标选一”,类型是“9101”,如图所示:

在这里插入图片描述

和“点选验证码”类似,将“图形验证码”代码中国内地CAPTCHA_KIND改成9101,FILE_NAME改成captcha3.png,然后重新运行代码,得到如下结果:

{'err_no': 0, 'err_str': 'OK', 'pic_id': '1246122000794820048', 'pic_str': '204,90', 'md5': '66608b4a14544e3b3b36c56c94e1959d'}

可以看到返回结果中的pic_str字段变成了204,90,我们用OpneCV技术在例图上标注这个点:

import cv2

image = cv2.imread('captcha3.png')
image = cv2.circle(image, (204, 90), radius=10, color=(0,0,255), thickness=-1)
cv2.imwrite('captcha3_label_test.png', image)

返回结果如下图:

在这里插入图片描述

可以在图片上做一些处理,例如添加自定义的文字,提醒标注人员哪里是正确的位置。下面使用OpenCV技术在例图上加一行字“请点击目标缺口的左上角”:

import cv2
from PIL import ImageFont, ImageDraw, Image
import numpy as np
import io
from chaojiying import Chaojiying

USERNAME = 'lxw1973'
PASSWORD = '2~~~-**w'
SOFT_ID = '928939'
CAPTCHA_KIND = '9101'
def cv2_add_text(image, text, left, top, textColor=(255, 0, 0), text_size=20):
    image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype('simsun.ttc', text_size, encoding='utf-8')
    draw.text((left, top), text, textColor, font=font)
    return cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)

image = cv2.imread('captcha3.png')
image = cv2_add_text(image, '请点击目标缺口的左上角', int(image.shape[1]/10), int(image.shape[0]/2), (255,0,0), 40)
client = Chaojiying(USERNAME, PASSWORD, SOFT_ID)

image = cv2.circle(image, (204, 90), radius=10, color=(0,0,255), thickness=-1)
client = Chaojiying(USERNAME, PASSWORD, SOFT_ID)
result = client.post_pic(io.BytesIO(cv2.imencode('.png', image)[1]).getvalue(), CAPTCHA_KIND)
print(result)

这里我们定义一个cv2_add_text方法,由于直接添加中文会产生乱码,所以需要借助Pillow库,并且依赖一个中文字体文件,添加文字后,图片如下所示:

在这里插入图片描述

重新运行代码,得到如下结果:

{'err_no': 0, 'err_str': 'OK', 'pic_id': '1246209360794820050', 'pic_str': '200,90', 'md5': '428e629f358f39a7d899a0f19a5852de'}

这时返回结果中的pic_str字段变成了200,90,标注一下这个点,结果如图所示:

在这里插入图片描述

  1. 问答验证码

再看一种验证码——问答验证码,样例图片入下图所示:

在这里插入图片描述

可以看到,验证码上有一个问题,并且在问题后的括号里有答案提示,问题中每个字的颜色、形状和字与字之间距离各不相同,背景中还有一些干扰线。

这种验证码,如果想自动化完成识别,难度是比较大的。首先需要识别出图片上的文字,这对正确率有很高的要求。在能正确提取所有文字并且问题相对简单的前提下,可以通过用爬虫模拟一些网络搜索操作获得结果。如果问题稍微复杂一些或者在网络上搜素不到答案,可以通过一些自然语言处理技术或者知识库获得答案。但总的来说,通过纯技术手段识别问答验证码的难度还是比较高的。

这样的验证码,比较合适的解决方案依然是打码平台,借助平台背后的人工力量完成识别。同样,查阅一下超级鹰平台对此类验证码的支持情况,如图所示:

在这里插入图片描述

可以看到6004类型是支持此类验证码的,我们把代码中的CAPTCHA_KIND改成6004,FILE_NAME改成captcha4.png,然后重新运行代码,得到如下结果:

from chaojiying import Chaojiying

"""
USERNAME、PASSWORD、SOFT_ID需要更改为自己的用户名、密码和软件ID
"""
USERNAME = 'lxw1973'
PASSWORD = '~~~~-**w'
SOFT_ID = '928939'
CAPTCHA_KIND = '6004'
FILE_NAME = 'captcha4.png'
client = Chaojiying(USERNAME, PASSWORD, SOFT_ID)
result = client.post_pic(open(FILE_NAME, 'rb').read(), CAPTCHA_KIND)
print(result)

运行结果如下:
{'err_no': 0, 'err_str': 'OK', 'pic_id': '2246210120794820051', 'pic_str': '大象', 'md5': '985c12e820556347a54f149111a40bba'}

返回结果中的pic_str字段是大象,回答正确,如此看来,打码平台着实非常强大。

更多的体验可以在小蜜蜂AI网站获取,网址为:https://zglg.work

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1562257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)

【写在前面】 之前应公司需要,给公司写过一整套直播的库( 推拉流,编解码),类似于 libobs。 结果后来因为没有相关项目,便停止开发&维护了。 不过里面很多有用的组件,然后也挺好用的,遂开源出来一部分。…

软件测试(测试用例详解)(三)

1. 测试用例的概念 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合。 测试环境操作步骤测试数据预取结果 测试用例的评价标准: 用例表达清楚,无二义性。。用例可操作性强。用例的输入与输出明确。一条用例只有…

怎么在UE游戏中加入原生振动效果

我是做振动触感的。人类的五感“视听嗅味触”,其中的“触”就是触觉,是指皮肤、毛发与物体接触时的感觉。触感可以带来更加逼真的沉浸式体验。但也许过于司空见惯,也是习以为常,很多人漠视了触感的价值。大家对触感的认知还远远不…

skywalking idea中启动调试报错Output path is shared between the same module error

报错信息 简单描述:就是多个moudle一样用了一样的输出路径,这样容易造成冲突 Output path is shared between the same module error 参考:scala - Output path is shared between the same module error - Stack Overflow 解决方法&…

VScode使用Prettier格式化代码

1、安装Prettier插件 2、扩展设置 3、设置.prettierrc.json配置文件路径 4、.prettierrc 配置文件 .prettierrc.json 是 Prettier 格式化工具的配置文件,用于指定代码格式化的规则和风格。下面是一些可能的配置选项,请自行选择: {"prin…

spring boot自动配置原理-怎样回答这个问题

首先我们说一下自动配置的概念。 自动配置:遵循约定大约配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器 例子 程序引入spring-boot-starter-web 起步依赖,启动后,会自动往ioc容器中注入…

一文了解微带天线

微带天线介绍 微带天线的结构一般由介质基板、辐射体及接地板构成。介质基板的厚度远小于波长,基板底部的金属薄层与接地板相接,正面则通过 光刻工艺 制作具有特定形状的金属薄层作为辐射体。 辐射片的形状根据要求可进行多种变化。微波集成技术和新型制…

高频小信号放大器概述

高频放大器与低频(音频)放大器的主要区别是:工作频率范围和所需通过的频带宽度都有所不同。其采用的负载也不相同。 低频放大器的工作频率低,但工作频带宽度很宽,所以负载采用无调谐负载,例如电阻、有铁心…

Docker容器监控之CAdvisor+InfluxDB+Granfana

介绍:CAdvisor监控收集InfluxDB存储数据Granfana展示图表 目录 1、新建3件套组合的docker-compose.yml 2、查看三个服务容器是否启动 3、浏览cAdvisor收集服务,http://ip:8080/ 4、浏览influxdb存储服务,http://ip:8083/ 5、浏览grafan…

flink: 将接收到的tcp文本流写入HBase

一、依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…

总结:微信小程序中跨组件的通信、状态管理的方案

在微信小程序中实现跨组件通信和状态管理,有以下几种主要方案: 事件机制 通过事件机制可以实现父子组件、兄弟组件的通信。 示例: 父组件向子组件传递数据: 父组件: <child binddata"handleChildData" /> 子组件: Component({..., methods: { handleChildData(…

VTK 简介

VTK 简介 VTK 简介什么是 VTK&#xff1f;VTK 能做什么&#xff1f;VTK 的基本组成VTK 的框架结构VTK 的数据结构VTK 的可视化流程参考 VTK 简介 什么是 VTK&#xff1f; VTK&#xff0c;全称是Visualization Toolkit&#xff0c;即可视化工具包。是一个开源、跨平台、可自由…

C++面向对象程序设计 - 访问对象中成员的3种方法

在C程序中访问对象的成员变量和成员函数&#xff0c;有三种方法&#xff1a; 通过对象名和成员运算符访问对象中的成员&#xff1b;通过指向对象的指针访问对象中的成员&#xff1b;通过对象的引用变量访问对象中的成员 在了解访问对象中成员的3种方法前&#xff0c;先了解下C…

uniapp 小程序和app map地图上显示多个酷炫动态的标点,头像后端传过来,真机测试有效

展示效果 二、引入地图 如果需要搜索需要去腾讯地图官网上看文档&#xff0c;找到对应的内容 1.申请开发者密钥&#xff08;key&#xff09;&#xff1a;申请密钥 2.开通webserviceAPI服务&#xff1a;控制台 ->应用管理 -> 我的应用 ->添加key-> 勾选WebService…

LCD TP触摸屏调试方法

一、硬件连接 I2C总线&#xff1a;I2C-SDA和i2C-SCL 中断信号&#xff1a;touch-gpio 复位信号&#xff1a;reset-gpio 电源信号&#xff1a;power-gpio 二、驱动调试 2.1 确认从设备地址 在给TP供电正常后&#xff0c;检测其I2C设备从地址&#xff0c;或者通过datashee…

香港科技大学广州|数据科学与分析学域硕博招生宣讲会—天津大学专场

时间&#xff1a;2024年4月12日&#xff08;星期五&#xff09;14:00 地点&#xff1a;天津大学北洋园校区55楼B204 报名链接&#xff1a;https://www.wjx.top/vm/Q0cKTUI.aspx# 跨学科研究领域 *数据驱动的人工智能和机器学习 *统计学习和建模 工业和商业分析 *特定行业的数…

渗透测试:数据库UDF提权(linux)

目录 开头: 1.UDF提权简介&#xff1a; 1.1共享库文件(UDF文件)指定目录&#xff1a; 版本特征&#xff1a; 操作系统版本&#xff1a; 2.靶场UDF提权复现 提权前提 1.要有一个高权限的MySQL的账号 ​编辑 2.MySQL的权限配置secure_file_priv为空 3.必须有存放UDF文件的…

非关系型数据库——Redis配置与优化

目录 一、关系型数据库和非关系型数据库 1.定义 1.1关系型数据库 1.2非关系型数据库 2.非关系型数据库产生的背景 3.关系型数据库和非关系型数据库区别 3.1适用性不同 3.2数据一致性要求不同 3.3数据模型不同 3.4数据查询语言不同 3.5数据存储方式不同 3.6扩展方式…

【面试八股总结】超文本传输协议HTTP(二)

一、HTTP缓存技术 将资源&#xff08;如网页、图像、脚本等&#xff09;的副本存储在客户端或中间代理服务器上&#xff0c;以便将来的请求可以直接从缓存中获取&#xff0c;而不必重新从服务器下载资源。这有助于减少网络延迟&#xff0c;提高页面加载速度&#xff0c;并减轻…

Docker工作流

1.工作流 开发应用编写Dockerfile构建Docker镜像运行Docker容器测试应用发布镜像到Hub迭代更新镜像 2.开发应用 首先你需要创建一个应用&#xff0c;这个应用可以是后端应用或者前端应用&#xff0c;任何语言都可以。 比如&#xff1a;我使用IDEA 创建一个Java后端应用&…