fb_dtsg 是 Facebook 动态令牌(Dynamic Token for Security Graph),是一种安全机制,用于防止跨站请求伪造(CSRF)攻击。

全局搜索 dtsg 找到了 DTSG 这个模块,可以获取到 fb_dtsg 的结果,这个结果是由 DTSGInitialData 模块写入的,但是并没有找到 DTSGInitialData 这个模块赋值的方式。

通过下面的两种方式都可以获取到 fb_dtsg,在不刷新页面的情况下,这个值是固定的。

require('DTSG').getToken()
require('DTSGInitialData').token

切换到手机版页面再去全局搜索 dtsg 的时候,在 DTSG 这个模块里面有一个 refresh 更新的方法,调用的是 TokenFetcher 这个模块。

TokenFetcher 模块中,会向 /ajax/dtsg/ 域名发送一个请求,这个应该是就是获取 dtsg 的方法了。

使用 fetch 重写一个请求,代码如下:

await fetch('https://www.facebook.com/ajax/dtsg/?__a=true')
  .then(response => response.text())
  .then(text => JSON.parse(text.replace('for (;;);', '')).payload.token)

这种方法在每次请求的时候都会生成一个新的 fb_dtsg 参数,这样即使在不刷新页面的情况下也可以更新 fb_dtsg 的值。

相关代码:Facebook-API-Params-Generator