网易易盾验证码是一种常见的滑动拼图验证码。本文将介绍如何使用JavaScript和Puppeteer自动化工具,以及OpenCV库来破解网易易盾滑动验证码。
准备工作
安装必要的工具和库
首先,确保你已经安装了Node.js。接下来,我们需要安装Puppeteer和opencv4nodejs:
bash
npm install puppeteer
npm install opencv4nodejs
验证码页面
验证码页面地址:https://dun.163.com/trial/jigsaw
代码实现
1. 初始化Puppeteer
Puppeteer是一个用于控制无头Chrome或Chromium的Node库。首先,我们需要启动Puppeteer并导航到验证码页面。
javascript
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://dun.163.com/trial/jigsaw');
// 等待验证码加载完成
await page.waitForSelector('.yidun_bg-img');
})();
2. 获取验证码图片
获取验证码图片并保存到本地,以便使用OpenCV进行图像处理。
javascript
const fs = require('fs');
async function getImages(page) {
const bgImageUrl = await page.$eval('.yidun_bg-img', img => img.src);
const puzzleImageUrl = await page.$eval('.yidun_jigsaw', img => img.src);
const downloadImage = async (url, path) => {
const viewSource = await page.goto(url);
fs.writeFileSync(path, await viewSource.buffer());
};
await downloadImage(bgImageUrl, 'bg.png');
await downloadImage(puzzleImageUrl, 'puzzle.png');
}
3. 使用OpenCV匹配图像
使用OpenCV找到拼图缺口的位置。
javascript
const cv = require('opencv4nodejs');
function getSlideDistance() {
const bgImage = cv.imread('bg.png');
const puzzleImage = cv.imread('puzzle.png');
// 转换为灰度图像
const grayBg = bgImage.cvtColor(cv.COLOR_BGR2GRAY);
const grayPuzzle = puzzleImage.cvtColor(cv.COLOR_BGR2GRAY);
// 二值化
const binaryBg = grayBg.threshold(127, 255, cv.THRESH_BINARY);
const binaryPuzzle = grayPuzzle.threshold(127, 255, cv.THRESH_BINARY);
// 模板匹配
const matched = binaryBg.matchTemplate(binaryPuzzle, cv.TM_CCOEFF_NORMED);
const minMax = matched.minMaxLoc();
return minMax.maxLoc.x;
}
4. 模拟滑动行为
模拟人类滑动行为,以避免被检测为机器人。
javascript
async function slidePuzzle(page, distance) {
const slider = await page.$('.yidun_slider');
const sliderBox = await slider.boundingBox();
await page.mouse.move(sliderBox.x + sliderBox.width / 2, sliderBox.y + sliderBox.height / 2);
await page.mouse.down();
let moveDistance = 0;
while (moveDistance < distance) {
const moveStep = Math.random() * 5 + 5;
await page.mouse.move(sliderBox.x + sliderBox.width / 2 + moveDistance + moveStep, sliderBox.y + sliderBox.height / 2, { steps: 10 });
moveDistance += moveStep;
await page.waitForTimeout(Math.random() * 50 + 50);
}
await page.mouse.up();
}
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://dun.163.com/trial/jigsaw');
await page.waitForSelector('.yidun_bg-img');
await getImages(page);
const distance = getSlideDistance();
await slidePuzzle(page, distance);
await browser.close();
})();
更多内容联系q1436423940