识别图形验证码 (Node.js 示例)
安装所需库
我们需要安装以下库:puppeteer 用于浏览器自动化,tesseract.js 用于 OCR 识别,jimp 用于图像处理,retry 用于操作重试。可以使用 npm 进行安装:
bash
npm install puppeteer tesseract.js jimp retry
保存验证码
在浏览器中打开目标网站,并使用 Puppeteer 保存验证码图片,代码如下所示:
javascript
const puppeteer = require('puppeteer');
const fs = require('fs');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://captcha7.scrape.center/');
const captchaElement = await page.$('#captcha');
const captchaScreenshot = await captchaElement.screenshot();
fs.writeFileSync('captcha.png', captchaScreenshot);
await browser.close();
})();
这样我们可以将验证码图片保存为 captcha.png。
验证码识别测试
接下来使用 tesseract.js 对保存的验证码进行识别,代码如下:
javascript
const Tesseract = require('tesseract.js');
const Jimp = require('jimp');
Jimp.read('captcha.png')
.then(image => {
// 对图像进行处理,例如灰度化或二值化
image
.greyscale()
.contrast(0.5)
.write('captcha_processed.png'); // 保存处理后的图片
// OCR 识别
Tesseract.recognize('captcha_processed.png', 'eng')
.then(({ data: { text } }) => {
console.log('识别结果:', text.trim());
})
.catch(err => {
console.error('识别出错:', err);
});
})
.catch(err => {
console.error('读取图片出错:', err);
});
图像预处理
如果验证码存在噪点或干扰,可以使用 Jimp 进行预处理。例如,先将图片转为灰度图像,再进行二值化处理:
javascript
Jimp.read('captcha.png')
.then(image => {
// 将图像转换为灰度图并二值化
image
.greyscale()
.threshold({ max: 150 }) // 二值化阈值设为150
.write('captcha_cleaned.png'); // 保存处理后的图像
});
自动化登录
使用 Puppeteer 实现自动化登录流程,包括输入用户名、密码,截取验证码图片并识别,最后尝试登录:
javascript
const puppeteer = require('puppeteer');
const Tesseract = require('tesseract.js');
const Jimp = require('jimp');
const retry = require('retry');
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://captcha7.scrape.center/');
await page.type('.username input[type="text"]', 'admin');
await page.type('.password input[type="password"]', 'admin');
const captchaElement = await page.$('#captcha');
const captchaScreenshot = await captchaElement.screenshot();
Jimp.read(captchaScreenshot)
.then(image => {
return image
.greyscale()
.contrast(0.5)
.writeAsync('captcha_processed.png');
})
.then(() => {
return Tesseract.recognize('captcha_processed.png', 'eng');
})
.then(({ data: { text } }) => {
const cleanedText = text.trim().replace(/[^A-Za-z0-9]/g, '');
console.log('识别结果:', cleanedText);
return page.type('.captcha input[type="text"]', cleanedText);
})
.then(async () => {
await page.click('.login');
await page.waitForTimeout(5000); // 等待页面响应
const successMessage = await page.$x('//h2[contains(., "登录成功")]');
if (successMessage.length > 0) {
console.log('登录成功');
} else {
console.log('登录失败,重试');
}
})
.finally(async () => {
await browser.close();
});
})();
重试机制
为了应对识别失败的情况,可以使用 retry 模块进行重试,确保识别失败时自动重新尝试登录:
javascript
更多内容联系1436423940
const operation = retry.operation({ retries: 5 });
operation.attempt(async () => {
try {
await login(); // 调用登录函数
operation.stop(); // 成功则停止重试
} catch (err) {
if (operation.retry(err)) {
console.log('重试中...');
} else {
console.error('登录失败:', err);
}
}
});

浙公网安备 33010602011771号