我写了个 Chrome 插件,专治 Twitter 视频“下载难”
Twitter 视频想下载?市面上的工具要么广告满天飞,要么画质压成渣,遇到敏感内容直接罢工。
受够了,自己写一个。
本以为调个 API 就完事,结果越挖越深。今天聊聊这一路踩过的坑。
一、常规方案:能用,但不够用
大多数下载工具的原理很简单:调 Twitter 的公开接口,拿到 mp4 地址直接下。
优点:简单快速。
问题:只对「公开且无害」的推文有效。视频一旦被标记为敏感内容,接口直接返回 TweetTombstone,拒绝访问。
这就是为什么很多下载器对某些视频没辙。
二、敏感视频:伪装成浏览器
公开接口不给看,但我在浏览器里能看到啊。
区别在哪?我登录了。
既然浏览器能拿到,插件复用浏览器的身份去请求就行了。
具体做法是 GraphQL 拦截 + 模拟重放:
- 复用 Cookie:直接用浏览器里的登录态
- 动态监听:Twitter 接口地址经常变,写死容易失效。我的做法是让插件在后台监听浏览器发出的真实请求,把 URL 模板记下来
- 模拟重放:点下载时,用记下来的 URL 模板 + Cookie 再请求一次,服务器就会正常返回视频地址
不管敏感不敏感,都能拿到。
三、卡片视频:藏得最深的那种
搞定敏感视频后,又遇到一类更麻烦的:**卡片视频 (Card Video)**。
这类视频的特征是:看着像普通视频,点播放却跳转到外部网页(通常是广告)。
用常规方法解析,标准字段里空空如也。
反复排查后发现,数据藏在一个很深的位置:
card → legacy → binding_values → unified_card → value → string_value
而且 string_value 里存的是另一个转义过的 JSON 字符串,套娃结构。
解决方案是写一个递归解析器:不管嵌套多少层,遍历所有字段,遇到字符串就尝试解析,直到找到 video/mp4 为止。
四、踩过的坑
在找到上面这些方案之前,我也试过几条「捷径」,都失败了:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
五、最后
本来以为半天能搞定的事,折腾了好几天。
每个「简单功能」背后都是一堆边缘情况。能用的工具,都是把复杂留给自己、把简单留给用户。
如何获取
关注公众号后,发送15就可获取。
夜雨聆风
