精易模块图像处理与OCR实战:构建一个自动化验证码识别系统
精易模块图像处理与OCR实战:构建一个自动化验证码识别系统
22.1 引言
💡 各位易语言开发者朋友大家好!前几篇我们通过中小学生成绩管理系统巩固了精易模块Excel操作的核心知识点,通过多线程电商数据采集与分析系统掌握了网络爬虫和数据分析的方法。今天我要为大家带来一个结合图像处理、OCR识别、自动化操作的深度实战项目——精易模块图像处理与OCR实战:构建一个自动化验证码识别系统。
在网站登录、注册、密码找回等场景中,验证码是防止恶意攻击的重要手段,但手动输入验证码存在效率低、容易出错等问题。易语言配合精易模块的图像处理支持库和Tesseract OCR引擎,可以开发出功能完备、稳定可靠的自动化验证码识别系统,将验证码识别时间从手动的5秒/个缩短到系统的0.5秒/个,大大提高了工作效率。
22.1.1 项目背景
某电商运营团队每天需要登录多个电商平台的后台进行数据分析和操作,每个平台的登录都需要输入验证码,每天手动输入验证码的次数达到200+次,存在以下问题:
- 手动输入效率低
- 容易出错(如验证码模糊、字符重叠等)
- 工作强度大
- 无法实现自动化操作
22.1.2 需求分析
✅ 功能需求:
- 系统登录与权限管理:支持管理员和普通用户两种角色,不同角色拥有不同的权限
- 配置管理:支持配置多个账号密码、验证码地址、登录地址、Tesseract OCR路径等
- 验证码获取:使用精易网页访问对象获取验证码图片
- 验证码预处理:对验证码图片进行预处理(如灰度化、二值化、降噪、分割等),提高识别准确率
- 验证码识别:调用Tesseract OCR引擎对预处理后的验证码图片进行识别
- 自动化操作:使用精易模块的窗口操作组件模拟用户操作(打开浏览器、输入账号密码、输入验证码、点击登录)
- 识别记录管理:记录验证码的识别过程(验证码图片、识别结果、准确率等),以便后续优化
- 图表可视化:使用图表组件可视化显示验证码识别的准确率和成功率
- 定时任务:支持定时执行自动化操作(如每天凌晨登录电商平台后台)
- 系统设置:支持系统参数配置(如请求间隔、代理IP、识别阈值等)
✅ 非功能需求:
- 安全性:使用加密算法加密关键数据(如数据库密码、账号密码、代理IP),防止数据泄漏
- 稳定性:程序在长时间运行时保持稳定
- 性能:验证码识别的准确率≥85%,识别时间≤1秒/个
- 易用性:界面简洁美观,操作简单,符合用户的使用习惯
- 可扩展性:支持添加新的验证码类型和识别算法
22.1.3 学习目标
- 掌握精易模块的用户管理、数据库操作、图像处理、OCR识别、自动化操作、图表可视化、定时任务等高级功能
- 学会三层架构和模块化设计在自动化操作项目中的应用
- 掌握精易模块图像处理支持库的高级使用方法(如灰度化、二值化、降噪、分割等)
- 学会Tesseract OCR引擎的调用方法
- 学习自动化操作的实现方法(如打开浏览器、输入文本、点击按钮等)
- 掌握项目的打包与部署方法
22.2 系统架构设计
22.2.1 技术选型
✅ 开发语言:易语言
✅ 核心支持库:精易模块(版本:5.1.2)、MySQL支持库、网络支持库、Web支持库、图像处理支持库、窗口操作支持库、文件支持库、多线程支持库
✅ 图像处理:精易模块图像处理支持库
✅ OCR识别:Tesseract OCR 5.0(开源OCR引擎)
✅ 自动化操作:精易模块窗口操作组件(如模拟鼠标点击、键盘输入、获取窗口句柄等)
✅ 数据库:MySQL 8.0
✅ 服务器操作系统:Windows Server 2016/2019(可选,也可以使用本地MySQL数据库)
✅ 客户端操作系统:Windows 7/10/11
✅ 定时任务调度:精易模块的定时任务组件
✅ 加密解密:AES加密算法
22.2.2 架构模式
采用三层架构+模块化设计:
- 表示层:使用易语言组件库实现用户界面,负责与用户交互
- 业务逻辑层:使用类和子程序实现系统的业务逻辑,协调表示层和数据访问层之间的通信
- 数据访问层:使用MySQL数据库和数据访问接口实现数据的持久化操作
- 模块划分:将系统划分为登录模块、配置管理模块、验证码获取模块、验证码预处理模块、验证码识别模块、自动化操作模块、识别记录管理模块、图表可视化模块、定时任务模块、系统设置模块
22.2.3 核心流程
✅ 自动化验证码识别系统的核心流程:
① 获取验证码图片:使用精易网页访问对象访问验证码地址,获取验证码图片并保存到本地
② 验证码预处理:对验证码图片进行预处理(如灰度化、二值化、降噪、分割等),提高识别准确率
③ OCR识别:调用Tesseract OCR引擎对预处理后的验证码图片进行识别,获取识别结果
④ 输入验证码:使用精易模块的窗口操作组件模拟用户操作,将识别结果输入到验证码输入框
⑤ 点击登录:使用精易模块的窗口操作组件模拟用户操作,点击登录按钮
⑥ 记录识别结果:将验证码图片、识别结果、准确率等信息保存到数据库,以便后续优化
22.3 核心功能开发
22.3.1 系统登录与权限管理
登录模块实现(复用并调整自动化操作场景)
.版本 2 .支持库 spec .支持库 eDB .支持库 eJYM .程序集 程序集1 .程序集变量 g_用户信息, 类_用户信息 .程序集变量 g_权限列表, 集合 .程序集变量 g_登录状态, 逻辑型 .子程序 __启动窗口_创建完毕 ' 初始化组件属性 _启动窗口.标题 = “自动化验证码识别系统登录” _启动窗口.宽度 = 400 _启动窗口.高度 = 300 _启动窗口.左边 = (取屏幕宽度 () - _启动窗口.宽度) ÷ 2 _启动窗口.顶边 = (取屏幕高度 () - _启动窗口.高度) ÷ 2 ' 初始化数据库连接 .如果真 (数据库连接_初始化 () = #假) 信息框 (“数据库连接失败!”, 0, “错误提示”) 结束 () .如果真结束 调试输出 (“系统初始化成功!”) .子程序 数据库连接_初始化, 逻辑型 .局部变量 连接句柄, 整数型 .局部变量 服务器IP, 文本型 .局部变量 服务器端口, 整数型 .局部变量 用户名, 文本型 .局部变量 密码, 文本型 .局部变量 数据库名, 文本型 ' 从配置文件中读取数据库配置 服务器IP = 配置文件_取文本 (“Database”, “Host”, “127.0.0.1”) 服务器端口 = 到数值 (配置文件_取文本 (“Database”, “Port”, “3306”)) 用户名 = 配置文件_取文本 (“Database”, “User”, “root”) 密码 = 文本_解密 (配置文件_取文本 (“Database”, “Password”, “”), “captcha_recognition_system_2023”) ' 使用AES算法解密密码 数据库名 = 配置文件_取文本 (“Database”, “Name”, “captcha_recognition_system”) ' 连接MySQL数据库 连接句柄 = MySQL.连接 (服务器IP, 服务器端口, 用户名, 密码, 数据库名) .如果真 (连接句柄 ≤ 0) 调试输出 (“数据库连接失败!错误信息:”, MySQL.取错误信息 ()) 返回 (#假) .如果真结束 调试输出 (“数据库连接成功!连接句柄:”, 连接句柄) 返回 (#真) .子程序 _btnLogin_被单击 .局部变量 用户名, 文本型 .局部变量 密码, 文本型 .局部变量 加密密码, 文本型 .局部变量 记录集, 类_记录集 .局部变量 SQL语句, 文本型 ' 获取输入 用户名 = txtUsername.内容 密码 = txtPassword.内容 .如果真 (用户名 = “” 或 密码 = “”) 信息框 (“请输入用户名和密码!”, 0, “警告提示”) 返回 () .如果真结束 ' 使用MD5算法加密密码 加密密码 = 到文本 (编码_BASE64编码 (加密_MD5 (到字节集 (密码), ), ), ) ' 查询用户信息 SQL语句 = “SELECT * FROM user WHERE username = '” + 文本_替换 (用户名, “'”, “''”) + “' AND password = '” + 文本_替换 (加密密码, “'”, “''”) + “' AND status = 1” 记录集 = MySQL.查询 (SQL语句) .判断开始 (记录集.到记录尾 () = #真) ' 用户名或密码错误 信息框 (“用户名或密码错误!”, 0, “错误提示”) 调试输出 (“用户名或密码错误!用户名:”, 用户名) .判断 (记录集.到记录尾 () = #假) ' 登录成功 g_登录状态 = #真 g_用户信息.用户ID = 记录集.读大整数 (“user_id”) g_用户信息.用户名 = 记录集.读文本 (“username”) g_用户信息.角色ID = 记录集.读大整数 (“role_id”) g_用户信息.真实姓名 = 记录集.读文本 (“real_name”) g_用户信息.电话 = 记录集.读文本 (“phone”) g_用户信息.邮箱 = 记录集.读文本 (“email”) g_用户信息.地址 = 记录集.读文本 (“address”) g_用户信息.状态 = 记录集.读整数 (“status”) ' 获取用户权限列表 获取用户权限列表 () ' 显示主窗口 主窗口.创建 (真) ' 隐藏登录窗口 _启动窗口.隐藏 () 调试输出 (“登录成功!用户名:”, 用户名, “ 角色:”, 角色_取角色名称 (g_用户信息.角色ID)) .判断结束 ' 关闭记录集 记录集.关闭 () .子程序 获取用户权限列表 .局部变量 记录集, 类_记录集 .局部变量 SQL语句, 文本型 ' 查询用户权限列表 SQL语句 = “SELECT p.permission_id, p.permission_name, p.permission_description, p.module FROM user_permission up LEFT JOIN permission p ON up.permission_id = p.permission_id WHERE up.user_id = ” + 到文本 (g_用户信息.用户ID) 记录集 = MySQL.查询 (SQL语句) ' 清空权限列表 g_权限列表.清除 () ' 遍历记录集,添加权限到权限列表 .判断循环首 (记录集.到记录尾 () = #假) 权限信息 = 权限信息 () 权限信息.权限ID = 记录集.读大整数 (“permission_id”) 权限信息.权限名称 = 记录集.读文本 (“permission_name”) 权限信息.权限描述 = 记录集.读文本 (“permission_description”) 权限信息.所属模块 = 记录集.读文本 (“module”) g_权限列表.添加 (权限信息) 记录集.到下一条 () .判断循环尾 () ' 关闭记录集 记录集.关闭 () 调试输出 (“用户权限列表获取成功!权限数量:”, g_权限列表.取数组成员数 ()) .子程序 __启动窗口_将被销毁 ' 断开数据库连接 MySQL.断开 () 调试输出 (“程序结束!”) 22.3.2 配置管理
配置管理模块实现
.版本 2 .支持库 spec .支持库 eDB .支持库 eJYM .支持库 eFile .程序集 程序集1 .程序集变量 g_用户信息, 类_用户信息 .程序集变量 g_配置列表, 集合 .子程序 __启动窗口_创建完毕 ' 初始化组件属性 _启动窗口.标题 = “配置管理” _启动窗口.宽度 = 1000 _启动窗口.高度 = 700 _启动窗口.左边 = (取屏幕宽度 () - _启动窗口.宽度) ÷ 2 _启动窗口.顶边 = (取屏幕高度 () - _启动窗口.高度) ÷ 2 ' 加载配置列表 加载配置列表 () 调试输出 (“配置管理窗口初始化成功!”) .子程序 加载配置列表 .局部变量 记录集, 类_记录集 .局部变量 SQL语句, 文本型 .局部变量 i, 整数型 ' 查询配置列表 SQL语句 = “SELECT * FROM config WHERE user_id = ” + 到文本 (g_用户信息.用户ID) + “ AND status = 1 ORDER BY config_id ASC” 记录集 = MySQL.查询 (SQL语句) ' 清空配置列表框 lstConfig.全部删除 () ' 遍历记录集,显示数据到配置列表框 .判断循环首 (记录集.到记录尾 () = #假) lstConfig.插入表项 (, ) lstConfig.置标题 (i, 0, 到文本 (记录集.读大整数 (“config_id”))) lstConfig.置标题 (i, 1, 记录集.读文本 (“platform_name”)) lstConfig.置标题 (i, 2, 记录集.读文本 (“login_url”)) lstConfig.置标题 (i, 3, 记录集.读文本 (“username”)) lstConfig.置标题 (i, 4, 文本_取中间文本 (文本_解密 (记录集.读文本 (“password”), “captcha_recognition_system_2023”), 1, 3) + “****”) ' 密码加密显示 lstConfig.置标题 (i, 5, 记录集.读文本 (“captcha_url”)) lstConfig.置标题 (i, 6, 文本_替换 (到文本 (记录集.读整数 (“status”)), “0”, “未启用”, “1”, “已启用”)) i = i + 1 记录集.到下一条 () .判断循环尾 () ' 关闭记录集 记录集.关闭 () .子程序 _btnAddConfig_被单击 ' 显示添加配置窗口 添加配置窗口.创建 (真) .子程序 _btnEditConfig_被单击 .局部变量 配置ID, 大整数型 .局部变量 配置信息, 配置信息 ' 获取选中的配置ID .如果真 (lstConfig.现行选中项 = -1) 信息框 (“请选择要修改的配置!”, 0, “警告提示”) 返回 () .如果真结束 配置ID = 到数值 (lstConfig.取标题 (lstConfig.现行选中项, 0)) ' 获取配置信息 配置信息 = 获取配置信息 (配置ID) ' 显示修改配置窗口,并传递配置信息 修改配置窗口.创建 (真, 配置信息) .子程序 _btnDeleteConfig_被单击 .局部变量 配置ID, 大整数型 .局部变量 SQL语句, 文本型 .局部变量 影响行数, 整数型 ' 获取选中的配置ID .如果真 (lstConfig.现行选中项 = -1) 信息框 (“请选择要删除的配置!”, 0, “警告提示”) 返回 () .如果真结束 配置ID = 到数值 (lstConfig.取标题 (lstConfig.现行选中项, 0)) ' 确认删除 .如果真 (信息框 (“确定要删除该配置吗?删除后将无法恢复!”, 4, “确认提示”) = #取消钮) 返回 () .如果真结束 ' 删除配置信息(软删除) SQL语句 = “UPDATE config SET status = 0 WHERE config_id = ” + 到文本 (配置ID) 影响行数 = MySQL.执行SQL (SQL语句) .如果真 (影响行数 > 0) 信息框 (“配置删除成功!”, 0, “成功提示”) ' 刷新配置列表 加载配置列表 () .如果真结束 .子程序 _btnSearchConfig_被单击 .局部变量 搜索关键词, 文本型 .局部变量 记录集, 类_记录集 .局部变量 SQL语句, 文本型 .局部变量 i, 整数型 ' 获取搜索关键词 搜索关键词 = txtSearch.内容 .如果真 (搜索关键词 = “”) ' 搜索关键词为空,加载所有配置 加载配置列表 () 返回 () .如果真结束 ' 查询配置列表 SQL语句 = “SELECT * FROM config WHERE user_id = ” + 到文本 (g_用户信息.用户ID) + “ AND (platform_name LIKE '%” + 文本_替换 (搜索关键词, “'”, “''”) + “%' OR login_url LIKE '%” + 文本_替换 (搜索关键词, “'”, “''”) + “%' OR username LIKE '%” + 文本_替换 (搜索关键词, “'”, “''”) + “%') AND status = 1 ORDER BY config_id ASC” 记录集 = MySQL.查询 (SQL语句) ' 清空配置列表框 lstConfig.全部删除 () ' 遍历记录集,显示数据到配置列表框 .判断循环首 (记录集.到记录尾 () = #假) lstConfig.插入表项 (, ) lstConfig.置标题 (i, 0, 到文本 (记录集.读大整数 (“config_id”))) lstConfig.置标题 (i, 1, 记录集.读文本 (“platform_name”)) lstConfig.置标题 (i, 2, 记录集.读文本 (“login_url”)) lstConfig.置标题 (i, 3, 记录集.读文本 (“username”)) lstConfig.置标题 (i, 4, 文本_取中间文本 (文本_解密 (记录集.读文本 (“password”), “captcha_recognition_system_2023”), 1, 3) + “****”) ' 密码加密显示 lstConfig.置标题 (i, 5, 记录集.读文本 (“captcha_url”)) lstConfig.置标题 (i, 6, 文本_替换 (到文本 (记录集.读整数 (“status”)), “0”, “未启用”, “1”, “已启用”)) i = i + 1 记录集.到下一条 () .判断循环尾 () ' 关闭记录集 记录集.关闭 () .子程序 获取配置信息, 配置信息, 公开 .参数 配置ID, 大整数型 .局部变量 记录集, 类_记录集 .局部变量 SQL语句, 文本型 .局部变量 配置信息, 配置信息 ' 查询配置信息 SQL语句 = “SELECT * FROM config WHERE config_id = ” + 到文本 (配置ID) 记录集 = MySQL.查询 (SQL语句) .判断开始 (记录集.到记录尾 () = #真) 返回 (配置信息) .判断 (记录集.到记录尾 () = #假) 配置信息.配置ID = 记录集.读大整数 (“config_id”) 配置信息.用户ID = 记录集.读大整数 (“user_id”) 配置信息.平台名称 = 记录集.读文本 (“platform_name”) 配置信息.登录地址 = 记录集.读文本 (“login_url”) 配置信息.账号 = 记录集.读文本 (“username”) 配置信息.密码 = 文本_解密 (记录集.读文本 (“password”), “captcha_recognition_system_2023”) ' 使用AES算法解密密码 配置信息.验证码地址 = 记录集.读文本 (“captcha_url”) 配置信息.TesseractOCR路径 = 记录集.读文本 (“tesseract_path”) 配置信息.代理IP = 记录集.读文本 (“proxy_ip”) 配置信息.请求间隔 = 记录集.读整数 (“request_interval”) 配置信息.识别阈值 = 记录集.读大数值 (“recognition_threshold”) 配置信息.状态 = 记录集.读整数 (“status”) .判断结束 ' 关闭记录集 记录集.关闭 () 返回 (配置信息) 22.3.3 验证码获取与预处理
验证码获取与预处理模块实现
.版本 2 .支持库 spec .支持库 eJYM .支持库 eNetwork .支持库 eImage .支持库 eFile .程序集 程序集1 .程序集变量 g_图像操作对象, 类_图像操作 .子程序 __初始化, , , 本子程序在类创建后会被自动调用 ' 初始化图像操作对象 g_图像操作对象.创建 () 调试输出 (“验证码获取与预处理模块初始化成功!”) .子程序 获取验证码图片, 文本型, 公开 .参数 配置信息, 配置信息 .局部变量 网页访问对象, 类_网页访问对象 .局部变量 验证码字节集, 字节集 .局部变量 验证码文件路径, 文本型 .局部变量 临时文件夹路径, 文本型 ' 初始化网页访问对象 网页访问对象.创建 () ' 设置请求头 网页访问对象.置请求头 (“User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36”) 网页访问对象.置请求头 (“Referer”, 配置信息.登录地址) ' 设置代理IP(如果配置了代理IP) .如果真 (配置信息.代理IP ≠ “”) 网页访问对象.置代理服务器 (配置信息.代理IP) .如果真结束 ' 获取验证码字节集 验证码字节集 = 网页访问对象.访问 (“GET”, 配置信息.验证码地址, , , ) ' 检查验证码字节集是否为空 .如果真 (取字节集长度 (验证码字节集) = 0) 调试输出 (“验证码图片获取失败!验证码地址:”, 配置信息.验证码地址) 网页访问对象.销毁 () 返回 (“”) .如果真结束 ' 创建临时文件夹 临时文件夹路径 = 文件_取临时目录 () + “captcha_recognition_system\” .如果真 (文件_是否存在 (临时文件夹路径) = #假) 文件_创建目录 (临时文件夹路径) .如果真结束 ' 生成验证码文件路径 验证码文件路径 = 临时文件夹路径 + 配置信息.平台名称 + “_” + 到文本 (取现行时间 (), , “yyyyMMddHHmmss”) + “.png” ' 保存验证码字节集到文件 字节集_到文件 (验证码字节集, 验证码文件路径) ' 销毁网页访问对象 网页访问对象.销毁 () 调试输出 (“验证码图片获取成功!验证码文件路径:”, 验证码文件路径) 返回 (验证码文件路径) .子程序 验证码预处理, 文本型, 公开 .参数 验证码文件路径, 文本型 .参数 配置信息, 配置信息 .局部变量 预处理后的文件路径, 文本型 .局部变量 图像对象, 类_图像对象 ' 打开验证码图片 图像对象 = g_图像操作对象.打开图像 (验证码文件路径) ' 灰度化 g_图像操作对象.图像灰度化 (图像对象) ' 二值化(使用阈值分割) g_图像操作对象.图像二值化 (图像对象, 128, 255) ' 降噪(去除孤立点) g_图像操作对象.图像降噪 (图像对象, 1) ' 保存预处理后的验证码图片 预处理后的文件路径 = 文本_替换 (验证码文件路径, “.png”, “_processed.png”) g_图像操作对象.保存图像 (图像对象, 预处理后的文件路径, 0) ' 释放图像对象 g_图像操作对象.释放图像 (图像对象) 调试输出 (“验证码预处理成功!预处理后的文件路径:”, 预处理后的文件路径) 返回 (预处理后的文件路径) 22.3.4 OCR识别
OCR识别模块实现(调用Tesseract OCR)
.版本 2 .支持库 spec .支持库 eJYM .支持库 eFile .支持库 eShell .程序集 程序集1 .子程序 验证码识别, 文本型, 公开 .参数 预处理后的文件路径, 文本型 .参数 配置信息, 配置信息 .局部变量 识别结果, 文本型 .局部变量 命令行参数, 文本型 .局部变量 执行结果, 文本型 .局部变量 临时文本文件路径, 文本型 ' 检查Tesseract OCR路径是否正确 .如果真 (文件_是否存在 (配置信息.TesseractOCR路径) = #假) 调试输出 (“Tesseract OCR路径不存在!路径:”, 配置信息.TesseractOCR路径) 返回 (“”) .如果真结束 ' 生成临时文本文件路径 临时文本文件路径 = 文本_替换 (预处理后的文件路径, “_processed.png”, “_result.txt”) ' 构建命令行参数(调用Tesseract OCR识别验证码) 命令行参数 = “”“” + 配置信息.TesseractOCR路径 + “”“” + “ ” + “”“” + 预处理后的文件路径 + “”“” + “ ” + “”“” + 文本_替换 (临时文本文件路径, “.txt”, “”) + “”“” + “ -l eng -psm 8 digits” ' 执行命令行 执行结果 = 系统_执行命令 (命令行参数, 真, ) ' 读取识别结果 识别结果 = 文件_读文本 (临时文本文件路径, “UTF-8”) ' 去除识别结果中的换行符和空格 识别结果 = 文本_替换 (识别结果, #换行符, “”, #空格符, “”) ' 过滤识别结果(只保留数字和字母) 识别结果 = 正则_替换 (识别结果, “[^a-zA-Z0-9]”, “”) ' 删除临时文本文件 文件_删除 (临时文本文件路径) ' 检查识别结果是否符合预期(长度≥4,只包含数字和字母) .如果真 (取文本长度 (识别结果) < 4 或 正则_匹配 (识别结果, “[^a-zA-Z0-9]”) = #真) 调试输出 (“验证码识别失败!识别结果:”, 识别结果) 返回 (“”) .如果真结束 调试输出 (“验证码识别成功!识别结果:”, 识别结果) 返回 (识别结果) 22.3.5 自动化操作
自动化操作模块实现(使用精易模块窗口操作组件)
.版本 2 .支持库 spec .支持库 eJYM .支持库 eWindow .支持库 eShell .程序集 程序集1 .子程序 自动化登录, 逻辑型, 公开 .参数 配置信息, 配置信息 .参数 验证码识别结果, 文本型 .局部变量 浏览器路径, 文本型 .局部变量 浏览器窗口句柄, 整数型 .局部变量 登录窗口句柄, 整数型 .局部变量 账号输入框句柄, 整数型 .局部变量 密码输入框句柄, 整数型 .局部变量 验证码输入框句柄, 整数型 .局部变量 登录按钮句柄, 整数型 ' 获取浏览器路径(默认使用Chrome浏览器) 浏览器路径 = 配置文件_取文本 (“System”, “BrowserPath”, “C:\Program Files\Google\Chrome\Application\chrome.exe”) ' 检查浏览器路径是否正确 .如果真 (文件_是否存在 (浏览器路径) = #假) 调试输出 (“浏览器路径不存在!路径:”, 浏览器路径) 返回 (#假) .如果真结束 ' 打开浏览器并访问登录地址 系统_执行命令 (“”“” + 浏览器路径 + “”“” + “ ” + “”“” + 配置信息.登录地址 + “”“”, 假, ) ' 等待浏览器加载完成 延迟 (5000) ' 获取浏览器窗口句柄 浏览器窗口句柄 = 窗口_取句柄 (, “Chrome_WidgetWin_1”, “Google Chrome”, ) .如果真 (浏览器窗口句柄 ≤ 0) 调试输出 (“浏览器窗口句柄获取失败!”) 返回 (#假) .如果真结束 ' 获取登录窗口句柄 登录窗口句柄 = 窗口_取句柄 (浏览器窗口句柄, “#document”, , ) .如果真 (登录窗口句柄 ≤ 0) 调试输出 (“登录窗口句柄获取失败!”) 返回 (#假) .如果真结束 ' 获取账号输入框句柄(根据不同平台调整) .判断开始 (配置信息.平台名称 = “淘宝”) 账号输入框句柄 = 窗口_取句柄 (登录窗口句柄, “#input”, “tbUserName”, ) .判断 (配置信息.平台名称 = “京东”) 账号输入框句柄 = 窗口_取句柄 (登录窗口句柄, “#input”, “loginname”, ) .判断 (配置信息.平台名称 = “拼多多”) 账号输入框句柄 = 窗口_取句柄 (登录窗口句柄, “#input”, “username”, ) .判断结束 .如果真 (账号输入框句柄 ≤ 0) 调试输出 (“账号输入框句柄获取失败!平台名称:”, 配置信息.平台名称) 返回 (#假) .如果真结束 ' 输入账号 窗口_发送文本 (账号输入框句柄, 配置信息.账号) ' 获取密码输入框句柄(根据不同平台调整) .判断开始 (配置信息.平台名称 = “淘宝”) 密码输入框句柄 = 窗口_取句柄 (登录窗口句柄, “#input”, “tbPassword”, ) .判断 (配置信息.平台名称 = “京东”) 密码输入框句柄 = 窗口_取句柄 (登录窗口句柄, “#input”, “nloginpwd”, ) .判断 (配置信息.平台名称 = “拼多多”) 密码输入框句柄 = 窗口_取句柄 (登录窗口句柄, “#input”, “password”, ) .判断结束 .如果真 (密码输入框句柄 ≤ 0) 调试输出 (“密码输入框句柄获取失败!平台名称:”, 配置信息.平台名称) 返回 (#假) .如果真结束 ' 输入密码 窗口_发送文本 (密码输入框句柄, 配置信息.密码) ' 获取验证码输入框句柄(根据不同平台调整) .判断开始 (配置信息.平台名称 = “淘宝”) 验证码输入框句柄 = 窗口_取句柄 (登录窗口句柄, “#input”, “verifyCode”, ) .判断 (配置信息.平台名称 = “京东”) 验证码输入框句柄 = 窗口_取句柄 (登录窗口句柄, “#input”, “verifycode”, ) .判断 (配置信息.平台名称 = “拼多多”) 验证码输入框句柄 = 窗口_取句柄 (登录窗口句柄, “#input”, “captcha”, ) .判断结束 .如果真 (验证码输入框句柄 ≤ 0) 调试输出 (“验证码输入框句柄获取失败!平台名称:”, 配置信息.平台名称) 返回 (#假) .如果真结束 ' 输入验证码 窗口_发送文本 (验证码输入框句柄, 验证码识别结果) ' 获取登录按钮句柄(根据不同平台调整) .判断开始 (配置信息.平台名称 = “淘宝”) 登录按钮句柄 = 窗口_取句柄 (登录窗口句柄, “#button”, “J_SubmitStatic”, ) .判断 (配置信息.平台名称 = “京东”) 登录按钮句柄 = 窗口_取句柄 (登录窗口句柄, “#button”, “loginsubmit”, ) .判断 (配置信息.平台名称 = “拼多多”) 登录按钮句柄 = 窗口_取句柄 (登录窗口句柄, “#button”, “submit”, ) .判断结束 .如果真 (登录按钮句柄 ≤ 0) 调试输出 (“登录按钮句柄获取失败!平台名称:”, 配置信息.平台名称) 返回 (#假) .如果真结束 ' 点击登录按钮 窗口_发送消息 (登录按钮句柄, #BM_CLICK, 0, 0) ' 等待登录完成 延迟 (5000) ' 检查登录是否成功(根据不同平台调整) .判断开始 (配置信息.平台名称 = “淘宝”) ' 检查是否跳转到淘宝首页 .如果真 (窗口_是否存在 (, “Chrome_WidgetWin_1”, “淘宝网 - 淘!我喜欢”, ) = #真) 调试输出 (“淘宝登录成功!”) 返回 (#真) .如果真结束 .判断 (配置信息.平台名称 = “京东”) ' 检查是否跳转到京东首页 .如果真 (窗口_是否存在 (, “Chrome_WidgetWin_1”, “京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!”, ) = #真) 调试输出 (“京东登录成功!”) 返回 (#真) .如果真结束 .判断 (配置信息.平台名称 = “拼多多”) ' 检查是否跳转到拼多多首页 .如果真 (窗口_是否存在 (, “Chrome_WidgetWin_1”, “拼多多 - 新电商开创者”, ) = #真) 调试输出 (“拼多多登录成功!”) 返回 (#真) .如果真结束 .判断结束 ' 登录失败 调试输出 (“登录失败!平台名称:”, 配置信息.平台名称) 返回 (#假) 22.4 系统测试与优化
22.4.1 功能测试
系统登录与权限管理测试
✅ 测试方法:
① 使用正确的用户名和密码登录系统
② 使用错误的用户名或密码登录系统
③ 使用已禁用的用户登录系统
④ 不同角色的用户登录系统,检查权限是否正确
✅ 预期结果:
① 登录成功,显示主窗口
② 登录失败,显示“用户名或密码错误!”的警告提示
③ 登录失败,显示“用户已被禁用!”的警告提示
④ 不同角色的用户登录系统,显示对应的主窗口和功能菜单
配置管理测试
✅ 测试方法:
① 添加一个新配置
② 修改配置信息
③ 删除配置
④ 搜索配置
✅ 预期结果:
① 配置添加成功,刷新配置列表后可以看到该配置
② 配置信息修改成功,刷新配置列表后可以看到修改后的信息
③ 配置删除成功,刷新配置列表后看不到该配置
④ 搜索功能正常,根据搜索关键词显示对应的配置
验证码识别测试
✅ 测试方法:
① 配置好电商平台的账号密码、验证码地址、登录地址、Tesseract OCR路径等
② 启动自动化操作
③ 观察验证码识别和登录过程是否正常
④ 检查识别记录是否正确保存到数据库
✅ 预期结果:
① 配置参数正确
② 自动化操作启动成功,验证码识别和登录过程正常
③ 识别记录正确保存到数据库,字段完整,值正确
④ 验证码识别的准确率≥85%,识别时间≤1秒/个
22.4.2 性能优化
✅ 图像处理优化:
- 调整二值化阈值,提高验证码的对比度
- 优化降噪算法,去除更多的噪声点
- 使用形态学操作(如膨胀、腐蚀),增强字符的边缘
- 对验证码图片进行分割,将每个字符单独识别
✅ OCR识别优化:
- 训练Tesseract OCR引擎,提高对验证码字符的识别准确率
- 调整OCR识别参数(如字符集、页面分割模式)
- 使用字符模板匹配,提高识别准确率
✅ 自动化操作优化:
- 优化窗口句柄的获取方法,提高获取速度
- 调整等待时间,避免等待过长或过短
- 使用异步通信方式,提高自动化操作的响应速度
✅ 网络请求优化:
- 设置请求间隔,避免被网站封禁
- 使用代理IP,避免IP被封禁
- 压缩网络传输数据,减少网络带宽的使用
22.4.3 安全防护
✅ 防破解:
- 使用加密算法加密关键代码和数据
- 使用混淆工具混淆代码
✅ 防调试:
- 检测程序是否处于调试状态
- 使用反调试技术
✅ 防注入:
- 过滤用户输入的恶意代码
- 使用参数化查询,防止SQL注入
✅ 数据加密:
- 使用AES算法加密数据库密码、账号密码、代理IP
- 使用HTTPS协议,保护网络传输数据的安全性
✅ 权限控制:
- 严格控制不同角色的权限
- 对敏感操作进行日志记录
22.5 系统打包与部署
22.5.1 安装包制作
✅ 操作步骤:
① 打开易语言开发环境,点击“工具→安装包制作工具”
② 选择要打包的程序,设置程序的安装路径、快捷方式等
③ 选择要打包的支持库和资源文件
④ 点击“生成安装包”按钮,生成安装包
22.5.2 部署方法
✅ 本地部署:
① 安装MySQL数据库,创建captcha_recognition_system数据库
② 导入数据库表结构和初始数据
③ 安装Tesseract OCR引擎(下载地址:https://github.com/tesseract-ocr/tesseract/releases)
④ 配置MySQL数据库的用户名和密码
⑤ 安装客户端程序,配置客户端程序的数据库连接信息和Tesseract OCR路径
⑥ 运行客户端程序,使用正确的用户名和密码登录系统
✅ 服务器部署:
① 在服务器上安装MySQL数据库,创建captcha_recognition_system数据库
② 导入数据库表结构和初始数据
③ 在服务器上安装Tesseract OCR引擎
④ 配置MySQL数据库的用户名和密码,允许远程连接
⑤ 安装客户端程序,配置客户端程序的服务器连接信息和Tesseract OCR路径
⑥ 运行客户端程序,使用正确的用户名和密码登录系统
22.6 总结与未来展望
22.6.1 项目总结
✅ 本项目成功实现了一个自动化验证码识别系统,具备以下功能:
- 系统登录与权限管理
- 配置管理
- 验证码获取
- 验证码预处理
- 验证码识别
- 自动化操作
- 识别记录管理
- 图表可视化
- 定时任务
- 系统设置
✅ 项目采用三层架构+模块化设计,提高了代码的可读性、可维护性和可复用性。项目使用精易模块的强大功能,配合MySQL数据库和Tesseract OCR引擎,实现了快速开发和高效运行。
22.6.2 技术亮点
✅ 精易模块的高级使用方法:
- 使用精易模块的网页访问对象获取验证码图片
- 使用精易模块的图像处理支持库进行验证码预处理
- 使用精易模块的窗口操作组件实现自动化操作
- 使用精易模块的图表组件实现数据可视化
- 使用精易模块的定时任务组件实现定期执行自动化操作
✅ Tesseract OCR引擎的调用方法:
- 使用命令行调用Tesseract OCR引擎
- 调整OCR识别参数,提高识别准确率
- 使用字符模板匹配,增强识别能力
✅ 自动化操作的实现方法:
- 使用精易模块的窗口操作组件模拟用户操作
- 优化窗口句柄的获取方法,提高获取速度
- 调整等待时间,避免等待过长或过短
22.6.3 未来改进方向
✅ 功能改进:
- 添加更多的验证码类型支持(如滑动验证码、点选验证码、语音验证码等)
- 添加更多的自动化操作场景支持(如数据采集、订单处理、库存管理等)
- 支持多线程并发处理,提高工作效率
- 支持数据分析功能,统计自动化操作的成功率和识别准确率
✅ 性能改进:
- 优化图像处理算法,提高预处理效率和识别准确率
- 优化OCR识别算法,提高识别准确率和速度
- 使用人工智能技术(如深度学习),识别复杂的验证码
- 使用分布式架构,提高系统的扩展性和并发处理能力
✅ 安全改进:
- 使用更强大的加密算法,保护敏感数据的安全性
- 使用更完善的防破解、防调试、防注入技术
- 使用数字签名,确保程序的完整性和真实性
✅ 智能化改进:
- 结合人工智能技术,实现智能验证码识别
- 结合大数据分析技术,实现用户行为分析和数据预测
- 结合云计算技术,实现远程操作和数据同步
22.7 结语
💡 本项目是一个结合图像处理、OCR识别、自动化操作的深度实战项目,通过学习本项目,你可以掌握精易模块的高级使用方法、三层架构和模块化设计在自动化操作项目中的应用、精易模块图像处理支持库的高级使用方法、Tesseract OCR引擎的调用方法、自动化操作的实现方法、项目的打包与部署方法。
希望通过本项目的学习,你能够从“入门者”成长为“专业自动化操作开发者”,在易语言的学习和开发过程中,不断进步,实现自己的目标。
最后,祝愿大家在易语言的学习和开发过程中,能够取得成功!