抖音私信怎么拿到明文数据?一次完整的协议分析实录
在所有自媒体平台里,私信这块的协议是最难啃的,抖音也不例外。它的私信互动走的是 WebSocket,而私信列表是直接用 HTTPS 拉的,但不管哪一条,拿回来的数据都被编码过,得自己转码才能看懂。这篇就把我一步步抠出抖音私信明文的全过程记录下来,做矩阵、做自动化的朋友可以照着捋一遍思路。
先看清楚抖音私信的传输方式
动手之前先把底摸清楚:私信的发送和互动是 WebSocket 协议,实时性强;私信列表则是普通的 HTTPS 接口直接返回。两条路返回的数据都不是明文,而是经过一层编码,所以核心问题只有一个——找到那个负责编码、解码的入口函数。
第一步:从创作者后台的私信管理进去
直接登录抖音创作者后台,进互动管理里的私信管理。这里是私信数据的源头,调试也从这个页面开始。
第二步:盯住 get_by_user_init 这个接口
按 F12 打开调试,切到 Network。翻接口的时候很快就注意到了 get_by_user_init——它返回的数据体明显比别的接口大,而且内容是加密过的一长串,一看就很可疑,私信列表大概率就藏在这里。
第三步:顺着调用栈找到 GetMessagesByUserInitV2
光看返回值没用,得知道这串编码是谁生成、谁解析的。点开这个请求的 Initiator 看调用栈,往上翻就找到了 GetMessagesByUserInitV2 这个方法,私信初始化的逻辑就在它这一条线上。
第四步:跳进去找到 decode 解码函数
顺着调用链一层层往里跳,最后落到了真正处理请求数据的地方。这里有个名字直白的 decode 函数,编码、解码十有八九就是它干的。跳进函数实现一看,运气不错——抖音这段代码没做混淆,逻辑清清楚楚摆在眼前。
第五步:验证编码后的内容就是 Uint8Array
读 decode 的实现,发现它接收的参数是 Uint8Array。为了确认 get_by_user_init 返回的那串编码字符就是这个 Uint8Array,我顺手写了个小脚本,把返回的 base64 转成 Uint8Array,再跟接口里的数据对一对。
把前面 9 个字符仔仔细细核对了一遍,果然和我猜的一样,完全对得上。到这一步,核心的编码入口就算彻底锁定了。说白了抖音在这里并没搞什么花哨的加密,本质上就是做了一层字符编码转义,接下来只要把 decode 这套 JS 环境抠出来,就能在外面复现解码。
最后:明文私信数据到手
环境抠干净之后跑一遍,私信内容就完整地以明文呈现出来了,效果如下图。整条链路走下来其实并不玄乎,难点不在加密强度,而在于有没有耐心顺着调用栈一层层找到那个 decode 入口。
抖音私信这块就分析到这里。思路通了之后,剩下的就是工程化的事情——把解码逻辑沉淀进自己的矩阵工具里,私信的采集、同步、消息管理就都能串起来了。