首页 > 其他 > 详细

滑动验证码

时间:2019-04-07 14:34:58      阅读:110      评论:0      收藏:0      [点我收藏+]

滑动多长的距离

图片拼接

import re
import time
import random
import requests
from io import BytesIO
from PIL import Image
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()

driver.get(‘http://www.cnbaowen.net/api/geetest/‘)

#判断滑块是否加载完成
element = WebDriverWait(driver, 20, 0.5).until(EC.element_to_be_clickable((By.CLASS_NAME,‘get_slider_knob gt_show‘)))

def get_image(driver, div_path):
#匹配图片地址
background_images = driver.find_elements_by_xpath(div_path)
locations = []


for background_images in background_images:
locations = {}
result = background_images.get_attribute(‘style‘)
r = re.findall(r‘background-images:url\("(.*?)"\);background-position:(.*?)px (.*?)px;‘, result)
locations.append({‘x‘:int(r[0][1]),‘y‘:int(r[0][2])})
image_url = r[0][0]

image_response = requests.get(image_url).content

image = BytesIO(image_response)

image = merge_image(image, locations)

return image


def merge_image(image, locations):
"""
根据坐标对图片进行还原
:param image:
:param locations:
:return:
"""
im = Image.open(image)
im_list_upper = []
im_list_down = []

for location in locations:
if location[‘y‘] == -58:
im_list_upper.append(im.crop((abs(location[‘x‘]), 58, abs(location[‘x‘]) + 10, 116)))
if location[‘y‘] == 0:
im_list_down.append(im.crop((abs(location[‘x‘]), 0, abs(location[‘x‘]) + 10, 58)))

new_im = Image.new(‘RGB‘, (260, 116), (255, 255, 255))

x_offset = 0
for i in im_list_upper:
new_im.paste(i, (x_offset, 0))
x_offset += 10

x_offset = 0
for i in im_list_down:
new_im.paste(i, (x_offset, 58))
x_offset += 10

return new_im

def get_track(distance):
"""
模拟正常用户的滑动轨迹
匀加速
:param distance:
:return:
"""
#初速度
v = 0
#单位时间 秒
t = 0.2
#当前移动的x的坐标
current = 0

#位移的轨迹
tracks = []
distance += 10

#阀值
mid = distance * 7/8

while current < distance:
if current < mid:
#加速度
a = random.randint(2, 4)
else:
a = random.randint(3, 5)
v0 = v
#单位时间的位移
s = v0 * t + 0.5*a * (t ** 2)
current += s
v = v0 + a*t
tracks.append(round(s))
for i in range(3):
tracks.append(-random.randint(1, 3))
for i in range(3):
tracks.append(-random.randint(2, 3))

return tracks

def is_sim(image1, image2, x, y):
"""
对比两张图片RGB的值
:param image1:
:param image2:
:param x:
:param y:
:return:
"""
pixel1 = image1.getpixel((x,y))
pixel2 = image2.getpixel((x,y))

for i in range(0, 3):
if abs(pixel1[i] - pixel2[i]) >= 50:
return False
return True

def get_diff_location(image1, image2):
"""
计算缺口的位置 x坐标
:param image1:
:param image2:
:return:
"""
image1.save(‘1,jpg‘)
image2.save(‘2,jpg‘)

for x in range(0,260):
for y in range(0, 116):
if is_sim(image1, image2, x, y ) == False:
return x



image1 = get_image(driver, ‘//div[@class="get_cut_fullbg gt_show"]/div‘) #merge_image(image, locations)

image2 = merge_image(driver, ‘//div[@class="get_cut_fullbg gt_show"]/div‘)

#计算缺口的坐标
loc = get_diff_location(image1, image2)

#计算运动的轨迹
tracks = get_track(loc)


#按住滑块
ActionChains(driver).click_and_hold(on_element=element).perform()

time.sleep(0.5)

#滑动滑块
for track in tracks:
ActionChains(driver).move_by_offset(xoffset=loc, yoffset=0).perform()

time.sleep(0.4)
#释放滑块
ActionChains(driver).release(on_element=element).perform()


time.sleep(10)




滑动验证码

原文:https://www.cnblogs.com/wdty/p/10658834.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!