ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

seven

2019-06-21 14:53:55  阅读:317  来源: 互联网

标签:seven list image move driver 获取 滑动


课堂记录:

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

 

 

 

 

标签:seven,list,image,move,driver,获取,滑动
来源: https://www.cnblogs.com/LettersfromSuperz/p/11064434.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有