fix(dy): 补上 detail 接口的 uifid/verifyFp 风控参数

抖音 detail 接口的 Argus 风控要求 uifid / verifyFp / fp 三个参数,缺一则直接
403:响应体为 "Blocked by ArgusSecurityPlugin Uifid Not Found",补上 uifid 但
verifyFp 不对时换成 "... Signature Not Found"。原实现只传 aweme_id,于是
get_aweme_detail 全线失败,详情和媒体都拿不到。

- 三个参数取自浏览器 cookie:uifid 用 UIFID(缺失时退到 UIFID_TEMP),
  verifyFp/fp 用 s_v_web_id。必须用 cookie 里的 s_v_web_id——实测 uifid 搭配
  自生成的 verifyFp 会被判 Signature Not Found,两者需要同源
- 新增 tests/test_douyin_aweme_detail_params.py(不发网络请求)

验证:抓包比对真实浏览器发出的 detail 请求,参数逐项一致;真实爬取中详情与
74MB 视频均下载成功。
This commit is contained in:
程序员阿江(Relakkes)
2026-09-18 17:00:11 +08:00
parent 281b445f52
commit cf513e70a1
2 changed files with 120 additions and 1 deletions
+13 -1
View File
@@ -214,7 +214,19 @@ class DouYinClient(AbstractApiClient, ProxyRefreshMixin):
:param aweme_id:
:return:
"""
params = {"aweme_id": aweme_id}
# 抖音 detail 接口的 Argus 风控要求这两个参数成套出现,缺一则直接 403
# (响应体为 "Blocked by ArgusSecurityPlugin Uifid Not Found"):
# uifid = UIFID cookie,没有时退到 UIFID_TEMP
# verifyFp / fp = s_v_web_id cookie
# 必须用 cookie 里的 s_v_web_id:实测 uifid 搭配自生成的 verifyFp 会被判成
# "Signature Not Found",两者同源才能通过。
s_v_web_id = self.cookie_dict.get("s_v_web_id", "")
params = {
"aweme_id": aweme_id,
"uifid": self.cookie_dict.get("UIFID") or self.cookie_dict.get("UIFID_TEMP", ""),
"verifyFp": s_v_web_id,
"fp": s_v_web_id,
}
headers = copy.copy(self.headers)
del headers["Origin"]
res = await self.get("/aweme/v1/web/aweme/detail/", params, headers)