思路:
1、selenum打开网页输入,点击登录弹出滑动验证码
2、截取原始验证码图片和缺口验证码图片
3、对比两张图片,获取缺口位置,计算缺口距离左边长度
4、按算法进行滑动登录
'''
极验验证码
滑动验证
selenum实现
'''
import os
import sys
import time
from io import BytesIO
from selenium.webdriver.common.action_chains import ActionChains
from PIL import Image
from selenium import webdriver
import random
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import mouse
class Slide_Ver:
# start_urls = 'http://gsxt.gdgs.gov.cn/'
start_urls = 'https://www.geetest.com/Register'
pic_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'res')
show_pic = os.path.join(pic_path, 'show_pic.png')
hide_pic = os.path.join(pic_path, 'hide_pic.png')
def driver_chrome_input(self):
'''解析英文验证码'''
# desired_capabilities = DesiredCapabilities.CHROME
# desired_capabilities["pageLoadStrategy"] = "none"
browser = webdriver.Chrome(executable_path='E:\chromedriver_win32\chromedriver.exe')
try:
browser.maximize_window()
except Exception as e:
pass
browser.get(self.start_urls)
browser.find_element_by_xpath("//div[@class='phone input ']/input").send_keys('17792926777')
# position = browser.find_element_by_xpath("//div[@class='sendCode']/div").location
# js = 'document.getElementByclassName("sendCode").click()' # js点击元素
js = 'document.getElementsByClassName("sendCode").click()' # js点击元素
# browser.execute_script(js) # 执行js语句
# time.sleep(10)
mouse.move(1144,808)
time.sleep(10)
mouse.click()
return browser
def save_vail_pic(self, browser):
# 保存两张图片
time.sleep(5)
js = 'var winW = window.screen.width;var winH = window.screen.height;alert(winW+","+winH)'
browser.execute_script(js)
line = browser.switch_to_alert().text
browser.switch_to_alert().accept()
size_big = line.split(',')
print('屏幕尺寸:{}'.format(size_big))
item = browser.find_element_by_xpath("//div[@class='geetest_slicebg geetest_absolute']")
location = item.location
print("图片的位置: ", location)
size = item.size
top, buttom, left, right = location["y"], location["y"] + size["height"], location["x"], location["x"] + size[
"width"]
print("验证码截图坐标: ", left, top, buttom, right)
screen_shot = browser.get_screenshot_as_png()
screen_shot = Image.open(BytesIO(screen_shot))
# captcha1 = screen_shot.crop((int(left+50), int(top+30), int(right+50), int(buttom+30)))
captcha1 = screen_shot.crop((location['x']+160, location['y']+57, location['x']+size['width']+160, location['y']+size['height']+52))
captcha1.save(self.show_pic)
browser.execute_script('document.querySelectorAll("canvas")[2].style=""')
screen_shot = browser.get_screenshot_as_png()
screen_shot = Image.open(BytesIO(screen_shot))
captcha2 = screen_shot.crop((int(left)+160, int(top)+57, int(right)+160, int(buttom)+57))
captcha2.save(self.hide_pic)
return captcha1, captcha2
def screen_pic(self, show_pic, hide_pic, position, size):
# 裁剪内部图片
show_pic_in = os.path.join(self.pic_path, 'show_pic_in.png')
hide_pic_in = os.path.join(self.pic_path, 'hide_pic_in.png')
if os.path.exists(show_pic_in):
os.remove(show_pic_in)
if os.path.exists(hide_pic_in):
os.remove(hide_pic_in)
screen_shot = Image.open(show_pic)
top, buttom, left, right = position.get('y'), position.get('y') + size.get('height'), position.get(
'x'), position.get('x') + size.get('width')
captcha = screen_shot.crop((int(left), int(top), int(right), int(buttom)))
captcha.save(show_pic_in)
screen_shot = Image.open(hide_pic)
captcha = screen_shot.crop((left, top, right, buttom))
captcha.save(hide_pic_in)
return show_pic_in, hide_pic_in
def compare_pixel(self, image1, image2, i, j):
# 判断两个像素是否相同
pixel1 = image1.load()[i, j]
pixel2 = image2.load()[i, j]
threshold = 60
if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(
pixel1[2] - pixel2[2]) < threshold:
return True
return False
def find_left(self, image1, image2):
left = 60
has_find = False
for i in range(60, image1.size[0]):
if has_find:
break
for j in range(image1.size[1]):
if not self.compare_pixel(image1, image2, i, j):
left = i
has_find = True
break
left -= 6
return left
def draw(self,left,browser):
# 拖动图片
# 根据偏移量获取移动轨迹
# 一开始加速,然后减速,生长曲线,且加入点随机变动
# 移动轨迹
track = []
# 当前位移
current = 0
# 减速阈值
mid = left * 3 / 4
# 间隔时间
t = 0.1
v = 0
while current < left:
if current < mid:
a = random.randint(2, 3)
else:
a = - random.randint(6, 7)
v0 = v
# 当前速度
v = v0 + a * t
# 移动距离
move = v0 * t + 1 / 2 * a * t * t
# 当前位移
current += move
track.append(round(move))
slider = browser.find_element_by_css_selector(".geetest_slider_button")
ActionChains(browser).click_and_hold(slider).perform()
for x in track:
ActionChains(browser).move_by_offset(xoffset=x, yoffset=0).perform()
time.sleep(0.5)
ActionChains(browser).release().perform()
time.sleep(5)
def check_login(self,browser):
try:
browser.find_element_by_xpath("//span[contains(text(),'创作中心')]")
return True
except Exception as e:
return False
def get_cookies(self,browser):
Cookies = browser.get_cookies()
print(Cookies)
cookie_dict = {}
for cookie in Cookies:
cookie_dict[cookie['name']] = cookie['value']
browser.close()
return cookie_dict
def run(self):
# 1、selenum打开网页,输入账号密码点击登录
while True:
browser = self.driver_chrome_input()
# 2、保存原始图片和缺口图到本地和验证码的截图进行保存
image1, image2 = self.save_vail_pic(browser)
# # 3、对两张图片逐行进行颜色对比,找出缺口离坐标的距离
left = self.find_left(image1, image2)
print('left:{}'.format(left*1.6))
time.sleep(5)
# # 4、滑动图片
# while self.check_login(browser):
self.draw((left*1.6),browser)
# self.get_cookies(browser)
if __name__ == '__main__':
Slide_Ver().run()