import time,random
from PIL import Image
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC# 获取图片
from selenium.webdriver.support.wait import WebDriverWait
def get_captcha():
# 隐藏滑块图片
js_hide_slice = 'document.getElementsByClassName("geetest_canvas_slice")[0].style.display="none"'
driver.execute_script(js_hide_slice)
# 截取背景图片
bg_path = './bg.png'
driver.find_element_by_class_name("geetest_canvas_bg").screenshot(bg_path)
# 显示滑块隐藏背景图
js_display_slice = 'document.getElementsByClassName("geetest_canvas_slice")[0].style.display="block"'
js_hide_bg = 'document.getElementsByClassName("geetest_canvas_bg")[0].style.display="none"'
driver.execute_script(js_display_slice + ";"+ js_hide_bg)
# 截取滑块图片
slice_path = './slice.png'
driver.find_element_by_class_name("geetest_canvas_slice").screenshot(slice_path)
# 显示完整图片
js_display_full = 'document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display="block"'
driver.execute_script(js_display_full)
# 截取完整图片
full_path = './full.png'
driver.find_element_by_class_name("geetest_canvas_fullbg").screenshot(full_path)# 还原所有的样式
js_slice = 'document.getElementsByClassName("geetest_canvas_slice")[0].style.display=""'
js_bg = 'document.getElementsByClassName("geetest_canvas_bg")[0].style.display=""'
js_full = 'document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display="none"'
driver.execute_script(js_slice+";"+js_bg+";"+js_full)return bg_path, slice_path, full_path
# 滑块x坐标
def get_slice_x(img_slice):
img = Image.open(img_slice)
w, h = img.size
for x in range(w):
for y in range(h):
rgb = img.getpixel((x, y))
if rgb[0] + rgb[1] + rgb[2] < 570:
print("滑块坐标", x)
return x# 缺口x坐标
def get_bg_x(img_bg, img_full):
bg = Image.open(img_bg)
full = Image.open(img_full)
w,h = bg.size
for x in range(w):
for y in range(h):
bg_point = bg.getpixel((x, y))
full_point = full.getpixel((x, y))
r = bg_point[0] -full_point[0]
g = bg_point[1] - full_point[1]
b = bg_point[2] - full_point[2]
abs_value = abs(r)+abs(g)+abs(b)
if abs_value >180:
print("缺口坐标", x)
return x# 计算距离
def get_distance(img_slice, img_bg, img_full):
slice_x = get_slice_x(img_slice)
bg_x = get_bg_x(img_bg, img_full)
print("距离计算", abs(slice_x-bg_x))
return abs(slice_x-bg_x)
# 模拟人工移动
def get_track(distance):
v = 0 # 初速度
tracks = [] # 运动轨迹current = 0 # 当前的距离
mid = distance * 5/8
distance += 10
while current < distance:
t = random.randint(1, 4)/10
if current < mid:
a = random.randint(1, 3)
else:
a = -random.randint(2,4)
v0 = v
# 位移和时间的关系
s = v0*t + 0.5 * a * t**2
# 当前的位置
current += abs(s)
# 记录位移量
tracks.append(round(s))
v= v0 + a* t
temp=10+(current-distance)
for i in range(4):
num = -random.randint(2,3)
tracks.append(num)
temp +=num
tracks.append(abs(temp)) if temp < 0 else tracks.append(-temp)return tracks
# 移动滑块
def move_slider(tracks):
element = driver.find_element(by=By.CLASS_NAME, value='geetest_slider_button')
ActionChains(driver).click_and_hold(element).perform()
for x in tracks:
ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
ActionChains(driver).release(element).perform()if __name__ == '__main__':
driver = webdriver.Chrome()
url = "https://captcha1.scrape.center/"
driver.get(url)
time.sleep(6)
driver.find_element(by=By.CLASS_NAME, value='el-button').click()
time.sleep(2)
img_bg, img_slice, img_full = get_captcha()
time.sleep(1)
distance = get_distance(img_slice, img_bg, img_full)count = 6
while count > 0:
tracks = get_track(distance)
move_slider(tracks)locator = (By.CLASS_NAME,'geetest_panel_error_title') # 判断是否滑动成功的一个依据
try:
WebDriverWait(driver=driver, timeout=2, poll_frequency=0.2).until(EC.element_to_be_clickable(locator), message="") # 判断提示语是否出现,如果出现就点击下一步重试按钮
driver.find_element_by_class_name('geetest_panel_error_content').click()
time.sleep(2)
# 获取缺口图,滑块图,完整图
img_bg, img_slice, img_full = get_captcha()
# 获取距离
distance = get_distance(img_slice, img_bg, img_full)
print(distance)
time.sleep(1)
count -= 1
continue
except Exception as e:
passlocator = (By.XPATH,'//div[@class="geetest_wrap"]')
try:
WebDriverWait(driver=driver, timeout=2, poll_frequency=0.2).until_not(EC.visibility_of_element_located(locator),
message="") # 判断 如果这个可见然后取反 就是不可见,验证码不可见,就证明已经成功了
print("校验成功了")
time.sleep(3)
break
except TimeoutException as e:
count -= 1
项目滑动模块代码
最新推荐文章于 2022-07-08 09:19:49 发布