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()
滑块验证码 python
最新推荐文章于 2024-06-25 14:56:21 发布