精易模块图像处理与OCR实战:构建自动化验证码识别系统
基于精易模块、Tesseract OCR 及 MySQL 数据库构建自动化验证码识别系统。项目采用三层架构与模块化设计,涵盖系统登录权限管理、配置管理、验证码获取预处理、OCR 识别、自动化操作及记录管理等核心功能。通过图像灰度化、二值化等预处理提升识别准确率,结合窗口操作组件模拟浏览器登录流程。系统支持多平台配置、定时任务调度及数据可视化展示,旨在解决手动输入验证码效率低、易出错的问题,实现电商后台操作的自动化与高效化。

基于精易模块、Tesseract OCR 及 MySQL 数据库构建自动化验证码识别系统。项目采用三层架构与模块化设计,涵盖系统登录权限管理、配置管理、验证码获取预处理、OCR 识别、自动化操作及记录管理等核心功能。通过图像灰度化、二值化等预处理提升识别准确率,结合窗口操作组件模拟浏览器登录流程。系统支持多平台配置、定时任务调度及数据可视化展示,旨在解决手动输入验证码效率低、易出错的问题,实现电商后台操作的自动化与高效化。

在网站登录、注册、密码找回等场景中,验证码是防止恶意攻击的重要手段,但手动输入验证码存在效率低、容易出错等问题。易语言配合精易模块的图像处理支持库和 Tesseract OCR 引擎,可以开发出功能完备、稳定可靠的自动化验证码识别系统,将验证码识别时间从手动的 5 秒/个缩短到系统的 0.5 秒/个,大大提高了工作效率。
某电商运营团队每天需要登录多个电商平台的后台进行数据分析和操作,每个平台的登录都需要输入验证码,每天手动输入验证码的次数达到 200+ 次,存在以下问题:
功能需求:
非功能需求:
开发语言:易语言 核心支持库:精易模块(版本:5.1.2)、MySQL 支持库、网络支持库、Web 支持库、图像处理支持库、窗口操作支持库、文件支持库、多线程支持库 图像处理:精易模块图像处理支持库 OCR 识别:Tesseract OCR 5.0(开源 OCR 引擎) 自动化操作:精易模块窗口操作组件(如模拟鼠标点击、键盘输入、获取窗口句柄等) 数据库:MySQL 8.0 服务器操作系统:Windows Server 2016/2019(可选,也可以使用本地 MySQL 数据库) 客户端操作系统:Windows 7/10/11 定时任务调度:精易模块的定时任务组件 加密解密:AES 加密算法
采用三层架构 + 模块化设计:
自动化验证码识别系统的核心流程: ① 获取验证码图片:使用精易网页访问对象访问验证码地址,获取验证码图片并保存到本地 ② 验证码预处理:对验证码图片进行预处理(如灰度化、二值化、降噪、分割等),提高识别准确率 ③ OCR 识别:调用 Tesseract OCR 引擎对预处理后的验证码图片进行识别,获取识别结果 ④ 输入验证码:使用精易模块的窗口操作组件模拟用户操作,将识别结果输入到验证码输入框 ⑤ 点击登录:使用精易模块的窗口操作组件模拟用户操作,点击登录按钮 ⑥ 记录识别结果:将验证码图片、识别结果、准确率等信息保存到数据库,以便后续优化
.版本 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.断开 ()
调试输出 ('程序结束!')
.版本 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')
.判断结束
' 关闭记录集
记录集。关闭 ()
返回 (配置信息)
.版本 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_图像操作对象。释放图像 (图像对象)
调试输出 ('验证码预处理成功!预处理后的文件路径:', 预处理后的文件路径)
返回 (预处理后的文件路径)
.版本 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]') = #真)
调试输出 ('验证码识别失败!识别结果:', 识别结果)
返回 ('')
.如果真结束
调试输出 ('验证码识别成功!识别结果:', 识别结果)
返回 (识别结果)
.版本 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', '拼多多 - 新电商开创者', ) = #真)
调试输出 ('拼多多登录成功!')
返回 (#真)
.如果真结束
.判断结束
' 登录失败
调试输出 ('登录失败!平台名称:', 配置信息。平台名称)
返回 (#假)
测试方法: ① 使用正确的用户名和密码登录系统 ② 使用错误的用户名或密码登录系统 ③ 使用已禁用的用户登录系统 ④ 不同角色的用户登录系统,检查权限是否正确
预期结果: ① 登录成功,显示主窗口 ② 登录失败,显示'用户名或密码错误!'的警告提示 ③ 登录失败,显示'用户已被禁用!'的警告提示 ④ 不同角色的用户登录系统,显示对应的主窗口和功能菜单
测试方法: ① 添加一个新配置 ② 修改配置信息 ③ 删除配置 ④ 搜索配置
预期结果: ① 配置添加成功,刷新配置列表后可以看到该配置 ② 配置信息修改成功,刷新配置列表后可以看到修改后的信息 ③ 配置删除成功,刷新配置列表后看不到该配置 ④ 搜索功能正常,根据搜索关键词显示对应的配置
测试方法: ① 配置好电商平台的账号密码、验证码地址、登录地址、Tesseract OCR 路径等 ② 启动自动化操作 ③ 观察验证码识别和登录过程是否正常 ④ 检查识别记录是否正确保存到数据库
预期结果: ① 配置参数正确 ② 自动化操作启动成功,验证码识别和登录过程正常 ③ 识别记录正确保存到数据库,字段完整,值正确 ④ 验证码识别的准确率≥85%,识别时间≤1 秒/个
图像处理优化:
OCR 识别优化:
自动化操作优化:
网络请求优化:
防破解:
防调试:
防注入:
数据加密:
权限控制:
操作步骤: ① 打开易语言开发环境,点击'工具→安装包制作工具' ② 选择要打包的程序,设置程序的安装路径、快捷方式等 ③ 选择要打包的支持库和资源文件 ④ 点击'生成安装包'按钮,生成安装包
本地部署: ① 安装 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 路径 ⑥ 运行客户端程序,使用正确的用户名和密码登录系统
本项目成功实现了一个自动化验证码识别系统,具备以下功能:
项目采用三层架构 + 模块化设计,提高了代码的可读性、可维护性和可复用性。项目使用精易模块的强大功能,配合 MySQL 数据库和 Tesseract OCR 引擎,实现了快速开发和高效运行。
精易模块的高级使用方法:
Tesseract OCR 引擎的调用方法:
自动化操作的实现方法:
功能改进:
性能改进:
安全改进:
智能化改进:
本项目是一个结合图像处理、OCR 识别、自动化操作的深度实战项目,通过学习本项目,你可以掌握精易模块的高级使用方法、三层架构和模块化设计在自动化操作项目中的应用、精易模块图像处理支持库的高级使用方法、Tesseract OCR 引擎的调用方法、自动化操作的实现方法、项目的打包与部署方法。
希望通过本项目的学习,你能够从'入门者'成长为'专业自动化操作开发者',在易语言的学习和开发过程中,不断进步,实现自己的目标。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online