python+opencv+selenium自动化登录邮箱并实现滑动验证功能
python+opencv+selenium自动化登录邮箱并实现滑动验证功能
这篇文章主要介绍“python+opencv+selenium自动化登录邮箱并实现滑动验证功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python+opencv+selenium自动化登录邮箱并实现滑动验证功能”文章能帮助大家解决问题。
在我们做自动化登录时,总会遇到各种奇奇怪怪的验证码,滑块验证码就是其中最常见的一种。若我们的程序自动输入账号密码之后,还需要我们人工去滑动验证码那还能称得上是自动化吗?
那么先给大家说一下我的‘解题步骤"。
1.使用selenium打开邮箱首页。
2.定位到账号密码框,键入账号密码。
3.获取验证图片,使用opencv处理返回滑块应拖动的距离。
4.创建鼠标事件,模拟拖动滑块完成验证。
需要解决的问题:
1.页面元素的定位。
2.文本框和验证码的frame嵌套。
3.opencv处理验证图片缺口图像匹配并返回距离。
4.webdriver在网页中使用xpath时如何定位自身元素。
5.原始图片尺寸与在网页中的实际尺寸同比例缩放(距离的缩放)。
源代码:
#滑稽研究所出品fromselenium.webdriver.common.keysimportKeysfromselenium.webdriverimportActionChainsfromseleniumimportwebdriverimportrequestsimporttimeimportcv2#下载图片defdownload_img(url,filename):r=requests.get(url)withopen(filename+".png","wb")asf:#对于图片类型的通过r.content方式访问响应内容,将响应内容写入yanzheng.png中f.write(r.content)print(filename+"下载完成")defget_image():#为什么这里要定义全局变量?因为driver在函数内,函数运行完毕就会关闭,#相应的网页也会被关闭,这就是网上很多问为什么网页会自动关闭的原因。globaldriverdriver=webdriver.Chrome()#获取浏览器对象driver.get("https://mail.qq.com/")#加载百度首页#窗口最大化操作,如果窗口过小,会导致后续拖动滑块时出现视野丢失的问题driver.maximize_window()time.sleep(2)#睡眠两秒driver.find_element_by_xpath("/html/body/div/div[2]/div/div[1]/div/div[1]/div[2]").click()time.sleep(1)driver.switch_to.frame("login_frame")#driver.find_element_by_xpath("//*[@id="switcher_plogin"]").click()#输入账号密码input=driver.find_element_by_xpath("//*[@id="u"]")#定位QQ账号框time.sleep(1)input.send_keys("zhanghao")#搜索框输入内容input=driver.find_element_by_xpath("//*[@id="p"]")#定位QQ密码框input.send_keys("你的密码")#搜索框输入内容print("账号密码输入完成。")#这里停顿一下,不然不会显示滑动验证,应该是检测自动化工具的手段。(反爬)time.sleep(1)driver.find_element_by_xpath("//*[@id="login_button"]").click()#注意我们这里又需要跳到验证码的子框(又一个嵌套)time.sleep(1)driver.switch_to.frame("tcaptcha_iframe")#webdriver的定位方法和浏览器xpath不一样,不能直接定位到标签的属性.#需要首先定位到webelement,之后get到属性!!!!!!!bk=driver.find_element_by_xpath("//*[@id="slideBg"]").get_attribute("src")print(bk)#获取背景和滑块地址,下载到本地。key=driver.find_element_by_xpath("//*[@id="slideBlock"]").get_attribute("src")print(bk)download_img(bk,filename="bk")download_img(key,filename="key")#锁定滑块slider=driver.find_element_by_xpath("//*[@id="tcaptcha_drag_thumb"]")#获取应滑动距离dis=get_distance()print(dis)#滑块部分,没有问题,已完成。newact=ActionChains(driver)newact.click_and_hold(slider).perform()newact.move_by_offset(xoffset=dis-20,yoffset=0).perform()time.sleep(0.5)newact.release().perform()#处理得到滑块应移动的距离。defget_distance():path="bk.png"img=cv2.imread(path)path="key.png"img2=cv2.imread(path)imgContour=img.copy()print("img.shape:",img.shape)imgGray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)imgBlur=cv2.GaussianBlur(imgGray,(3,3),1)imgCanny=cv2.Canny(imgBlur,400,500)imgGray2=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)imgBlur2=cv2.GaussianBlur(imgGray2,(3,3),1)imgCanny2=cv2.Canny(imgBlur2,400,500)cv2.imshow("O",imgCanny)#匹配拼图result=cv2.matchTemplate(imgCanny,imgCanny2,cv2.TM_CCOEFF_NORMED)#归一化cv2.normalize(result,result,0,1,cv2.NORM_MINMAX,-1)min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(result)print("min_loc:",min_loc)print("max_loc:",max_loc)#匹配后结果画圈cv2.rectangle(imgContour,max_loc,(max_loc[0]+135,max_loc[1]+135),(0,0,255),2)#原图为680*390在浏览器resize为280*161,这里我们只用到宽。所以需要进行同比例缩放。res=min_loc[0]/(680/280)cv2.imshow("CannyImage",imgContour)#这里不可以用0,因为图片窗口会一直显示,程序卡住无法return出距离给滑块功能使用。cv2.waitKey(100)print("应滑动距离获取成功。")returnresif__name__=="__main__":get_image()
下面是运行结果,两种不同的验证码背景图都可以正确识别出来。红框为代码识别缺口之后标记的红框
关于“python+opencv+selenium自动化登录邮箱并实现滑动验证功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注恰卡编程网行业资讯频道,小编每天都会为大家更新不同的知识点。
推荐阅读
-
python(中无效的十进制怎么解决 python怎么转换进制)
python怎么转换进制?Python执行二进制转换:1.十进制到二进制(bin)首先,让让我们看看如何将十进制转换成二进制。我...
-
python怎么清除完全相同的行(python splte如何分隔有多个相同符号的str)
pythonsplte如何分隔有多个相同符号的str?str你的string内容str_(相同的符号)执行完了以后再在相同符号的...
-
python(编程控制电脑关机 如何控制电脑关机)
如何控制电脑关机?可以在电脑的运行窗口中输入输入公式,给电脑可以设置自动关机。1.按开快捷键winr然后打开运行窗口。2.在运行窗...
-
python中的特殊标识符(python 中 标识符中可以有逗号吗)
python中标识符中可以有逗号吗?在python语言中合法的标识符是字母、数字以及_,所以我合法的标识符中肯定不能有逗号if...
-
python(excel 提取数据写入新表 python导入excel数据找不到工作簿)
python导入excel数据找不到工作簿?我可以导入数据后找不到工作,不是因为他的工作没有被转移。什么软件可提取并合并Exce...
-
python中字典定义的四种方法(python global关键字的用法详解)
pythonglobal关键字的用法详解?global标志实际上是目的是提示python讲解器,说被其修饰的变量是全局变量。这样...
-
python(array用法 python如何对两个数组做差处理)
python如何对两个数组做差处理?Python中的列表中的元素肯定不能真接相加,减。t最佳的位置的是将列表装换成Python中的...
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...