滑动多长的距离
图片拼接
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