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
的值。