本文将介绍如何使用Tcl语言结合Selenium和OpenCV库来实现对极验滑动验证码的自动破解。整个过程包括模拟点击、获取验证码图片、识别缺口位置、计算滑动轨迹以及模拟滑块拖动。
环境准备
首先需要安装Tcl、Python、Selenium和OpenCV库:
bash
# 安装Tcl
sudo apt-get install tcl
# 安装Python依赖
pip install selenium opencv-python
实现步骤
初始化
tcl
package require Tcl 8.6
package require Tclx
package require python
# 引入Python模块
python::interp create py
python::exec {
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
import cv2
import numpy as np
import time
class GeetestCrack:
def __init__(self):
self.url = 'https://www.geetest.com/type/'
self.browser = webdriver.Chrome()
self.wait = WebDriverWait(self.browser, 10)
def open(self):
self.browser.get(self.url)
def close(self):
self.browser.quit()
def change_to_slide(self):
huadong = self.wait.until(
lambda driver: driver.find_element(By.CSS_SELECTOR, '.products-content ul > li:nth-child(2)')
)
return huadong
def get_geetest_button(self):
button = self.wait.until(
lambda driver: driver.find_element(By.CSS_SELECTOR, '.geetest_radar_tip')
)
return button
def wait_pic(self):
self.wait.until(
lambda driver: driver.find_element(By.CSS_SELECTOR, '.geetest_popup_wrap')
)
def get_screenshot(self):
screenshot = self.browser.get_screenshot_as_png()
screenshot = np.frombuffer(screenshot, dtype=np.uint8)
screenshot = cv2.imdecode(screenshot, cv2.IMREAD_COLOR)
return screenshot
def get_position(self):
img = self.wait.until(
lambda driver: driver.find_element(By.CLASS_NAME, 'geetest_canvas_img')
)
time.sleep(2)
location = img.location
size = img.size
top, bottom = location['y'], location['y'] + size['height']
left, right = location['x'], location['x'] + size['width']
return top, bottom, left, right
def get_slider(self):
slider = self.wait.until(
lambda driver: driver.find_element(By.CLASS_NAME, 'geetest_slider_button')
)
return slider
def get_geetest_image(self, name='captcha.png'):
top, bottom, left, right = self.get_position()
screenshot = self.get_screenshot()
captcha = screenshot[top:bottom, left:right]
cv2.imwrite(name, captcha)
return captcha
def delete_style(self):
js = 'document.querySelectorAll("canvas")[2].style=""'
self.browser.execute_script(js)
def is_pixel_equal(self, img1, img2, x, y):
threshold = 60
pix1 = img1[y, x]
pix2 = img2[y, x]
if all(abs(pix1 - pix2) < threshold):
return True
else:
return False
def get_gap(self, img1, img2):
left = 60
for i in range(left, img1.shape[1]):
for j in range(img1.shape[0]):
if not self.is_pixel_equal(img1, img2, i, j):
return i
return left
def get_track(self, distance):
track = []
current = 0
mid = distance * 3 / 5
t = 0.2
v = 0
distance += 14
while current < distance:
if current < mid:
a = 2
else:
a = -1.5
v0 = v
v = v0 + a * t
move = v0 * t + 0.5 * a * t * t
current += move
track.append(round(move))
return track
def shake_mouse(self):
ActionChains(self.browser).move_by_offset(-3, 0).perform()
ActionChains(self.browser).move_by_offset(2, 0).perform()
def move_to_gap(self, slider, tracks):
back_tracks = [-1, -1, -2, -2, -3, -2, -2, -1, -1]
ActionChains(self.browser).click_and_hold(slider).perform()
for x in tracks:
ActionChains(self.browser).move_by_offset(x, 0).perform()
for x in back_tracks:
ActionChains(self.browser).move_by_offset(x, 0).perform()
self.shake_mouse()
time.sleep(0.5)
ActionChains(self.browser).release().perform()
def crack(self):
try:
self.open()
self.change_to_slide().click()
self.get_geetest_button().click()
self.wait_pic()
slider = self.get_slider()
image1 = self.get_geetest_image('captcha1.png')
self.delete_style()
image2 = self.get_geetest_image('captcha2.png')
gap = self.get_gap(image1, image2)
track = self.get_track(gap - 6)
self.move_to_gap(slider, track)更多内容联系1436423940
success = self.wait.until(
lambda driver: driver.find_element(By.CLASS_NAME, 'geetest_success_radar_tip_content').text == '验证成功'
)
print(success)
time.sleep(5)
self.close()
except:
print('Failed-Retry')
self.crack()
}
# 创建破解实例并运行
set geetest [python::call py "GeetestCrack()"]
python::call $geetest "crack()"
运行代码
在终端中运行以下命令来启动破解程序:
bash
tclsh geetest_crack.tcl