爬虫模拟登录破解无原图滑动验证码

您所在的位置:网站首页 点赞云原图 爬虫模拟登录破解无原图滑动验证码

爬虫模拟登录破解无原图滑动验证码

2024-07-12 03:20| 来源: 网络整理| 查看: 265

模拟登录对象:博客园

验证码类型:无原图滑动验证码

使用工具与模块:python,selenium

浏览器:Chrome

大体思路:以前的滑动验证码多为有原图的验证码,可以通过Image模块截取两张不同的图,通过对比像素得出移动的距离,无原图验证码也是基于这个原理,只是多了一步找出原图,该操作可以通过driver.execute_script()添加JS代码,改变display显示获得原图,然后就变成了有原图的滑动验证码的操作流程。

具体思路:

第一步:输入账号、密码,然后点击登陆代码语言:javascript复制 from selenium import webdriver #为了方便演示与查看结果,在此使用有界面的Chrome浏览器,成功之后可以换成无界面浏览器 driver=webdriver.Chrome() #参数为博客园登录页面 driver.get('https://account.cnblogs.com/signin') #隐式等待3秒 driver.implicitly_wait(3) #找到用户名标签和密码标签,用ID查找 input_username=driver.find_element_by_id('LoginName') input_password=driver.find_element_by_id('Password') #输入用户名和密码 input_username.send_keys('11111111111') input_password.send_keys('xxxxxxxxxx') #找到提交按钮 submitBtn=driver.find_element_by_id('submitBtn') #点击提交 submitBtn.click()

效果如图所示:

第二步:弹出有缺口的图,并截取

找到该标签,通过xpath查找找到位置,(通过classname查找,可能会报错,原因未知),这个位置不仅是缺口图的位置,还是原图的位置,所以获取原图和缺口图的方式是一样的

先写一个截图函数:

代码语言:javascript复制from PIL import Image def get_snap(driver): #创建一个空的图片文件 driver.save_screenshot('snap.png') snap_obj=Image.open('snap.png') return snap_obj def get_image(driver): #通过xpath找到元素 img_element = driver.find_element_by_xpath( '//div[@class="geetest_panel_next"]//canvas[@class="geetest_canvas_slice geetest_absolute"]') #获得图片的大小和位置 size = img_element.size location = img_element.location left=location['x'] top=location['y'] right=left+size['width'] bottom=top+size['height'] snap_obj=get_snap(driver) #注意该参数是元组 img_obj=snap_obj.crop((left,top,right,bottom)) return img_obj

通过获得的left,top,right,bottom进行截图

第三步:通过JS代码,显示原图

找到该便签,改变style中的display,其值为block时显示的是无缺口图:

现在通过代码改变该标签的值:

代码语言:javascript复制driver.execute_script("var x=document.getElementsByClassName('geetest_canvas_fullbg geetest_fade geetest_absolute')[0];" "x.style.display='block';" "x.style.opacity=1" )

测试时,有时候,opacity默认为0,需要变为1才会显示原图。

显示原图之后,因为位置是一样的,同第二步,使用同一个函数进行截图。

第四步:对比两张图片,即滑动的位移代码语言:javascript复制none_img=get_image(driver)#缺口图 driver.execute_script("var x=document.getElementsByClassName('geetest_canvas_fullbg geetest_fade geetest_absolute')[0];" "x.style.display='block';" "x.style.opacity=1" ) block_img=get_image(driver)#原图

进行图片滑动的距离的计算:

代码语言:javascript复制def get_distance(img1,img2): start_x=60#初始X threhold=60#阈值 for x in range(start_x,img1.size[0]): for y in range(img1.size[1]): rgb1=img1.load()[x,y] rgb2=img2.load()[x,y] res1=abs(rgb1[0]-rgb2[0]) res2=abs(rgb1[1]-rgb2[1]) res3=abs(rgb1[2]-rgb2[2]) if not (res1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3