1。打开前端网,点击登录。
2。填写账号:密码。
3。点解验证按钮,通过滑动验证,最后成功登陆。
github上可以检验。
具体代码如下所示:
run.js
const操纵木偶的人=要求(“操纵”); const设备=要求(“操纵/DeviceDescriptors”); const iPhone=设备(“iPhone 6 +”); 让超时=函数(延迟){ 返回新的承诺((解决,拒绝)=比;{ setTimeout(()=比;{ 尝试{ 解决(1) }捕捉(e) { 反对(0) } },延迟); }) } 让页面=零 让btn_position=零 让时间=0//执行重新滑动的次数 const distanceError=[-10年2、3、5]//距离误差 异步函数运行(){ const浏览器=等待puppeteer.launch ({ 无头:假//这里我设置成假的主要是为了让大家看到效果,设置为真实就不会打开浏览器 }); 页面=等待browser.newPage ();//1 .打开前端网 等待page.emulate (iPhone); 等待page.goto (“https://www.qdfuns.com/?; 等待超时(1000);//2 .打开登录页面 page.click(“[数据类型=登录]”) 等待超时(1000);//3 .输入账号密码 page.type(“输入(数据类型=电子邮件)”,“你的账号”) 等待超时(500); page.type(“输入[占位符=密码)”,“你的密码”) 等待超时(1000);//4 .点击验证 page.click (“.geetest_radar_tip”) 等待超时(1000); btn_position=等待getBtnPosition ();//5 .滑动 拖(空) }/* * *计算按钮需要滑动的距离 * */异步函数calculateDistance () { const距离=等待page.evaluate(()=比;{//比较像素,找到缺口的大概位置 函数比较(文档){ const ctx1=document.querySelector (“.geetest_canvas_fullbg”);//完成图片 const ctx2=document.querySelector (“.geetest_canvas_bg”);//带缺口图片 const pixelDifference=30;//像素差 让res=[];//保存像素差较大的x坐标//对比像素 (让我=57;i<260;我+ +){ (让j=1; j<160; j + +) { const imgData1=ctx1.getContext (2 d) .getImageData (1 * 1 * j, 1, 1) const imgData2=ctx2.getContext (2 d) .getImageData (1 * 1 * j, 1, 1) const data1=imgData1.data; const data2=imgData2.data; const res1=Math.abs (data1 [0] data2 [0]); const它=Math.abs (data1 [1] data2 [1]); const res3=Math.abs (data1 [2] data2 [2]); 如果(!(res1 & lt;pixelDifference,,它& lt;pixelDifference,,res3 & lt;pixelDifference)) { 如果(! res.includes (i)) { res.push(我); } } } }//返回像素差最大值跟最小值,经过调试最小值往左小7像素,最大值往左54像素 返回{分钟:res[0] 7,马克斯:[res.length-1] -54} } 返回比较(文档) }) 返回的距离; }/* * *计算滑块位置 */异步函数getBtnPosition () { const btn_position=等待page.evaluate(()=比;{ const {clientWidth, clientHeight}=document.querySelector (“.geetest_popup_ghost”) 返回{btn_left: clientWidth/2 - 104, btn_top: clientHeight/2 + 59} }) 返回btn_position; }/* * *尝试滑动按钮 * @param距离滑动距离 * */异步函数tryValidation(距离){//将距离拆分成两段,模拟正常人的行为 const distance1=距离- 10 const distance2=10 page.mouse.click (btn_position.btn_left btn_position.btn_top,{延迟:2000}) page.mouse.down (btn_position.btn_left btn_position.btn_top) page.mouse.move (btn_position.btn_left + distance1 btn_position.btn_top,{步骤:30}) 等待超时(800); page.mouse.move (btn_position.btn_left + distance1 + distance2 btn_position.btn_top,{步骤:20}) 等待超时(800); page.mouse.up () 等待超时(4000);//判断是否验证成功 const isSuccess=等待page.evaluate(()=比;{ 返回document.querySelector (.geetest_success_radar_tip_content),,document.querySelector .innerHTML (“.geetest_success_radar_tip_content”) }) 等待超时(1000);//判断是否需要重新计算距离 const reDistance=等待page.evaluate(()=比;{ 返回document.querySelector (.geetest_result_content),,document.querySelector .innerHTML (“.geetest_result_content”) }) 等待超时(1000); 返回{isSuccess: isSuccess==='验证成功”,reDistance: reDistance.includes(“怪物吃了拼图”)} }/* * *拖动滑块 * @param距离滑动距离 * */异步函数阻力(距离){ 距离=距离| |等待calculateDistance (); const结果=等待tryValidation (distance.min) 如果(result.isSuccess) { 等待超时(1000);//登录 console.log(“验证成功”) 页面。点击(# modal-member-login按钮) }else if (result.reDistance) { console.log(“重新计算滑距离录,重新滑动”) *=0 等待拖(空) 其他}{ 如果(distanceError [*]) { * + + console.log(“重新滑动”) 等待拖({分钟:distance.max,马克斯:distance.max + distanceError [*]}) 其他}{ console.log(“滑动失败”) *=0 run () } } } run () package.json { “名称”:“演示”, “版本”:“1.0.0”, “依赖”:{ “操纵”:“^ 1.0.0” } }使用操纵破解极验的滑动验证码