本文仅供学习交流使用,如侵立删! |
记一次 网易易盾滑块验证分析并通过
操作环境
- win10 、 mac
- Python3.9
- selenium、PIL、numpy、scipy、matplotlib
分析
网易易盾滑块验证,就长下面这个样子具体验证原理有兴趣的可自行查询官方文档:网易易盾开发文档
话不多少,借助之前写阿里云盾滑块和极验滑块的经验,直接上代码,详细可参考:阿里云盾滑块验证(https://cenjy.blog.csdn.net/article/details/124664094)(https://cenjy.blog.csdn.net/article/details/124357598)
解决方案
使用selenium请求url,并触发滑块验证
defopen(self):
# 初始化浏览器
wait = WebDriverWait(self.driver, 5)
# 点击对应标签
self.driver.get(cfg.TEST_URL)
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, cfg.HD_SELECOTR)))
button.click()
self.tc_item = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, cfg.TC_SELECOTR)))
self.tc_item.click()
# 得到背景和滑块的item, 以及滑动按钮
time.sleep(2)
self.background_item = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, cfg.BG_SELECOTR))
)
self.slider_item = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, cfg.HK_SELECOTR))
)
self.slider_btn = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, cfg.HD_BTN)))
self.offset = cfg.offset
self.background_path = cfg.background_path
self.slider_path = cfg.slider_path
获取验证图片并计算滑块距离
defget_images(self):
"""
获取验证码图片
:return: 图片的location信息
"""
url = selenium_item.get_attribute("src")
ifurlisnotNone:
response = requests.get(url)
withopen(path, "wb") asf:
f.write(response.content)
img = Image.open(path).resize(size)
img.save(path)
else:
class_name = selenium_item.get_attribute("class")
js_cmd = (
'return document.getElementsByClassName("%s")[0].toDataURL("image/png");'
%class_name
)
im_info = self.driver.execute_script(js_cmd)
im_base64 = im_info.split(",")[1]
im_bytes = base64.b64decode(im_base64)
withopen(path, "wb") asf:
f.write(im_bytes)
img = Image.open(path).resize(size)
img.save(path)
defcompute_gap(self, array):
"""
计算缺口偏移
"""
grad = np.array(array>0)
h, w = grad.shape
# img_show(grad)
rows_sum = np.sum(grad, axis=1)
cols_sum = np.sum(grad, axis=0)
left, top, bottom = 0, 0, h
# get the top index
p = np.max(rows_sum) *0.5
foriinrange(h):
ifrows_sum[i] >p:
top = i
break
foriinrange(h-1, -1, -1):
ifrows_sum[i] >p:
bottom = i
break
p = np.max(cols_sum) *0.5
foriinrange(w):
ifcols_sum[i] >p:
left = i
break
returntop, bottom+1, left
生成滑动轨迹
defget_tracks(distance):
v = random.randint(0, 2)
t = 1
tracks = []
cur = 0
mid = distance*0.8
whilecur<distance:
ifcur<mid:
a = random.randint(2, 4)
else:
a = -random.randint(3, 5)
s = v*t+0.5*a*t**2
cur += s
v = v+a*t
tracks.append(round(s))
tracks.append(distance-sum(tracks))
returntracks
滑动模块
defmove_to_gap(self, track):
"""滑动滑块"""
print('第一步,点击滑动按钮')
slider = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_slider_button')))
ActionChains(self.driver).click_and_hold(slider).perform()
time.sleep(1)
print('第二步,拖动元素')
fortrackintrack:
ActionChains(self.driver).move_by_offset(xoffset=track, yoffset=0).perform() # 鼠标移动到距离当前位置(x,y)
time.sleep(0.0001)
效果
资源下载
https://download.csdn.net/download/qq_38154948/85343666
本文仅供学习交流使用,如侵立删! |