关于python:抖音-滑块验证方案-svwebid-参数分析

81次阅读

共计 2374 个字符,预计需要花费 6 分钟才能阅读完成。

本文所有教程及源码、软件仅为技术钻研。不波及计算机信息零碎性能的删除、批改、减少、烦扰,更不会影响计算机信息零碎的失常运行。不得将代码用于非法用处,如侵立删!

**
## 抖音 web 端 s_v_web_id 参数生成剖析与实现

### 操作环境
– win10
– Python3.9

### 剖析

s_v_web_id 作用:web 端应用滑块后的 s_v_web_id 参数能够实现免 signature 验证
s_v_web_id 生成:在验证码两头页的 html 中的 fp 参数就是 s_v_web_id
具体介绍这边就不在赘述,能够参考下玺佬的文章:s_v_web_id 介绍
生成计划:
– Python + selenium 自动化过滑块
– RPC 近程调用主动,验证滑块

这两种计划有个前提是页面必须呈现滑块才能够(之前搜素视频会强制滑块效验),具体过滑块的办法玺佬都曾经分享过。
当初应该是 web 端有更新,当初搜寻页面只有综合会出点选验证,视频和用户页面都没有强制滑块验证了,清 cookie 和开无痕都没方法触发滑块,通过几天的剖析钻研出以下计划
最新解决方案:
– 通过 js 生成滑块 s_v_web_id
– 辨认滑块
– 生成验证参数并验证
– 验证通过后就可失常应用了

**
### 2022-8-6 更新:报错以后网络不稳固,请稍后再试
问题:下载验证码图片报错:以后网络不稳固,请稍后再试
解决:在申请参数中减少参数 “app_name”: “”

**
### 通过 js 生成滑块 s_v_web_id

`javascript
function create_s_v_web_id() {
var e = “0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz”.split(“”)
, t = e.length
, n = (new Date).getTime().toString(36)
, r = [];

r[8] = r[13] = r[18] = r[23] = “_”,
r[14] = “4”;
for (var o, i = 0; i < 36; i++)
r[i] || (o = 0 | Math.random() * t,
r[i] = e[19 == i ? 3 & o | 8 : o]);
return “verify_” + n + “_” + r.join(“”)
}
`
此办法生成的 s_v_web_id 是不能够用来采集评论的,评论验证应用的 s_v_web_id 须要从页面取下来,而后在拿着过滑块,此处再次感激玺佬 @李玺

**
### 辨认滑块
`python
def calculate_distance(self, pic1_path, pic2_path):
“””
计算滑块到缺口的间隔
“””
img1 = self.clear_white(pic1_path)
img1 = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)
slide = cv2.Canny(img1, 100, 200)
img2 = cv2.imread(pic2_path, 0)
back = cv2.Canny(img2, 100, 200)
slide_pic = cv2.cvtColor(slide, cv2.COLOR_GRAY2RGB)
back_pic = cv2.cvtColor(back, cv2.COLOR_GRAY2RGB)
x, y = self.template_match(slide_pic, back_pic)
dis_x = int((x + 5) * (340 / 552))
dis_y = int(y * (340 / 552))
return dis_x, dis_y

def get_tracks(self, distance, _y):
“””
获取轨迹参数
“””
tracks = list()
y, v, t, current = 0, 0, 1, 0
mid = distance * 3 / 4
exceed = random.randint(40, 90)
z = random.randint(30, 150)
while current < (distance + exceed):
if current < mid / 2:
a = 2
elif current < mid:
a = 3
else:
a = -3
a /= 2
v0 = v
s = v0 t + 0.5 a (t t)
current += int(s)
v = v0 + a * t
y += random.randint(-3, 3)
z = z + random.randint(5, 10)
tracks.append([min(current, (distance + exceed)), y, z])
while exceed > 0:
exceed -= random.randint(0, 5)
y += random.randint(-3, 3)
z = z + random.randint(5, 9)
tracks.append([min(current, (distance + exceed)), y, z])
tr = []
for i, x in enumerate(tracks):
tr.append({
‘x’: x[0],
‘y’: _y,
‘relative_time’: x[2]
})
return tr
`
**
### 生成验证参数并验证
captchaBody 须要 js 生成
`python
def captcha_verify(self, s_v_web_id, captchaBody):
url = “aHR0cHM6Ly92ZXJpZnkuc25zc2RrLmNvbS9jYXB0Y2hhL3ZlcmlmeQ==”
params = {
“os_type”: “2”,
“fp”: s_v_web_id,
“subtype”: “slide”,
}
data = {
‘captchaBody’: captchaBody
}
r = self._parse_url(url=url, params=params, data=json.dumps(data))
return r.json()
`
### 成果
识别率成功率还是能够的

**

本文仅供学习交换应用,如侵立删!

**

正文完
 0