前言
a_bogus 相比于之前的 x-bogus,隐藏得更深,且裹挟着 JSVMP 混淆,增加了数据抓取的难度。
本文仅用于技术学习与交流,请勿用于非法爬取商业数据。

一、什么是 a_bogus?
在抖音的 WEB 端请求中,a_bogus 是一个必不可少的请求签名参数。
它的作用类似于一张'动态身份证',服务端会根据请求的 URL、参数、环境指纹等计算出签名。只有签名正确,服务器才返回真实数据。如果直接复制浏览器里的请求链接,或者单纯注释掉 a_bogus,返回的数据要么是空的,要么直接是 403。
二、逆向分析环境准备
正式开始之前,你需要具备以下基础:
- 熟悉浏览器的开发者工具(Network 面板、Sources 面板)
- 掌握 XHR 断点、条件断点、日志断点的用法
- 了解基础的 JavaScript 语法
- 知道如何利用 curlconverter 将请求转换为 Python 代码
三、实战拆解:追踪 a_bogus 的生成逻辑
1. 选取目标接口
以抖音的关键词搜索接口为例:
https://www.douyin.com/aweme/v1/web/general/search/single/
这个接口用于搜索视频内容,参数复杂且加密严密,是逆向分析的绝佳对象。
2. 接口参数分析
打开浏览器开发者工具,刷新页面,在 Network 面板中找到上述接口。
复制它的 cURL(bash),使用 curlconverter 转换为 Python 代码,方便测试。
观察请求参数,你会发现除了常规的 keyword、offset 等参数外,还有两个变量:msToken 和 a_bogus。分别注释掉这两个参数进行请求,发现缺了任何一个都会导致请求失败。本文重点攻克 a_bogus。
3. 定位加密位置
3.1 全局搜索失效
直接在 Sources 面板搜索 a_bogus,发现代码被混淆,根本搜不到明文。这说明抖音做了代码混淆,需要换一种思路——XHR 断点。
3.2 使用 XHR 断点
在 Sources 面板右侧,找到 XHR/fetch Breakpoints,点击 +,输入接口路径的关键词 general/search/single。
设置好后刷新页面,页面会自动断在发送请求的代码处。
3.3 分析堆栈调用
断下来后,查看右侧的 Call Stack(调用堆栈)。
堆栈是从下往上执行的,我们需要找到 生成 a_bogus 的那个堆栈帧。
- 往下翻堆栈,找到 请求参数中还没有 a_bogus 的地方。
- 往上翻,找到 请求参数中已经有了 a_bogus 的地方。
这两个位置之间的某个函数,就是加密函数。关键点:不要只找一个堆栈就停下,要逐个查看作用域(Scope)中的 params 或 data 对象,看是否有 a_bogus 字段。
4. 精细调试:日志断点与条件断点
最终,我们定位到了一个混淆很严重的 JS 文件(通常是 bdms.js 之类的),代码看起来像这样:


