1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
| """ @Author: Kang @Version 1.0 @File: Demo.py @CreateTime: 2022/9/26 14:10 @Software: PyCharm @Description: TODO:破解腾讯滑块验证 """
from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver import ActionChains from selenium import webdriver import cv2 import requests import random import time
class TCaptcha: """ 识别腾讯验证码 """
def __init__(self, url): """ 初始化浏览器配置
:param url: 要登录的网站地址 """ self.browser = webdriver.Edge() self.wait = WebDriverWait(self.browser, 20) self.url = url
def tx_code(self): """ 主要部分,函数入口
:return: """
WebDriverWait(self.browser, 20, 0.5).until( expected_conditions.presence_of_element_located((By.ID, 'tcaptcha_iframe'))) self.browser.switch_to.frame( self.browser.find_element(By.ID, 'tcaptcha_iframe')) time.sleep(0.5) bk_block = self.browser.find_element(By.ID, 'slideBg').get_attribute('src') print('正在保存图像……') if self.save_img(bk_block): dex = self.get_pos() if dex: track_list = self.get_track(dex) time.sleep(0.5) slid_ing = self.browser.find_element(By.ID, 'tcaptcha_drag_thumb') ActionChains(self.browser).click_and_hold(on_element=slid_ing).perform() time.sleep(0.2) print('轨迹', track_list) for track in track_list: ActionChains(self.browser).move_by_offset( xoffset=track, yoffset=0).perform() time.sleep(1) ActionChains(self.browser).release( on_element=slid_ing).perform() time.sleep(1) return True else: self.start() else: print('缺口图片捕获失败') return False
@staticmethod def save_img(bk_block): """ 保存图片
:param bk_block: 图片url :return: bool类型,是否被保存 """ try: img = requests.get(bk_block).content with open('bg.jpeg', 'wb') as f: f.write(img) print('保存成功!') return True except: print('保存失败!') return False
@staticmethod def get_pos(): """ 识别缺口,网页上显示的图片为缩放图片,缩放 50% 所以识别坐标需要 0.5
:return: 缺口位置 """ image = cv2.imread('bg.jpeg') blurred = cv2.GaussianBlur(image, (5, 5), 0) canny = cv2.Canny(blurred, 200, 400) contours, hierarchy = cv2.findContours( canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for i, contour in enumerate(contours): m = cv2.moments(contour) if m['m00'] == 0: cx = cy = 0 else: cx, cy = m['m10'] / m['m00'], m['m01'] / m['m00'] if 6000 < cv2.contourArea(contour) < 8000 and 370 < cv2.arcLength(contour, True) < 390: if cx < 400: continue x, y, w, h = cv2.boundingRect(contour) cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2) print('缺口识别: {x}px'.format(x=x / 2)) return x / 2 + 40 return 0
@staticmethod def get_track(distance): """ 轨迹方程
:param distance: 距缺口的距离 :return: 位移列表 """ distance -= 75 v = 0 t = 0.3 tracks = [] current = 0 mid = distance * 4 / 5
distance += 10 while current < distance: if current < mid: a = 3 else: a = -2 v0 = v s = v0 * t + 0.5 * a * (t ** 2) current += s tracks.append(round(s))
v = v0 + a * t
for i in range(4): tracks.append(-random.randint(2, 3)) for i in range(4): tracks.append(-random.randint(1, 3)) return tracks
def move_to(self, index): """ 移动滑块
:param index: :return: """ pass
def start(self): """ 开始,执行打开网页操作
:return: None """ self.browser.get(url=self.url) showCaptcha = self.b.find_element(By.ID, 'CaptchaId') showCaptcha.click() self.tx_code()
def end(self): """ 结束后退出,可选
:return: """ self.browser.quit()
|