seven

课堂记录:

Actionchains控制某种动作

Js 获取class属性 Getelements  获取id Getelement

完整图片属性由None隐藏修改为 block显示

seven

 

Ways:

找缺口:

注意 像素差 (也会有迷惑你的像素差模块)

从60开始循环所有的x轴

像素值等于或者大于60 则找到缺口地方 像素也有可能是负数 我们需要用abs函数获取绝对值 比较坐标元组的每个像素值

 

加速度滑动 模拟人的行为:

加减速列表 确保速度不一样 随机获取一个加速度

 

向前滑动列表

后退列表  回退必须要是的负值

取整函数round() 路程要取整 不然不会滑动

 

 

seven
  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()
破解极验滑动验证

 

 

 

 

上一篇:python-011列表list类型、方法


下一篇:redis常见应用场景