前言
大家做自动化登录时可能都遇到过滑块验证码需要手动验证的问题,这次我们就来解决他
如下: ??在我们做自动化登录时,总会遇到各种奇奇怪怪的验证码,滑块验证码就是其中最常见的一种。若我们的程序自动输入账号密码之后,还需要我们人工去滑动验证码那还能称得上是自动化吗? 那么先给大家说一下我的‘解题步骤’。
1.使用selenium打开邮箱首页。 2.定位到账号密码框,键入账号密码。 3.获取验证图片,使用opencv处理返回滑块应拖动的距离。 4.创建鼠标事件,模拟拖动滑块完成验证。
??需要解决的问题:
1.页面元素的定位。 2.文本框和验证码的frame嵌套。 3.opencv处理验证图片缺口图像匹配并返回距离。 4.webdriver在网页中使用xpath时如何定位自身元素。 5.原始图片尺寸与在网页中的实际尺寸同比例缩放(距离的缩放)。
??OK,思路清晰上代码!!!
??源代码:
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from selenium import webdriver
import requests
import time
import cv2
def download_img(url,filename):
r = requests.get(url)
with open( filename + '.png', 'wb') as f:
f.write(r.content)
print(filename + '下载完成')
def get_image():
global driver
driver= 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')
input=driver.find_element_by_xpath('//*[@id="u"]')
time.sleep(1)
input.send_keys("zhanghao")
input=driver.find_element_by_xpath('//*[@id="p"]')
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')
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()
def get_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)
res = min_loc[0] / (680 / 280)
cv2.imshow("Canny Image", imgContour)
cv2.waitKey(100)
print('应滑动距离获取成功。')
return res
if __name__ == '__main__':
get_image()
??下面是运行结果,两种不同的验证码背景图都可以正确识别出来。红框为代码识别缺口之后标记的红框
??可以看到在跳出验证码之后,我们的程序正确的识别到了缺口的位置,并且正确的返回了缩放后的距离。模拟的鼠标事件完美的把滑块拖动到了缺口的位置。提示我们验证成功,不过我们并没有给代码正确的账号和密码因此会提醒我们账号或密码错误。大家只需填入正确的账号密码即可成功登入。非常的好用~ ??需要注意一个问题,就是要保持网络的稳定,不要有太大波动。长时间加载不出来页面元素,就会出现获取不到页面元素的报错。 ??所有可能遇到的问题,我都在代码注释中写了出来,非常详细。隔壁老大爷看了之后都说好。 ??那么本期文章到这里就结束了,后续有什么问题可以私信我或者在评论区滴滴我嗷~ ??给大家比个心嗷!
??转载自:滑稽研究所 ??阅读更多相关文章,请关注我们吧!
|