cachyOS下chromium插件“社媒助手”无法下载抖音视频的问题解决方案

社媒助手 - 抖音、小红书数据采集工具

 

结论
不是浏览器缓存,也不是 Linux 缺少视频解码器。
根因是:插件下载视频时拿到的抖音 CDN 地址被调度到了 v26-web.douyinvod.com 这个节点,该节点返回 HTTP 403 + HTML 错误页。Chromium 根据响应的 Content-Type: text/html 推断扩展名,所以保存对话框显示成 下载.html,下载下来自然也不是视频。


关键证据
1. Chromium 下载记录
失败视频的下载记录全部是:
- mime_type = text/html
- original_mime_type = text/html
- 文件大小约 350 字节
- 下载 URL 是 v26-web / v26-webf.douyinvod.com 的视频地址


2. 用 curl 复现
对失败 URL 发起请求,返回:
HTTP/1.1 403 Forbidden
Content-Type: text/html
X-CCDN-FORBID-CODE: 020200
Content-Length: 350
响应体就是 openresty 的 403 错误页。


3. 同一个视频换线路就正常
通过抖音的播放入口:
https://www.douyin.com/aweme/v1/play/?video_id=...&line=0...
测试结果:
line 参数   跳转节点           结果
line=0      v26-web.douyinvod.com   403 text/html
line=1      v11-weba.douyinvod.com   200 video/mp4
line=2      v11-weba.douyinvod.com   200 video/mp4
line=3      v11-weba.douyinvod.com   200 video/mp4
最终拿到的 CDN 地址可以正常下载出 1.1 MB 的 MP4 文件。


4. 网络/IP 没有被封
同一台机器上,抖音播放器自己的 v26-webf DASH 请求是成功的:
HTTP/1.1 206 Partial Content
Content-Type: video/mp4
说明网络、IP、IPv6 都不是问题,问题出在插件选中的渐进式 MP4 下载地址和线路上。


5. 不是缓存问题
给 403 URL 加 _cb、t 等随机参数仍然返回 403,清缓存也不会改变。这个 403 是 CDN 边缘节点实时返回的,不是本地缓存了旧文件。


根因拆解
1. 插件默认使用 quality: "smart",从 play_addr.url_list 里选一个渐进式 MP4 地址下载。
2. 这类地址受抖音 CDN 的 line 线路调度影响:
- line=0 经常落到 v26-web,该节点返回 403;
- line=1/2/3 通常落到 v11-weba,正常返回视频。
3. 插件原来的重试逻辑 yr/pr(后台)和 qye/xde(侧边栏)只会重试同一批 URL:
- 用 fetch + Range: bytes=0-0 检查;
- 检查失败后,最终仍然调用 downloads.download(原 URL);
- 不会切换 line 参数,也不会使用重定向后的最终地址。
4. 所以插件最终把 403 的 HTML 错误页当成视频交给 Chromium 下载,文件名就变成了 下载.html。
5. 图片走的是 douyinpic.com / byteimg.com 等不同 CDN,不受这个线路影响,所以图片一直正常。
6. Windows 正常,最可能是当时 CDN 给 Windows 客户端或那条网络分配的线路不同,或者插件版本/请求上下文不同;不是 Linux 缓存、编码或系统差异。


解决方案
已对插件做本地补丁,修改了两个文件:
/home/cmm/.config/chromium/Default/Extensions/blanibhcmnmcipcpplcdeeacadogommd/3.6.1_0/background.js
/home/cmm/.config/chromium/Default/Extensions/blanibhcmnmcipcpplcdeeacadogommd/3.6.1_0/chunks/feishu-sync-config-C0L1G5N6.js


补丁逻辑
对包含 /aweme/v1/play/ 的地址:
1. 依次尝试 line=0、1、2、3;
2. 用 fetch(..., { Range: "bytes=0-0" }) 检查是否真的返回视频;
3. 成功时使用 response.url,也就是重定向后的最终 CDN 地址去下载;
4. 全部失败才回退到原来的行为。
简化后的逻辑类似:

for (let L = 0; L < 4; L++) {
  const u = url.replace(/([?&]line=)\d+/, `$1${L}`);
  const finalUrl = await check(u); // fetch + Range,成功返回 response.url
  if (finalUrl) {
    return downloads.download({ ...options, url: finalUrl });
  }
}

 

为什么改两个文件
- background.js 的 yr/pr:处理内容脚本转发到后台的下载请求。

- chunks/feishu-sync-config-*.js 的 qye/xde:侧边栏是 chrome-extension:// 页面,实际会走这份本地下载逻辑。

image

 

image

 

生效方式
1. 打开 chrome://extensions
2. 开启「开发者模式」
3. 找到「社媒助手」,点刷新按钮(↻)
4. 关闭并重新打开侧边栏
5. 重新下载抖音视频
你已确认修改生效,视频现在可以正常下载。

posted @ 2026-10-26 11:17  petercao  阅读(20)  评论(0)    收藏  举报