共计 2792 个字符,预计需要花费 7 分钟才能阅读完成。
本文仅供学习交换应用,如侵立删! |
**
## 记一次 极验滑块验证剖析并通过
### 操作环境
– win10、mac
– Python3.9
– selenium、seleniumwire
### 剖析
最近在做的一个我的项目登录时会触发一个滑块验证,就长上面这个样子
能够很显著的看进去是极验 3 代验证,借助之前写阿里云盾的教训应用 selenium+pyautoui 先测试一下,具体可参考:阿里云盾滑块验证
间接提醒被怪物吃掉了!!!
还是先来钻研一下官网文档看一下验证的业务逻辑:极验验证接入文档
本认为是检测到了 selenium,手动测试了一下发现是能够滑过的,那就是阐明应该是滑动的轨迹触发了风控。
剖析了一波效验规定及原理,搞明确原理就好办了
## 解决方案
#### 应用 selenium 申请 url,并触发滑块验证
`
python
def open(self):
“””
登录模块
“””
# 定位明码登录
self.driver.find_element_by_xpath(‘//*[@id=”app”]/div/div/div/div/div/div[1]/div[2]’).click()
# 输出账号
username = ‘123456’
self.driver.find_element_by_xpath(‘//*[@id=”app”]/div/div/div/div/div/div[2]/div[1]/form/div[1]/div/div/input’).send_keys(username)
time.sleep(1)
# 输出明码
password = ‘123456789’
self.driver.find_element_by_xpath(‘//*[@id=”app”]/div/div/div/div/div/div[2]/div[1]/form/div[2]/div/div/input’).send_keys(password)
time.sleep(1)
# 登录
self.driver.find_element_by_xpath(‘//*[@id=”app”]/div/div/div/div/div/div[2]/div[3]/button’).click()
`
#### 获取验证图片并计算滑块间隔
`
python
def get_images(self):
“””
获取验证码图片
:return: 图片的 location 信息
“””
# 带缺口图片,应用 js 定位并读取图片的 data 信息 data:image/png;base64,间接调用辨认缺口
fullgb = self.driver.execute_script(‘return document.getElementsByClassName(“geetest_canvas_bg geetest_absolute”)[0].toDataURL(“image/png”)’)
# 残缺图片,应用 js 定位并读取图片的 data 信息 data:image/png;base64,间接调用辨认缺口
bg = self.driver.execute_script(‘return document.getElementsByClassName(“geetest_canvas_fullbg geetest_fade geetest_absolute”)[0].toDataURL(“image/png”)’)
return bg, fullgb
def get_decode_image(self, location_list):
“””
解码图片的 base64 数据
“””
# 提取图片 base64 数据
_, img = location_list.split(“,”)
# 数据转换为 Bytes 字节
img = base64.decodebytes(img.encode())
# 读取图片
new_im: PngImagePlugin.PngImageFile = image.open(BytesIO(img))
# new_im.convert(“RGB”)
# new_im.save(filename)
return new_im
def compute_gap(self, img1, img2):
“””
计算缺口偏移 这种形式成功率很高
“””
# 将图片批改为 RGB 模式
img1 = img1.convert(“RGB”)
img2 = img2.convert(“RGB”)
# 计算差值
diff = ImageChops.difference(img1, img2)
# 灰度图
diff = diff.convert(“L”)
# 二值化
diff = diff.point(self.table, ‘1’)
left = 43
for w in range(left, diff.size[0]):
lis = []
for h in range(diff.size[1]):
if diff.load()[w, h] == 1:
lis.append(w)
if len(lis) > 5:
return w`
#### 生成滑动轨迹 `
python
def get_tracks(self, distance, seconds, ease_func):
“””
:param distance: 缺口地位
:param seconds: 工夫
:param ease_func: 生成函数
:return: 轨迹数组
“””
tracks = [0]
offsets = [0]
for t in np.arange(0.0, seconds, 0.1):
ease = ease_func
offset = round(ease(t / seconds) * distance)
tracks.append(offset – offsets[-1])
offsets.append(offset)
return tracks`
#### 滑动模块 `
python
def move_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(‘ 第二步, 拖动元素 ’)
for track in track:
ActionChains(self.driver).move_by_offset(xoffset=track, yoffset=0).perform() # 鼠标挪动到间隔以后地位(x,y)
time.sleep(0.0001)`
## 成果
完满解决
**
## 资源下载
https://download.csdn.net/download/qq_38154948/85328666
**
本文仅供学习交换应用,如侵立删! |
**