课堂记录:
Actionchains控制某种动作
Js 获取class属性 Getelements 获取id Getelement
完整图片属性由None隐藏修改为 block显示
Ways:
找缺口:
注意 像素差 (也会有迷惑你的像素差模块)
从60开始循环所有的x轴
像素值差等于或者大于60 则找到缺口地方 像素也有可能是负数 我们需要用abs函数获取绝对值 比较坐标元组的每个像素值
加速度滑动 模拟人的行为:
加减速列表 确保速度不一样 随机获取一个加速度
向前滑动列表
后退列表 回退必须要是的负值
取整函数round() 路程要取整 不然不会滑动
1 '''''' 2 ''' 3 破解极验滑动验证 4 破解极验滑动验证 5 博客园登录url: 6 https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F 7 8 代码逻辑: 9 1、输入用户名与密码,并点击登录 10 2、弹出滑动验证,获取有缺口与完整的图片 11 3、通过像素点进行比对,获取滑动位移距离 12 4、模拟人的行为轨迹 13 5、开始滑动 14 15 ''' 16 from selenium import webdriver # 用来驱动浏览器的 17 from selenium.webdriver import ActionChains # 破解滑动验证码的时候用的 可以拖动图片 18 import time 19 from PIL import Image # pip3 install pillow 20 import random 21 22 23 # 截图图片函数 24 def cut_image(driver): 25 # 获取整个页面图片,图片名字为'snap.png' 26 driver.save_screenshot('snap.png') 27 28 # 获取滑动小画图 29 image = driver.find_element_by_class_name('geetest_canvas_img') 30 print(image.location) 31 print(image.size) 32 33 # 获取小图片的左上右下的位置 34 left = image.location['x'] 35 top = image.location['y'] 36 right = left + image.size['width'] 37 buttom = top + image.size['height'] 38 print(left, top, right, buttom) 39 40 # 调用open方法打开全屏图片并赋值给image_obj对象 41 image_obj = Image.open('snap.png') 42 43 # 通过image_obj对象对小图片进行截取 44 # box: The crop rectangle, as a (left, upper, right, lower)-tuple. 45 img = image_obj.crop((left, top, right, buttom)) 46 # 打开截取后的小图片 47 # img.show() 48 return img 49 50 51 # 获取完整图片 52 def get_image1(driver): 53 time.sleep(2) 54 55 # 修改document文档树,把完整图片的display属性修改为block 56 js_code = ''' 57 var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "block"; 58 ''' 59 60 # 执行js代码 61 driver.execute_script(js_code) 62 63 # 截取图片 64 image = cut_image(driver) 65 66 return image 67 68 69 # 获取有缺口图片 70 def get_image2(driver): 71 time.sleep(2) 72 73 # 修改document文档树,把完整图片的display属性修改为block 74 js_code = ''' 75 var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "none"; 76 ''' 77 78 # 执行js代码 79 driver.execute_script(js_code) 80 81 # 截取图片 82 image = cut_image(driver) 83 84 return image 85 86 87 # 获取滑块滑动距离 88 def get_distance(image1, image2): 89 # 小滑块右侧位置 90 start = 60 91 92 # 像素差 93 num = 60 94 print(image1.size) 95 for x in range(start, image1.size[0]): 96 for y in range(image1.size[1]): 97 98 # 获取image1完整图片每一个坐标的像素点 99 rgb1 = image1.load()[x, y] 100 101 # 获取image2缺口图片每一个坐标的像素点 102 rgb2 = image2.load()[x, y] 103 # (60, 86, 40) (60, 86, 40) rgb 104 print(rgb1, rgb2) 105 106 # abs获取绝对值, 像素点比较的值 107 r = abs(rgb1[0] - rgb2[0]) 108 g = abs(rgb1[1] - rgb2[1]) 109 b = abs(rgb1[2] - rgb2[2]) 110 111 # 如果条件成立,则找到缺口位置 112 if not (r < num and g < num and b < num): 113 # 有误差 - 7像素 114 return x - 7 115 116 117 # 模拟人的滑动轨迹 118 def get_strck_move(distance): 119 distance += 20 120 121 ''' 122 滑动行为轨迹 123 加速公式: 124 v = v0 + a * t 125 126 路程公式: 127 s = v0 * t + 0.5 * a * (t ** 2) 128 ''' 129 130 # 初速度 131 v0 = 0 132 133 # 时间 134 t = 0.2 135 136 # 位置 137 s = 0 138 139 # 滑动轨迹列表 向前滑动列表 140 move_list = [] 141 142 # 中间值,作为加减速度的位置 143 mid = distance / 5 * 3 144 145 # 加减速度列表 146 v_list = [1, 2, 3, 4] 147 148 # 循环位移 149 while s < distance: 150 if s < mid: 151 # 随机获取一个加速度 152 a = v_list[random.randint(0, len(v_list) - 1)] 153 154 else: 155 # 随机获取一个减速度 156 a = -v_list[random.randint(0, len(v_list) - 1)] 157 158 ''' 159 匀加速\减速运行 160 v = v0 + a * t 161 162 位移: 163 s = v * t + 0.5 * a * (t**2) 164 ''' 165 # 获取初始速度 166 v = v0 167 168 # 路程公式: 169 s1 = v * t + 0.5 * a * (t ** 2) 170 s1 = round(s1) # 取整 171 172 # 加速公式: 173 # v = v0 + a * t 174 m_v = v + a * t 175 176 # 把当前加/减速度赋值给初始速度,以便下一次计算 177 v0 = m_v 178 179 # 把位移添加到滑动列表中 180 move_list.append(s1) 181 182 # 修改滑动初始距离 183 s += s1 184 185 # 后退列表, 自定义后退滑动轨迹,必须是负值 186 back_list = [-1, -1, -2, -3, -2, -1, -1, -2, -3, -2, -1, -1] 187 188 return {'move_list': move_list, 'back_list': back_list} 189 190 191 def main(): 192 driver = webdriver.Chrome(r'D:\python\chromedriver_win32\chromedriver.exe') 193 driver.implicitly_wait(10) 194 driver.get('https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F') 195 196 # 1、输入用户名与密码,并点击登录 197 user_input = driver.find_element_by_id('LoginName') 198 user_input.send_keys('LettersfromSuperz') 199 time.sleep(0.2) 200 201 pwd_input = driver.find_element_by_id('Password') 202 pwd_input.send_keys('zhu982033') 203 time.sleep(2) 204 205 login_submit = driver.find_element_by_id('submitBtn') 206 login_submit.click() 207 208 # 2、获取完整的图片 209 image1 = get_image1(driver) 210 211 # 3、获取有缺口图片 212 image2 = get_image2(driver) 213 214 # 4、比对两张图片,获取滑动距离 215 distance = get_distance(image1, image2) 216 print(distance) 217 218 # 5、模拟人的滑动轨迹 219 move_dict = get_strck_move(distance) 220 # 获取前进滑动轨迹 221 move_list = move_dict['move_list'] 222 # 获取后退滑动轨迹 223 back_list = move_dict['back_list'] 224 225 # 6、开始滑动 226 move_tag = driver.find_element_by_class_name('geetest_slider_button') 227 # 点击摁住滑动按钮 228 ActionChains(driver).click_and_hold(move_tag).perform() 229 230 # 向前滑动 231 for move in move_list: 232 ActionChains(driver).move_by_offset(xoffset=move, yoffset=0).perform() 233 time.sleep(0.1) 234 235 time.sleep(0.1) 236 237 # 向后滑动 238 for back in back_list: 239 ActionChains(driver).move_by_offset(xoffset=back, yoffset=0).perform() 240 time.sleep(0.1) 241 242 # 制作微妙晃动 243 ActionChains(driver).move_by_offset(xoffset=3, yoffset=0).perform() 244 ActionChains(driver).move_by_offset(xoffset=-3, yoffset=0).perform() 245 246 time.sleep(0.1) 247 248 # 释放滑动按钮 249 ActionChains(driver).release().perform() 250 251 time.sleep(100) 252 253 finally: 254 driver.close() 255 256 if __name__ == '__main__': 257 main()破解极验滑动验证