当验证码是四则运算(加减乘除)时,如何进行识别及提取

        现在系统登录页面的验证码一般都是图片形式,不论是UI测试还是接口测试,都要输入识别结果。图片里面有些是英文字母,有些是数字的四则运运算,不论是什么形式,本质的解决方法是对识别结果进行分割,然后提取。

1、Python的requests库响应方式contenttext的区别

在Python的requests库中,当你发送一个HTTP请求并获取响应时,响应对象提供了多种方法来访问返回的数据,其中contenttext是最常用的两种。它们的主要区别在于数据的类型和处理方式。

content

  • 类型:字节字符串(bytes
  • 内容:原始的二进制响应内容。
  • 使用场景
    • 当你需要处理非文本数据(如图片、视频、音频等)时。
    • 当你需要对响应内容进行二进制操作时。

text

  • 类型:字符串(str
  • 内容:响应内容的字符串表示,requests会根据响应头中的Content-Type自动解码。
  • 使用场景
    • 当你需要处理文本数据(如HTML、JSON、XML等)时。
    • 当你需要对响应内容进行字符串操作时。

这里我们要处理的是图片,所以选择对response.content进行处理。

2、将响应字节字符串转化为图片,并进行识别

3、对识别结果进行处理

关键步骤:使用正则表达式匹配数字和运算符

4、查看图片及计算结果

试了很多次,识别成功率还是很高的,但是也会有失败的情况,所以在编写登录功能的地方要加上重试机制

5、完整代码

import re
import uuid
import requests
import ddddocr


# print(randomStr)
class GetVerifyCode:
    def __init__(self, url):
        # print(url)
        self.url = url
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
        }
        resp = requests.get(self.url, headers=self.headers)
        image_data = resp.content
        code = self.get_code(image_data)
        # self.randomStr=randomStr
        self.result = self.get_result(code)

    # 将字节字符串转化为图片,并进行识别
    def get_code(self, image_data):
        # data=image_data
        image_path = "output_image.png"
        # 保存图片
        try:
            with open(image_path, 'wb') as f:
                f.write(image_data)
        except IOError:
            print("Error: can not write data to file.")
        ocr = ddddocr.DdddOcr(show_ad=False)
        # 读取图片并进行识别
        with open('output_image.png', 'rb') as f:
            dd = f.read()
        code = ocr.classification(dd)
        print(f"识别结果是: {code}")
        return code

    # 获取识别结果
    def get_result(self, code):
        try:
            # 使用正则表达式匹配数字和运算符
            match = re.match(r"(\d+)\s*([+\-*/x/X])\s*(\d+)", code)
            if match:
                num1 = int(match.group(1))  # 第一个数字
                operator = match.group(2)  # 运算符
                num2 = int(match.group(3))  # 第二个数字
                # 根据运算符计算结果
                if operator == '+':
                    result = num1 + num2
                elif operator == '-' or operator == '——':
                    result = num1 - num2
                elif operator == 'x' or operator == 'X' or operator == '*':
                    result = num1 * num2
                elif operator == '/':
                    result = num1 / num2
                else:
                    result = None
                print(f"计算结果是: {result}")
                return result
            else:
                # print("未能识别到有效的四则运算表达式")
                return None
        except Exception as e:
            print(f"计算失败: {e}")
            return None


if __name__ == '__main__':
    randomStr = str(uuid.uuid4())
    url = 'https://www.xxx.com/xxx/code?randomStr=' + randomStr
    obj = GetVerifyCode(url)
    code = obj.result
    # print(code)

6、登录功能

此处配合验证码识别附上登录功能

import requests
from common_file import captcha_ocr
import uuid

base_url = 'https://www.xxx.com/xxx/auth/xxx/token?'
username = '133xxxxxxxxxxx'
password = 'Yexxxxxxxxxxxxxx%3D'

class DoLogin:
    def __init__(self, username, password):
        i=1
        while i<=3:
            self.randomStr = str(uuid.uuid4())
            # print(self.randomStr)
            code_url = 'https://www.xxx.com/xxx/code?randomStr=' + self.randomStr
            obj = captcha_ocr.GetVerifyCode(code_url)
            self.code = obj.result
            self.username = username
            self.password = password
            url=base_url+'username={}&randomStr={}&code={}&grant_type=password&scope=server'.format(self.username, self.randomStr, self.code)
            # print(url)
            # 表单数据
            data ='password={}'.format(self.password)
            headers = {
                "Accept": "application/json, text/plain, */*",
                "Authorization": "Basic xxxxxxxxxxxxxxxxxxxx",  # 根据你提供的值,确保正确
                "Content-Type": "application/x-www-form-urlencoded"
            }
            try:
                response = requests.post(url, headers=headers, data=data)
                if response.status_code == 200:
                    # print(response.text)
                    self.token = response.json()['access_token']
                    break
                else:
                    print('第{}次尝试登录失败,错误信息:{}'.format(i,response.text))
                    self.token = None
                    i=i+1
            except requests.exceptions.RequestException as e:
                print('第{}次尝试登录失败,错误信息:{}'.format(i,e))
                self.token = None
                i=i+1
        if self.token is None:
            print('三次尝试登录失败,退出测试!')
        else:
            print('登录成功,token为:{}'.format(self.token))


if __name__ == '__main__':
    obj = DoLogin(username, password)

### 使用 DdddOcr 处理算术运算验证码 为了有效处理并识别算术运算验证码,可以采用 Python 的 `ddddocr` 库。此库专为应对各种类型的验证码设计,特别是针对带有简单数学表达式的图像验证[^1]。 下面是一个完整的例子展示如何利用 `ddddocr` 来解析这类验证码: #### 安装依赖包 首先确保安装了必要的软件包: ```bash pip install ddddocr pillow ``` #### 导入所需模块 接着,在脚本中导入所需的 Python 模块: ```python from PIL import Image import ddddocr ``` #### 初始化 OCR 对象 创建一个 `DdddOcr` 类实例用于后续调用其方法来进行图片到文字的转换操作: ```python ocr = ddddocr.DdddOcr() ``` #### 图像预处理函数 定义一个辅助函数用来清理背景干扰项,使目标更清晰可见以便于提高识别准确性。这里给出的是透明化特定颜色区域的方法之一[^2]: ```python def transparent_back(img): img = img.convert('RGBA') L, H = img.size color_list = [] # 收集要被替换的颜色样本点 for i in range(25): color_list.append(img.getpixel((i,i))) for h in range(H): for l in range(L): dot = (l,h) color_1 = img.getpixel(dot) if color_1 in color_list: new_color = (*color_1[:3], 0) # 设置 alpha 值为 0 实现完全透明效果 img.putpixel(dot, new_color) return img ``` #### 执行OCR识别过程 加载待分析的验证码图片文件,并对其进行初步处理后再交给 `ddddocr` 进行最终的文字提取工作: ```python image_path = 'captcha.png' # 替换成实际路径名 img = Image.open(image_path) # 调用自定义的图像预处理器 processed_img = transparent_back(img) # 将 Pillow.Image 对象转成字节流形式输入给 ddddocr result_bytes = processed_img.tobytes() # 获取识别后的字符串结果 recognition_result = ocr.classification(result_bytes) print(f"Recognition Result: {recognition_result}") ``` 通过上述流程能够较为高效地完成对含有基本加减乘除四则运算符在内的算术验证码的有效读取与解释任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值