1.问题界面分析
验证码网址:https://007.qq.com/online.html 解决方法: 我们用的时selenium自动测试框架,selenium能够模拟人工操作网页界面,只用selenium很显然不太足够,我们还需要用到opencv,opencv是一个图像处理库,安装他的方法网上都有,我们在这里主要是用它来识别缺口图像的位置的,在实际应用中可能还需要用到PIL,因为我发现图片是经过缩放的,所以在实际操作中,我们应该将图片缩放后再去判断缺口位置,其次还需要用到urllib去网页上获取图片保存到本地再去判断。有的滑块一打开并不是在最左边我们也需要判断这个位置,可以直接定位按钮获取style属性在加上此段距离。 代码流程: 基于上面的网址界面,我们第一步是找到弹出验证码的按钮的xapth路径,当然在实际开发中,可能需要先去定位用户输入框与密码输入框,然后定位登录按钮才会触发验证码界面,这里的话我们直接弹出验证码界面即可,然后定位到补全图片以及被补全图片的img src 地址,然后通过urllib请求下载到本地,通过PIL按实际缩放比例缩放,然后通过opencv识别缺口位置,最后判断滑块在缺口位置的左坐标,然后通过selenium模拟鼠标拖动滑块进行验证。
2.应用代码
"""
@author:白杨
@file: 破解验证码登录.py
@time: 2021/10/19
"""
import time
from tenacity import retry, stop_after_attempt
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from PIL import Image
from icecream import ic
import urllib.request
import cv2
import numpy as np
@retry(stop=stop_after_attempt(10))
def Crack():
"""
破解滑动验证码
"""
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)
chrome = webdriver.Chrome(options=option)
chrome.maximize_window()
chrome.get(url='https://007.qq.com/online.html')
chrome.find_element(By.XPATH, '//*[@id="code"]').click()
time.sleep(3)
iframe = chrome.find_element(By.XPATH, '//*[@id="tcaptcha_iframe"]')
chrome.switch_to.frame(iframe)
button = chrome.find_element(By.XPATH, '//*[@id="tcaptcha_drag_thumb"]')
img1 = chrome.find_element(By.XPATH, '//*[@id="slideBg"]').get_attribute('src')
img2 = chrome.find_element(By.XPATH, '//*[@id="slideBlock"]').get_attribute('src')
resp1 = urllib.request.urlopen(img1)
image1 = np.asarray(bytearray(resp1.read()), dtype="uint8")
new_img1 = cv2.imdecode(image1, cv2.IMREAD_COLOR)
resp2 = urllib.request.urlopen(img2)
image2 = np.asarray(bytearray(resp2.read()), dtype="uint8")
new_img2 = cv2.imdecode(image2, cv2.IMREAD_COLOR)
cv2.imwrite('login1.jpg', new_img1)
cv2.imwrite('login2.jpg', new_img2)
im = Image.open('login1.jpg')
im = im.resize((341, 195))
im.save('login1.jpg')
im = Image.open('login2.jpg')
im = im.resize((68, 68))
im.save('login2.jpg')
im1 = cv2.imread("login1.jpg")
im2 = cv2.imread('login2.jpg')
bg_edge = cv2.Canny(im1, 100, 200)
tp_edge = cv2.Canny(im2, 100, 200)
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
x = max_loc[0]
ActionChains(chrome).click_and_hold(on_element=button).perform()
ActionChains(chrome).move_by_offset(xoffset=x - 27, yoffset=0).perform()
time.sleep(2)
ActionChains(chrome).release(on_element=button).perform()
time.sleep(5)
ic("登陆成功")
time.sleep(5)
if __name__ == '__main__':
Crack()
|