如何使用PHP获取并识别验证码图片中的数字
PHP 实现 ozsub 登录页验证码获取与数字识别方案
你要识别的验证码示例如下:
该验证码为4位纯数字、无复杂干扰线,识别难度低,完整实现方案如下:
一、使用 CURL 绑定会话获取验证码图片
注意:验证码与用户登录会话绑定,必须同一会话下获取的验证码才有效,需要全程复用Cookie
实现代码:
<?php // 临时存储Cookie的文件,确保同一会话 $cookiePath = tempnam(sys_get_temp_dir(), 'ozsub_'); $loginPageUrl = 'http://control.ozsub.com/Account/Login.aspx'; // 验证码接口地址可通过浏览器F12抓包确认,通常为类似下方的地址 $captchaUrl = 'http://control.ozsub.com/Account/ValidateCode.aspx'; // 第一步:请求登录页,初始化会话Cookie $ch = curl_init($loginPageUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiePath); curl_exec($ch); curl_close($ch); // 第二步:请求验证码图片并保存到本地 $ch = curl_init($captchaUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiePath); $imgContent = curl_exec($ch); curl_close($ch); file_put_contents('./captcha.png', $imgContent); ?>
二、验证码数字识别
推荐两种可选方案,根据你的部署环境选择:
方案1:Tesseract OCR 通用识别
适合不想做定制开发的场景,步骤如下:
- 服务器安装 Tesseract OCR 引擎
- 安装PHP依赖包:
composer require thiagoalessio/tesseract_ocr - 实现识别代码:
<?php require 'vendor/autoload.php'; use thiagoalessio\TesseractOCR\TesseractOCR; // 预处理图片,提升识别准确率 $img = imagecreatefrompng('./captcha.png'); // 转灰度 imagefilter($img, IMG_FILTER_GRAYSCALE); // 调整亮度对比度,突出数字 imagefilter($img, IMG_FILTER_BRIGHTNESS, 30); imagefilter($img, IMG_FILTER_CONTRAST, -40); imagepng($img, './captcha_clean.png'); imagedestroy($img); // 限制只识别数字,输出结果 $code = (new TesseractOCR('./captcha_clean.png')) ->allowDigits() ->run(); $code = trim($code); echo "识别结果:{$code}"; ?>
方案2:模板匹配识别
适合需要100%准确率的场景,该验证码字体固定,实现步骤:
- 提前收集0-9所有数字的截图,作为匹配模板
- 将获取到的验证码按固定位置切割为4个单字图片
- 每个单字和10个模板做像素相似度对比,匹配度最高的即为对应数字
- 该方案无需额外安装扩展,识别速度快,准确率可达100%
三、后续操作说明
- 提交登录请求时必须复用之前生成的Cookie文件,否则识别后的验证码无法通过校验
- 如果识别准确率不足,可调整图片预处理的亮度、对比度参数,或者裁剪掉验证码图片的多余边框
- 请勿将该方案用于非法用途,遵守目标站点的用户协议
内容的提问来源于stack exchange,提问作者Aria Nuck
相关产品推荐
相关产品推荐

