滑动验证码

mac2022-06-30  104

滑动多长的距离

图片拼接

import reimport timeimport randomimport requestsfrom io import BytesIOfrom PIL import Imagefrom selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Bydriver = 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 imagedef 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_imdef 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 tracksdef 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 Truedef 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 ximage1 = 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

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)