保藏本站 保藏本站
188bet注册网主页 - 软件测验 - 常用手册 - 站长东西 - 技能社区
主页 > JavaScript > nodejs > 正文

主页 - PHP - 数据库 - 操作体系 - 游戏开发 - JS - Android - MySql - Redis - MongoDB - Win8 - Shell编程 - DOS指令 - jQuery - CSS款式 - Python - Perl

Access - Oracle - DB2 - SQLServer - MsSql2008 - MsSql2005 - Sqlite - PostgreSQL - node.js - extjs - JavaScript vbs - Powershell - Ruby

运用 Node.js 模仿滑动拼图验证码操作的示例代码

近几年,网页上各种新式验证码层出不穷,其间一种比较常见的是滑动验证码,比方下图这种。

检查图片

本文介绍了一种运用纯前端办法寻觅滑动结尾并模仿滑动的办法。

咱们需求三个依靠库: puppeteer 、 Resemble.js 以及canvas 。其间 puppeteer 用于翻开并操作页面, Resemble.js 及 canvas 用于寻觅滑动验证码的结尾方位。相关依靠如下:

"dependencies": {
 "canvas": "^1.6.7",
 "puppeteer": "^0.12.0",
 "resemblejs": "^2.2.6"
}

接下来是完成关键。首要,引进所需的库,界说一些常量。

const fs = require('fs')
const puppeteer = require('puppeteer')
const resemble = require('resemblejs')
const Canvas = require('canvas')

const URL = 'xxx' // 验证码页面拜访地址
const width = 600
const height = 400
const slider_width = 44

const sleep = duration => {
 return new Promise(resolve => {
 setTimeout(resolve, duration)
 })
}

接下来,运用 puppeteer 翻开验证码页面:

const browser = await puppeteer.launch()
const page = await browser.newPage()
page.setViewport({width, height})

await page.goto(URL, {
 waitUntil: 'networkidle'
})

然后往页面上注入一段 JS ,获取验证码滑块的方位。这一段代码或许需求你依据自己页面的实际情况进行调整。

const offset = await page.evaluate(() => {
 let offset_ifr = $('iframe').offset()

 return {
 top: offset_ifr.top + 222,
 left: offset_ifr.left + 10
 }
})

接下来,模仿按下鼠标左键,再铺开,并别离截图。

await page.mouse.move(offset.left + 10, offset.top + 10)
// 按下鼠标
await page.mouse.down({
 button: 'left'
})
// 等候图片呈现
await sleep(500)
// 截图
await page.screenshot({path: 'screenshot2.png'})

await page.mouse.up({
 button: 'left'
})
// 等候图片呈现
await sleep(500)
// 截图
await page.screenshot({path: 'screenshot3.png'})

此刻能够得到两个图片:

检查图片

以及:

检查图片

能够看到,两个图其余部分都相同,差异在于是否显现验证码滑块以及方针方位。

接下来,就轮到 Resemble.js 进场了,能够运用它取得两个图片的 diff 成果。

await new Promise(resolve => {
 resemble.outputSettings({
 transparency: 0
 })
 resemble('screenshot2.png')
 .compareTo('screenshot3.png')
 .ignoreColors()
 .onComplete(data => {
  fs.writeFileSync('diff.png', data.getBuffer())
  resolve()
 })
})

成果如下:

检查图片

接下来,再运用 canvas 库,将这个 diff 图片读入内存,从右上角开始查找,很简单即可找到最右侧色块的方位,也即滑块结尾的方位。

const getDestinationX = min_x => {
 const canvas = new Canvas(width, height)
 const ctx = canvas.getContext('2d')
 const buf = fs.readFileSync('diff.png')
 const img = new Canvas.Image()
 img.src = buf
 ctx.drawImage(img, 0, 0, width, height)
 const img_data = ctx.getImageData(0, 0, width, height).data

 let destination_x = -1

 for (let y = 0; y < height; y++) {
 for (let x = width; x >= min_x; x--) {
  let p = width * y + x
  p = p << 2
  if (img_data[p + 3] === 255 && img_data[p - 10 * 4 + 3] === 255) {
  destination_x = x
  break
  }
 }
 if (destination_x > -1) break
 }

 return destination_x - slider_width
}

这样,便取得了滑块的开始方位以及结尾方位,再运用 puppeteer 的 page.mouse.move 办法模仿拖动,将滑块拖到结尾方位即可。

检查图片

当然,找到滑块结尾并把滑块拖到正确的结尾方位仅仅第一步,完善的滑动验证码并不会只判别有没有滑到正确的方位,还会剖析你的拖动轨道。要知道,人滑动的轨道和机器滑动的轨道是有很大不同的,至于具体怎样区别便是另一个杂乱的话题了。

最终,本文仅供研讨参阅,不要问我要具体代码。以上便是本文的全部内容,期望对咱们的学习有所协助,也期望咱们多多支撑188bet注册网。

运用nvm办理多个版别的node.js与npm详解
前语Nvm办理不同版别的node与npmnvm是NodeJS的多版别办理东西,有点相似办理Ruby的rvm,如果是需求办理Windows下的node,官方引荐是运用nvmw或nvm-windows。卸载

Node.js完成发送邮件功用
本文实例为咱们共享了Android九宫格图片展现的具体代码,供咱们参阅,具体内容如下varnodemailer=require("nodemailer");varmailTitle='http://handsupowo.pl/:ReleasesHandsU

nodejs中art-template模板语法的引进及抵触处理方案
运用Webstorm创立nodejsexpress运用时,默许运用的是jade或许ejs模板,关于不习惯这两种模板语法的人来说的确不是很便利。不要紧,这儿咱们运用art-template

本周排行

更新排行

强悍的草根IT技能社区,这儿应该有您想要的! 友情链接:b2b电子商务
Copyright © 2010 touzhuwang75.com. All Rights Rreserved  京ICP备05050695号