使用JavaScript和Puppeteer破解网易易盾滑动验证码

网易易盾验证码是一种常见的滑动拼图验证码。本文将介绍如何使用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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值