破解验证码的实用技巧:使用 PHP 和 Goutte 实现
在许多网页应用中,图形验证码是常见的安全措施,这给自动化测试带来了挑战。本文将介绍两种有效的方法来处理验证码:获取验证码图片链接和使用 Goutte 截屏和裁剪验证码。
方法一:获取验证码图片地址并下载
我们可以尝试获取验证码的图片链接并下载它。以下是 PHP 代码示例,使用 Goutte 来实现:
php
require 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'http://example.com/login');
$captchaSrc = $crawler->filter('#captchaImage')->attr('src');
$imgUrl = "{$captchaSrc}.png"; // 拼接下载地址
$fileName = "img/login/" . rand(10000, 99999) . ".png"; // 随机文件名
file_put_contents($fileName, file_get_contents($imgUrl));
echo "验证码图片保存成功: {$fileName}\n";
方法二:使用 Goutte 截屏并裁剪验证码
如果获取链接不可靠,我们可以通过截屏获取验证码。Goutte 本身不支持截屏,但可以结合其他工具实现,以下是一个思路示例:
php
require 'vendor/autoload.php';
use Goutte\Client;
use Intervention\Image\ImageManagerStatic as Image;
$client = new Client();
$crawler = $client->request('GET', 'http://example.com/login');
// 截取整个页面
$screenshotPath = 'screenshot.png';
// 使用 Puppeteer 或其他工具截图,保存为 screenshot.png
// 读取截图并定位验证码元素
$captchaElement = $crawler->filter('#captchaImage');
$captchaX = $captchaElement->getNode(0)->getBoundingClientRect()->left;
$captchaY = $captchaElement->getNode(0)->getBoundingClientRect()->top;
$captchaWidth = $captchaElement->getNode(0)->getBoundingClientRect()->width;
$captchaHeight = $captchaElement->getNode(0)->getBoundingClientRect()->height;
// 裁剪验证码
$fullImg = Image::make($screenshotPath);
$captchaImg = $fullImg->crop($captchaWidth, $captchaHeight, $captchaX, $captchaY);
$captchaFileName = "img/login/" . rand(10000, 99999) . "_captcha.png";
$captchaImg->save($captchaFileName);
echo "验证码裁剪并保存成功: {$captchaFileName}\n";
输入验证码并登录
接下来,我们可以使用 Tesseract OCR 库识别验证码内容,并将其输入到登录框中。以下是示例代码:
php
更多内容访问ttocr.com或联系1436423940
require 'vendor/autoload.php';
use Goutte\Client;
use thiagoalessio\TesseractOCR\TesseractOCR;
$client = new Client();
$crawler = $client->request('GET', 'http://example.com/login');
// 输入用户名和密码
$crawler->filter('#username')->first()->setValue('your_username');
$crawler->filter('#password')->first()->setValue('your_password');
// 识别验证码并输入
$captchaFilePath = 'img/login/your_captcha_file.png'; // 替换为实际文件路径
$captchaText = (new TesseractOCR($captchaFilePath))->run();
$crawler->filter('#captchaInput')->first()->setValue(trim($captchaText));
// 提交登录
$client->submit($crawler->filter('#loginButton')->form());
// 检查登录状态
if (strpos($client->getResponse()->getContent(), '欢迎') !== false) {
echo "登录成功!\n";
} else {
echo "登录失败,验证码可能输入错误。\n";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异