手搓系列之ddddocr解决计算验证码100%免费通过率百分之90以上
评论
收藏

手搓系列之ddddocr解决计算验证码100%免费通过率百分之90以上

经验分享
【耐家军】DC
2026-03-11 14:37·浏览量:827
【耐家军】DC
影刀专家
影刀认证工程师
发布于 2026-03-11 14:31更新于 2026-03-11 14:37827浏览

验证码类型

验证码地址:登录-石材宝

效果展示

流程代码

py代码

注意事项:安装ddddcor及pillow库

# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能
# 2. package包提供访问当前应用数据的功能,如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作为流程独立运行时执行main函数
# 4. 可视化流程中可以通过"调用模块"的指令使用此模块

import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv
import ddddocr
from PIL import Image
import re

def recognize_calc_captcha(image_path):
    """
    识别数字计算验证码并返回计算结果
    :param image_path: 验证码图片路径
    :return: 计算结果(整数/浮点数),识别失败返回 None
    """
    try:
        # 1. 初始化ddddocr识别器(自动加载模型,首次运行会下载)
        ocr = ddddocr.DdddOcr()
        
        # 2. 读取验证码图片(二进制方式读取,兼容性更好)
        with open(image_path, 'rb') as f:
            image_bytes = f.read()
        
        # 3. 执行OCR识别,得到验证码字符串(如"5+7=")
        captcha_str = ocr.classification(image_bytes)
        
        # 4. 清理字符串:只保留数字、+、-、×、÷、*、/(处理不同写法的运算符)
        # 正则匹配:提取数字和常见运算符
        clean_str = re.sub(r'[^0-9\+\-\×÷\*/]', '', captcha_str)
        # 统一运算符格式(把×换成*,÷换成/,适配Python计算)
        clean_str = clean_str.replace('×', '*').replace('÷', '/')
        clean_str = re.findall(r"(\d+\D\d+)", clean_str)[0]
        print(f"清理后的计算表达式:{clean_str}")
        
        # 5. 校验表达式合法性(至少包含一个运算符)
        if not re.search(r'[\+\-\*/]', clean_str):
            print("识别结果无有效运算符,识别失败")
            return None
        
        # 6. 安全计算表达式结果(避免恶意表达式,此处仅针对验证码场景)
        result = eval(clean_str)
        
        # ========== 核心修复:统一转为float后判断是否为整数 ==========
        # 先转为float,再调用is_integer(),避免int类型报错
        float_result = float(result)
        if float_result.is_integer():
            result = int(float_result)  # 整数结果转int(如5.0→5)
        else:
            result = float_result       # 非整数保留float(如7/2=3.5)
        
        return result
    
    except FileNotFoundError:
        print(f"错误:图片文件 {image_path} 不存在")
        return None
    except SyntaxError:
        print("错误:识别的表达式语法错误")
        return None
    except Exception as e:
        print(f"识别失败,异常信息:{str(e)}")
        return None
    
    except FileNotFoundError:
        print(f"错误:图片文件 {image_path} 不存在")
        return None
    except SyntaxError:
        print("错误:识别的表达式语法错误")
        return None
    except Exception as e:
        print(f"识别失败,异常信息:{str(e)}")
        return None


def main(args):
    pass

推推:DCpage:基于 DrissionPage 打造的影刀专属自定义指令库

收藏30
全部评论1
最新
发布评论
评论