很多小伙伴们意见反馈,在web自动化技术的过程当中,经常会被登陆的验证码给卡死,不知道该如何去根据验证码的认证。今日专门给大伙儿来聊聊验证码问题,一般的情形下碰到验证码我们能都能够找开发设计去帮忙解决,关掉验证码,或者给一个万能的验证码!那么如果开发设计不给予帮助得话,你自己有没有办法来处理这种验证码的问题呢?回答那就是有些,比较常见的验证码一般分为两类,一类是文图验证码,一类是滑动验证码!
有关图文识别的验证码,之前已经出有关的鉴别解决方法,今日也不做过多的讲了,有兴趣的小伙伴可以私信领到配套的视频资料。我们今天关键来聊聊滑动验证码怎样去鉴别破译。
滑动认证破译构思
有关滑动验证码破译的思路大致来讲就是下列2个流程:
1、获得滑块滑动之间的距离
2、仿真模拟拖拽滑块,通过验证。
听上去是非常简单,可是获得滑块滑动之间的距离,大部分小伙伴们没有思路,没法去获得。其实要获得出来也不难,有关这类滑动的验证码,滑块和缺口环境全是各是一张独立图片,我们可以把这二张图片,下载下来凭借图像识别技术的专业技术,去鉴别缺口在背景中的位置,随后减掉滑块当前所在位置,就能得到必须滑动之间的距离。这时候很多小伙伴会想图像识别算法我不会啊,不容易没关系,后面会给到大家一个封装形式好一点的滑块鉴别控制模块,如果你传到滑块和缺口背景的元素连接点就可计算出滑块的缺口部位。
实例解读
啥也不说了,我们首先看来一个实例(QQ空间登陆),这里用到了一个自己封装形式的滑动间距识别的控制模块slideVerfication,如果有需要的小伙伴可以私信获得。qq空间登录实例完成流程如下所示:
1、建立一个driver目标,浏览qq登录网页页面
2、键入账户密码
3、点击登录
4、仿真模拟滑动认证
完成编码
\"\"\"============================Author:柠檬班-木森Time:2020/4/20 20:12E-mail:3247119728@qq.comCompany:湖南省零檬信息技术有限公司============================\"\"\"import timefrom selenium import webdriverfrom slideVerfication import SlideVerificationCode# 1、建立一个driver目标,浏览qq登录网页页面browser = webdriver.Chrome()browser.get(\"https://qzone.qq.com/\")# 2、键入账户密码# 2.0 点击切换到登陆的iframebrowser.switch_to.frame(\'login_frame\')# 2.1 点一下账号密码登录browser.find_element_by_id(\'switcher_plogin\').click()# 2.2精准定位账户文本框,键入账户browser.find_element_by_id(\"u\").send_keys(\"123292678\")# 2.3精准定位输入密码输入支付密码browser.find_element_by_id(\"p\").send_keys(\"PYTHON01\")# 3、点击登录browser.find_element_by_id(\'login_button\').click()time.sleep(3)# 4、仿真模拟滑动认证# 4.1切换到滑动验证码的iframe中tcaptcha = browser.find_element_by_id(\"tcaptcha_iframe\")browser.switch_to.frame(tcaptcha)# 4.2 获得滑动有关的元素# 挑选拖拽滑块的连接点slide_element = browser.find_element_by_id(\'tcaptcha_drag_thumb\')# 获得滑块图片的连接点slideBlock_ele = browser.find_element_by_id(\'slideBlock\')# 获得缺口环境图片连接点slideBg = browser.find_element_by_id(\'slideBg\')# 4.3测算滑动间距sc = SlideVerificationCode(save_image=True)distance = sc.get_element_slide_distance(slideBlock_ele,slideBg)# 滑动间距偏差校准,滑动间距*图片在网页上显示的放缩比-滑块相对的原始部位distance = distance*(280/680) - 22print(\"校准后滑动间距\",distance)# 4.4、开展滑动sc.slide_verification(browser,slide_element,distance=100)
运作实际效果:
有关滑动验证码的识别问题就是这样克服了,那么接下来来给大家来讲讲封装形式的slideVerfication这一模块的鉴别基本原理,其实关于这一控制模块图像识别技术,都是利用了第三方的数字图像处理控制模块去进行识别的,python中有许多现成的用于解决图片的库,这里我应用了opencv-python去进行识别的。slideVerfication模块上边用到的2个方法的一部分参照编码如下所示:
def get_element_slide_distance(self, slider_ele, background_ele, correct=0): \"\"\" 依据传到滑块,和背景的连接点,测算滑块之间的距离 此方法只有测算 滑块和背景全是一张详细图片的画面, 假如背景是由好几张小图片拼凑下去的背景图, 此方法不适合,请使用get_image_slide_distance这招 :param slider_ele: 滑块图片的连接点 :type slider_ele: WebElement :param background_ele: 背景的连接点 :type background_ele:WebElement :param correct:滑块缺口截屏的修正值,默认为0,调节截屏对不对的情形下才能用 :type: int :return: 背景缺口位置的X轴坐标位置(缺口图片左界限部位) \"\"\" # 获得验证码的图片 slider_url = slider_ele.get_attribute(\"src\") background_url = background_ele.get_attribute(\"src\") # 免费下载验证码背景,滑动图片 slider = \"slider.jpg\" background = \"background.jpg\" self.onload_save_img(slider_url, slider) self.onload_save_img(background_url, background) # 载入开展饱和度图片,转换为numpy里的数组类型数据信息, slider_pic = cv2.imread(slider, 0) background_pic = cv2.imread(background, 0) # 获得缺口图二维数组的形态 -->缺口图的宽和高 width, height = slider_pic.shape[::-1] # 将解决以后的图片另存 slider01 = \"slider01.jpg\" background_01 = \"background01.jpg\" cv2.imwrite(background_01, background_pic) cv2.imwrite(slider01, slider_pic) # 载入另存的滑块图 slider_pic = cv2.imread(slider01) # 开展色彩转换 slider_pic = cv2.cvtColor(slider_pic, cv2.COLOR_BGR2GRAY) # 获得偏色的平方根 slider_pic = abs(255 - slider_pic) # 储存图片 cv2.imwrite(slider01, slider_pic) # 载入滑块 slider_pic = cv2.imread(slider01) # 载入背景 background_pic = cv2.imread(background_01) # 较为两张图的重复地区 result = cv2.matchTemplate(slider_pic, background_pic, cv2.TM_CCOEFF_NORMED) # 获得图片的缺口部位 top, left = np.unravel_index(result.argmax(), result.shape) # 背景里的图片缺口坐标位置 print(\"现阶段滑块的缺口部位:\", (left, top, left width, top height)) return left
def slide_verification(self, driver, slide_element, distance): \"\"\" 滑动滑块开展认证 :param driver: driver目标 :type driver:webdriver.Chrome :param slide_element: 滑块的元组 :type slider_ele: WebElement :param distance: 滑动之间的距离 :type: int :return: \"\"\" # 获得滑动前网站的url地址 start_url = driver.current_url print(\"必须滑动之间的距离为:\", distance) # 依据滑动间距形成滑动运动轨迹 locus = self.get_slide_locus(distance) print(\"生成的滑动运动轨迹为:{},运动轨迹之间的距离总和为{}\".format(locus, distance)) # 按住鼠标键 ActionChains(driver).click_and_hold(slide_element).perform() time.sleep(0.5) # 遍历轨迹开展滚动 for loc in locus: time.sleep(0.01) ActionChains(driver).move_by_offset(loc, random.randint(-5, 5)).perform() ActionChains(driver).context_click(slide_element) # 释放出来电脑鼠标 ActionChains(driver).release(on_element=slide_element).perform()
有关滑动验证码鉴别就给大家分享到这里了,以上解决方案也是有相对应的讲解视频
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。