滑块验证码 python

import pathlib
import time
from urllib import request
import cv2
import pyautogui
from selenium import webdriver
from selenium.webdriver import ChromeOptions
import random
from aaa import *

# 登陆账号
USERNAME = ''
# 登陆密码
PASSWORD = ''
# 滑块距离屏幕左上角的x, y像素, 需根据自己屏幕大小调整  开始位置
SLIDE_X_POSITION, SLIDE_Y_POSITION = 790, 661


class SlideUtils:
    @staticmethod
    def get_distance(bg_img, tp_img, mark_img):
        '''
        bg: 背景图片
        tp: 缺口图片
        out:输出图片
        '''
        # 读取背景图片和缺口图片
        bg_img = cv2.imread(bg_img)  # 背景图片
        tp_img = cv2.imread(tp_img)  # 缺口图片

        # 识别图片边缘
        bg_edge = cv2.Canny(bg_img, 100, 200)
        tp_edge = cv2.Canny(tp_img, 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)  # 寻找最优匹配
        # 绘制方框
        th, tw = tp_pic.shape[:2]
        tl = max_loc  # 左上角点的坐标
        br = (tl[0] + tw, tl[1] + th)  # 右下角点的坐标
        cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2)  # 绘制矩形
        cv2.imwrite(mark_img, bg_img)  # 保存在本地
        # 返回缺口的X坐标
        distance = tl[0] * 2 / 3
        # print('原来:', tl[0])
        print('真实:', distance)
        return distance

    @staticmethod
    def slide_by_autogui(x, y, offset):
        """
        使用pyautogui实现滑块并自定义轨迹方程
        """
        xx = x + offset
        pyautogui.moveTo(x, y, duration=0.1)
        pyautogui.mouseDown()
        y += random.randint(9, 19)
        pyautogui.moveTo(x + int(offset * random.randint(15, 23) / 20), y, duration=0.28)
        y += random.randint(-9, 0)
        pyautogui.moveTo(x + int(offset * random.randint(17, 21) / 20), y, duration=random.randint(20, 31) / 100)
        y += random.randint(0, 8)
        pyautogui.moveTo(xx, y, duration=0.5)
        pyautogui.mouseUp()


class JdLoginChromeWebdriverPlus:
    """
    京东登录chrome webdriver增强
    """
    def __init__(self, retry_times=10):
        option = ChromeOptions()
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        self.driver = webdriver.Chrome(options=option)
        self.driver.maximize_window()
        self.retry_times = retry_times
        self.login_success = False

    def login(self, username, password):
        driver = self.driver
        driver.get('https://www.xiaohongshu.com/user/profile/556040fb58944669d7a16a1a')
        # 切換账号密码登录
        from selenium.webdriver.common.by import By
        time.sleep(random.randint(1, 3))
        for i in range(self.retry_times):
            # 获取验证码图片
            # 用于找到登录图片的大图
            try:
                background = driver.find_element(By.XPATH,'//*[@id="slider"]/div/div[1]/div[3]/div[2]/img')
            except:
                # 未查找到登陆图片则认为成功
                self.login_success = True
                break
            # 用来找到登录图片的小滑块
            slide = driver.find_element(By.XPATH,'//*[@id="slider"]/div/div[1]/div[3]/div[1]/img')
            background_url = background.get_attribute("src")
            slide_url = slide.get_attribute("src")
            print(background_url,slide_url)
            background_img = './11/background_img.jpg'
            slide_img = './11/slide_img.jpg'
            # 下载背景大图保存到本地
            request.urlretrieve(background_url, background_img)
            # 下载滑块保存到本地
            request.urlretrieve(slide_url, slide_img)
            # 获取最佳x偏移量
            x = SlideUtils.get_distance(background_img,slide_img,"./11/1.jpg")
            SlideUtils.slide_by_autogui(SLIDE_X_POSITION, SLIDE_Y_POSITION, int(x))
    def is_login(self):
        """
        是否已登录成功
        """
        return self.login_success

    def get_cookies(self):
        """
        获取webdriver cookies
        """
        return self.driver.get_cookies()

    def get_cookies_dict(self):
        """
        获取字典结构的cookie
        """
        cookies = self.get_cookies()
        res = {}
        for cookie in cookies:
            res[cookie['name']] = cookie['value']
        return res

    def get_driver(self):
        """
        获取webdriver对象
        """
        return self.driver

    def close(self):
        self.driver.close()

    def quit(self):
        self.driver.quit()


if __name__ == '__main__':
    driver = JdLoginChromeWebdriverPlus()
    driver.login(USERNAME, PASSWORD)
    print(driver.is_login())
    print(driver.get_cookies_dict())
    driver.quit()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与久i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值