from selenium import webdriver from selenium.webdriver import ActionChains from PIL import Image import time import random #截取图片 def cut_image(driver): #获取整个页面图片,图片名字为1 driver.save_screenshot(‘1.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) #打开调用open方法打开全屏图片复制给image——oj对象 image_obj=Image.open(‘1.png‘) #通过image_oj对象对小图片进行截取 img=image_obj.crop((left, top, right, buttom)) img.show() return img def get_image2(driver): #修改document文档树,把完整图片的disp属性修改成block time.sleep(2) js_code=‘‘‘ var x=document.getElementsByClassName(‘geetest_canvas_fullbg‘)[0].style.display=‘none‘; ‘‘‘#class driver.execute_script(js_code) #截取图片 image = cut_image(driver) return image def get_image1(driver): #修改document文档树,把完整图片的disp属性修改成block time.sleep(2) js_code=‘‘‘ var x=document.getElementsByClassName(‘geetest_canvas_fullbg‘)[0].style.display=‘block‘; ‘‘‘#查找class属性要用elements driver.execute_script(js_code) #截取图片 image = cut_image(driver) return image #获取滑动距离 def get_distance(image1,image2): #小滑块右侧位置 start=60 #像素差 num=60 #循环所有x轴,看返回值 for x in range(start, image1.size[0]): for y in range(image1.size[1]): #获取image1图片的每一个像素点 rgb1=image1.load()[x, y] # 获取image2缺口图片的每一个像素点 rgb2 = image2.load()[x, y] #abs获取绝对值,像素点比较的值 r = abs(rgb1[0]-rgb2[0]) g = abs(rgb1[1]-rgb2[1]) b = abs(rgb1[2]-rgb2[2]) #如果条件成立则找到缺口 if r<num and g<num and b<num: #有误差7 return x-7 #模拟人的滑动轨迹 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, 1, 2, 1] #循环位移 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 s1=v*t+0.5*a*t*t s1=round(s1) #取整 #把位移添加到滑动列表中 move_list.append(s1) #修改滑动初始距离 s +=s1 m_v = v + a * t #把当前加减速度赋值给初始速度,以便下一次计算 v0=m_v back_list=[-1, -2, -1, -2, -1, -2, -1, -2, -2, -1] return {‘move_list‘:move_list, ‘back_list‘:back_list} def main(): driver = webdriver.Chrome(r‘E:\python\chromedriver_win32\chromedriver.exe‘) driver.get(‘https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F‘) #1、输入用户名与密码,并点击登录 user_input=driver.find_element_by_id(‘LoginName‘) user_input.send_keys(‘amf‘) time.sleep(0.2) pwd_input=driver.find_element_by_id(‘Password‘) pwd_input.send_keys(‘123456li.‘) time.sleep(2) login_submit=driver.find_element_by_id(‘submitBtn‘) login_submit.click() #2、获取完整图片 image1=get_image1(driver) #3、获取有缺口图片 image2=get_image2(driver) #4、比对两种图片,获取滑动距离 distance=get_distance(image1, image2) print(distance) #5、模拟人的滑动轨迹 move_dict=get_strck_move(distance) #获取前进滑动轨迹 move_list=move_dict[‘move_list‘] #获取后退滑动轨迹 back_list=move_dict[‘back_list‘] #6开始滑动 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) 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(10) if __name__ == ‘__main__‘: main()
小结:我觉得这个特别好玩,还是有一点理解上面的问题,不是特别的懂,我觉得tank今天又是帅气的一天
原文:https://www.cnblogs.com/lmff/p/11067328.html