selenium实现拼图滑动验证模拟登录QQ空间

  • 案例需导入适配Chrome版本的驱动 下载地址
  • 需设置当前桌面缩放布局为100% (桌面左下角开始-设置-系统-显示-缩放与布局)
    QQ-🙂空间模拟登录
from time import sleep

import requests
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver import ChromeOptions
import cv2
import numpy as np


def login():
    user = ''  # 账号
    pwd = ''  # 密码
    bro.get(url=url)
    sleep(2)
    bro.maximize_window()  # 窗口最大化
    sleep(3)
    bro.switch_to.frame('login_frame')
    pwd_login = bro.find_element_by_id('switcher_plogin')
    pwd_login.click()  # 点击账号密码登录
    sleep(1)
    user_input = bro.find_element_by_id('u')
    user_input.send_keys(user)  # 输入账号

    pwd_input = bro.find_element_by_id('p')
    pwd_input.send_keys(pwd)  # 输入密码
    sleep(2)
    sub_btn = bro.find_element_by_class_name('submit')
    sub_btn.click()  # 点击登录

    y = get_image_position()
    button = bro.find_element_by_id('tcaptcha_drag_thumb')
    ActionChains(bro).click_and_hold(on_element=button).perform()
    ActionChains(bro).move_to_element_with_offset(to_element=button, xoffset=int(y * 0.4 + 18), yoffset=0).perform()
    sleep(1)
    ActionChains(bro).release(on_element=button).perform()
    sleep(3)


def get_image_position():
    sleep(3)
    bro.switch_to.frame(bro.find_element_by_id('tcaptcha_iframe'))
    image1 = bro.find_element_by_id('slideBg').get_attribute('src')  # 下载需要验证图
    image2 = bro.find_element_by_id('slideBlock').get_attribute('src')  # 下载缺口图

    img1 = requests.get(image1, headers=header).content
    with open('slide_bkg.png', 'wb')as f:
        f.write(img1)
    img2 = requests.get(image2, headers=header).content
    with open('slide_block.png', 'wb')as f:
        f.write(img2)

    # 使用python的OpenCV模块识别滑动验证码的缺口
    block = cv2.imread('slide_block.png', 0)
    template = cv2.imread('slide_bkg.png', 0)

    cv2.imwrite('template.jpg', template)
    cv2.imwrite('block.jpg', block)
    block = cv2.imread('block.jpg')
    block = cv2.cvtColor(block, cv2.COLOR_BGR2GRAY)
    block = abs(255 - block)
    cv2.imwrite('block.jpg', block)

    block = cv2.imread('block.jpg')
    template = cv2.imread('template.jpg')

    result = cv2.matchTemplate(block, template, cv2.TM_CCOEFF_NORMED)
    x, y = np.unravel_index(result.argmax(), result.shape)
    #    print x, y
    return y


if __name__ == '__main__':
    # 实现规避检测
    option = ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    # 隐藏window.navigator.webdriver
    option.add_argument("--disable-blink-features=AutomationControlled")
    # 添加user-agent
    option.add_argument(
        'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36')
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    }

    # 实例化一个浏览器对象
    bro = webdriver.Chrome(executable_path='chromedriver.exe', options=option)
    url = 'https://qzone.qq.com/'

    login()

参考文章

posted @ 2021-03-10 21:57  YxinHaaa  阅读(772)  评论(1编辑  收藏  举报