当前位置:首页 > 科技  > 软件

不掉头发“逆向”旋转验证码

来源: 责编: 时间:2024-07-17 07:43:50 735观看
导读验证码是爬虫程序绕不过的坎,有各种各样的验证码挡在前进的道路上,比如本文将要重点介绍的旋转验证码,网上能找到不少关于这种验证码的逆向方法,整体思路都是一样的,首先需要通过深度学习模型识别出图片的旋转角度,接下来逆

验证码是爬虫程序绕不过的坎,有各种各样的验证码挡在前进的道路上,比如本文将要重点介绍的旋转验证码,网上能找到不少关于这种验证码的逆向方法,整体思路都是一样的,首先需要通过深度学习模型识别出图片的旋转角度,接下来逆向分析加密旋转角度的一系列过程的js代码,根据逆向出的过程构造出对应的参数,模拟验证码验证接口调用实现旋转验证码的识别。bxn28资讯网——每日最新资讯28at.com

不得不说,独自搞定这一切相当耗时、耗力,而且还可能无功而返,怪不得逆向会经常伴随着掉头发的调侃,即使参照网上大佬们的技术文章,真正实践起来才发现每走一步都可能有坑,有可能是平台反爬策略更新导致和原文已不一致,也可能因为内容比较敏感导致关键细节被故意隐藏,还可能是技术实力欠缺等等。总之,这种逆向的方法让很多人倍感无力,也许硬着头皮研究下去最终可以搞定,但肯定需要花费不少的时间,而时间往往是不够用的。bxn28资讯网——每日最新资讯28at.com

这里提出另外一种经过验证可行的解决方案,那就是直接模拟用户鼠标操作去拖动滑块实现旋转验证码识别(其他验证码也可以使用这个思路)。简单分析下下面的旋转码操作就可以发现滑块滑到头,图片就旋转了一圈360°,它们之间是线性关系,可以计算出这个比例关系,一旦确定了图片的旋转角度就可以根据这个比例关系换算出滑块滑动的距离,然后模拟拖动滑块就完成了旋转验证码的验证。bxn28资讯网——每日最新资讯28at.com

bxn28资讯网——每日最新资讯28at.com

这种处理验证码的方式完全不需要去逆向分析前端代码,完全是站在用户的视角在操作,当然它显得不够极客,可能性能也稍差点,但是真的不会掉太多头发,关键是它可以解决问题,不管黑猫白猫,能抓老鼠就是好猫。按照这个思路的话,只需要重点解决下面几个问题:bxn28资讯网——每日最新资讯28at.com

截取图片数据

这一步的目的是提取旋转验证码图片数据,用于接下来使用深度学习模型识别旋转角度。可以通过JavaScript代码创建canvas画布并绘制验证码图像的方式来获取图片数据,如果你使用selenium、playwright这样的自动化框架的话,它们都支持直接执行js代码并获取返回结果。这里需要注意的地方,一是图像元素需要设置允许跨域,否则无法获取到图片数据,而且设置跨域属性会触发重新请求图片,如果设置跨域后立刻绘制图像是获取不到数据的,需要等待响应图片渲染完成。另外一个就是canvas.toDataURL需要指定图片格式为png,因为jpeg是不支持透明背景的,使用jpeg格式会导致旋转角度识别库识别旋转角度完全错误。bxn28资讯网——每日最新资讯28at.com

// img_selector表示验证码图片选择器var imgelm=document.querySelector(img_selector);// 设置允许跨域,否则无法获取图片数据// TIP:设置跨域后会触发重新请求图片,// 立刻获取图片尺寸结果为全0,需要等待一段时间重新获取imgelm.setAttribute("crossOrigin","anonymous");var canvas = document.createElement('canvas');var ctx = canvas.getContext('2d');canvas.width=imgelm.naturalWidth;canvas.height=imgelm.naturalHeight;ctx.drawImage(imgelm, 0, 0);// 注意:jpeg格式不支持透明背景,这里使用png格式var dataURL = canvas.toDataURL('image/png');return dataURL;

识别旋转角度

关于旋转角度识别,可以使用https://github.com/Starry-OvO/rotate-captcha-crack这个模型,这里通过运行server.py开启一个web服务,通过调用接口,传入图片数据会返回识别出的旋转角度。bxn28资讯网——每日最新资讯28at.com

(使用指导参考:https://cloud.tencent.com/developer/article/2418786)bxn28资讯网——每日最新资讯28at.com

不过,由于百度旋转验证码图片已经升级,图片全部使用AI生成,更不易识别,当前的模型识别成功率有点低,不过可以通过增加重试来规避这个问题,如果你对深度学习比较熟悉的话也可以使用它的模型重新训练最新的验证码图片。bxn28资讯网——每日最新资讯28at.com

另外,百度除了会出现旋转验证码之外,有时候也会出现其他类型验证,比如滑块验证码,这种情况就需要同时处理滑块验证码和旋转验证码,思路也是一样的,至于滑块验证码的识别可以使用ddddocr这个库(https://gitee.com/fkgeek/ddddocr),官网文档给出了详细的使用方法。bxn28资讯网——每日最新资讯28at.com

模拟拖动滑块

不管是滑块验证码还是旋转验证码,识别出了图片滑块的距离、旋转角度之后都可以简单地通过线性关系得出拖动滑块的距离,接下来就是模拟滑块拖动指定距离就可以了,下面的js代码实现了模拟拖动滑块的功能。代码中滑动距离仅给出示例,实际运行时请改为换算后的动态值。bxn28资讯网——每日最新资讯28at.com

() => {    // selector:滑块选择器   offsetX: 滑动距离	function slide(selector, offsetX) {	    // 滑块定位		let slider = document.querySelector(selector);		// 计算滑块矩形区域对角坐标		let rect = slider.getBoundingClientRect(),			x0 = rect.x || rect.left,			y0 = rect.y || rect.top,			x1 = x0 + offsetX, 			y1 = y0;		// 模拟鼠标按下动作		let mousedown = document.createEvent('MouseEvents');		mousedown.initMouseEvent('mousedown', true, true, window, 0, x0, y0, x0, y0, false, false, false, false, 0, null);		slider.dispatchEvent(mousedown);  				//模拟鼠标拖动动作,将滑块移动距离简单拆分为4个相同距离的动作		let mousemove = document.createEvent('MouseEvents');		mousemove.initMouseEvent('mousemove', true, true, window, 0, x0+offsetX/4, y1, x0+offsetX/4, y1, false, false, false, false, 0, null);		slider.dispatchEvent(mousemove);		mousemove.initMouseEvent('mousemove', true, true, window, 0, x0+offsetX/2, y1, x0+offsetX/2, y1, false, false, false, false, 0, null);		slider.dispatchEvent(mousemove);		mousemove.initMouseEvent('mousemove', true, true, window, 0, x0+3*offsetX/4, y1, x0+3*offsetX/4, y1, false, false, false, false, 0, null);		slider.dispatchEvent(mousemove);		mousemove.initMouseEvent('mousemove', true, true, window, 0, x0+offsetX, y1, x0+offsetX, y1, false, false, false, false, 0, null);		slider.dispatchEvent(mousemove);			    // 模拟鼠标释放动作		let mouseout = document.createEvent('MouseEvents');		mouseout.initMouseEvent('mouseup', true, true, window, 0, x1, y1, x1, y1, false, false, false, false, 0, null);		slider.dispatchEvent(mouseout);	}	// 执行滑块拖动,以下distance和滑块选择器只是示例,根据实际情况进行调整	var distance = 200;	slide('div.passMod_slide-btn', distance);}

最后,展示一下通过上面的思路使用playwright实现的旋转验证码的识别过程,本次出现了两次验证码,第一次是滑块验证码,通过后又出现了旋转验证码,可以发现旋转验证码识别了3次才成功,就是因为模型对于最新的百度旋转验证码图片角度识别率变差导致的,实现上通过增加重试次数进行规避。经测试,无界面模式也可以正常运行。bxn28资讯网——每日最新资讯28at.com

bxn28资讯网——每日最新资讯28at.com

参考文献:
[1]https://cloud.tencent.com/developer/article/2418786
[2]https://github.com/Starry-OvO/rotate-captcha-crack
[3]https://gitee.com/fkgeek/ddddocr
[4]https://blog.csdn.net/m0_58618019/article/details/132918404bxn28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-101270-0.html不掉头发“逆向”旋转验证码

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 说说MQ延迟队列实现原理?

下一篇: 我们一起聊聊 Nginx 后端长连接

标签:
  • 热门焦点
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
  • 三星折叠屏手机去年销售近1000万台 今年目标定为1500万

    7月29日消息,三星率先发力可折叠手机市场,在全球市场已经取得了非常亮眼的成绩,接下来会进一步巩固和扩大这一优势。三星在推出Galaxy Z Flip5和Galax
  • iQOO 11S评测:行业唯一的200W标准版旗舰

    【Techweb评测】去年底,iQOO推出了“电竞旗舰”iQOO 11系列,作为一款性能强机,该机不仅全球首发2K 144Hz E6全感屏,搭载了第二代骁龙8平台及144Hz电竞
  • 由于成本持续增加,笔记本产品价格预计将明显上涨

    根据知情人士透露,由于材料、物流等成本持续增加,笔记本产品价格预计将在2021年下半年有明显上涨。进入6月下旬以来,全球半导体芯片缺货情况加剧,显卡、处理器
Top