以下为我所学,破解滑动验证
''' 破解极验滑动验证 博客园登录url: https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F 1、输入用户名与密码,并点击登录 2、弹出滑动验证,获取有缺口与完整的图片 3、通过像素点进行比对,获取滑动位移距离 4、模拟人的行为轨迹 5、开始滑动 ''' from selenium import webdriver from selenium.webdriver import ActionChains import time from PIL import Image import random def get_distance(image1,image2): start = 60 num = 60 print(image1.size) for x in range (start,image1.size[0]): for y in range(image1.size[1]): rgb1 = image1.load()[x,y] rgb2 = image2.load()[x,y] print(rgb1,rgb2) r = abs(rgb1[0]-rgb2[0]) g = abs(rgb1[1]-rgb2[1]) b = abs(rgb1[2]-rgb2[2]) if not (r<num and g<num and b<num): return x-7 def cut_image(driver): driver.save_screenshot('snap.png') image = driver.find_element_by_class_name('geetest_canvas_img') print(image.location) print(image.size) left = image.location['x'] top = image.location['y'] right = left+image.size['width'] buttom = top+image.size['height'] print(left,top,right,buttom) image_obj = Image.open('snap.png') img = image_obj.crop((left,top,right,buttom)) #img.show() return img def get_image1(driver): time.sleep(2) js_code = ''' var x = document.getElementsByClassName('geetest_canvas_fullbg')[0].style.display= "block"; ''' driver.execute_script(js_code) image = cut_image(driver) return image def get_image2(driver): time.sleep(2) js_code = ''' var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "none"; ''' driver.execute_script(js_code) image = cut_image(driver) return image def get_strck_move(distance): distance += 20 ''' 滑动行为轨迹 加速公式: v = v0 + a * t 路程公式: s = v0 * t + 0.5 * a * (t ** 2) ''' # 初速度 v0 = 0 # 时间 t = 0.2 # 位置 s = 0 # 滑动轨迹列表 向前滑动列表 move_list = [] # 中间值,作为加减速度的位置 mid = distance / 5 * 3 # 加减速度列表 v_list = [1, 2, 3, 4] # 循环位移 while s < distance: if s < mid: # 随机获取一个加速度 a = v_list[random.randint(0, len(v_list) - 1)] else: # 随机获取一个减速度 a = -v_list[random.randint(0, len(v_list) - 1)] ''' 匀加速\减速运行 v = v0 + a * t 位移: s = v * t + 0.5 * a * (t**2) ''' # 获取初始速度 v = v0 # 路程公式: s1 = v * t + 0.5 * a * (t ** 2) s1 = round(s1) # 取整 # 加速公式: # v = v0 + a * t m_v = v + a * t # 把当前加/减速度赋值给初始速度,以便下一次计算 v0 = m_v # 把位移添加到滑动列表中 move_list.append(s1) # 修改滑动初始距离 s += s1 # 后退列表, 自定义后退滑动轨迹,必须是负值 back_list = [-1, -1, -2, -3, -2, -1, -1, -2, -3, -2, -1, -1] return {'move_list': move_list, 'back_list': back_list} def main(): driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get('https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F') user_input = driver.find_element_by_id('LoginName') user_input.send_keys('****) time.sleep(0.2) pwd_input = driver.find_element_by_id('Password') pwd_input.send_keys('******) time.sleep(2) login_submit = driver.find_element_by_id('submitBtn') login_submit.click() image1 = get_image1(driver) # image1 = get_image1(driver) image2 = get_image2(driver) distance = get_distance(image1,image2) print(distance) move_dict = get_strck_move(distance) move_list = move_dict['move_list'] back_list = move_dict['back_list'] move_tag = driver.find_element_by_class_name('geetest_slider_button') ActionChains(driver).click_and_hold(move_tag).perform() for move in move_list: ActionChains(driver).move_by_offset(xoffset=move,yoffset=0).perform() time.sleep(0.1) time.sleep(0.1) for back in back_list: ActionChains(driver).move_by_offset(xoffset=back,yoffset=0).perform() time.sleep(0.1) ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform() ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform() time.sleep(0.1) ActionChains(driver).release().perform() time.sleep(100) if __name__ == '__main__': main()
今天只学习了一上午,但是知道了滑动验证的破解就是先找出一张完整的照片,再与有空缺的照片进行对比,最后通过设置滑动路径模拟人进行滑动从而破解,绝的好神奇。