识别图形验证码 (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);
}
}
});

posted @ 2024-10-15 13:16  啊飒飒大苏打  阅读(183)  评论(0)    收藏  举报