OpenSubtitles 国内使用指南

更新于 2026 年 8 月 31 日 · 注册、配额、中转与错误码

一句话:OpenSubtitles 是全球最大的字幕库,国内直连不通、要走中转。真正会卡住人的是它的两个错误码——403 的字面意思是「Api-Key 无效」,但十有八九是 User-Agent 的问题,照字面去换 key 纯属白折腾406 的正常含义是「今日配额用完」,可少了 Accept 请求头也回 406,两件事撞在同一个码上。另外中转模式下有两件事必须和直连反着做,否则就是典型的「搜得到、下不来」。

它值不值得配

先说清楚定位,免得配了半天发现用不上。只看中文片子的话,射手网(伪) 一家就够了——国内直连,填一个 token 就能用,没有下面这些坑。OpenSubtitles 值得配的是这几种场景:

两家在应用里是并搜合并成一张列表的关系,不是主备——配上第二家不会顶掉第一家,只是列表里多出一批候选。这个设计的取舍讲在 外挂字幕自动下载指南里。

第一步:注册与 API Key

  1. opensubtitles.com 注册一个账号(注意是 .com,历史上还有一个 .org 的老站,两边是不同的体系)。
  2. 在开发者 / Consumers 页面创建一个 consumer,拿到 API Key。免费。
  3. 回到应用:设置 → 字幕 → 在线字幕 · OpenSubtitles,填入 API Key
  4. 再填中转地址(下一节讲)。
  5. 用户名 / 密码选填:填了每日下载配额更高,不填也能搜。

顺序建议是先把 API Key 和中转配好,能搜出结果之后再决定要不要填账号——配额问题只有在真的下多了才会遇到。

第二步:中转(国内的必选项)

它的 API 域名在国内直连不通,所以设置里有一栏「中转地址」。中转就是一个你自己部署的、把请求原样转发到 OpenSubtitles 的小服务。填上之后,应用的所有请求都从这里走。

这一栏和 TMDB 刮削那边的中转是同一类东西,如果你已经为刮削搭过一个(见电影刮削完全指南),可以复用同一个服务。

中转模式下有两件事必须反着做

这是这篇最值钱的一段,因为它的症状特别有迷惑性:搜索一切正常、结果列表满满当当,一点下载就失败。原因是「让搜索通」和「让下载通」是两件事,中转只办妥前一件的话,最后一步照样连不上。

第一件:登录返回的 base_url,直连时必须认,中转模式下必须丢掉。

OpenSubtitles 的登录接口会在响应里返回一个 base_url,告诉客户端「你之后的请求发到这个地址」。VIP 账号会被指到 vip-api.opensubtitles.com 这样的专属域名,继续打默认域会被拒绝——所以直连的时候这个字段是必须认的,host 得跟着 token 一起存下来。

但走中转时,你的中转服务只反代了 api.opensubtitles.com 这一个域。这时候如果照样去认服务端下发的 base_url,客户端就会绕过你的中转、直接去打那个新域名——而那个域名在国内同样不通。配了中转反而失效,且失效的时机是「登录成功之后」,所以看起来像是登录搞坏了什么东西。正确做法是中转模式下把这个字段丢掉,一切照中转地址走。

第二件:下载直链也要经中转。

下载字幕是两步:先调 /download 接口换一个一次性的下载链接,再去拉那个链接。这两步的域名是不一样的——接口在 api 域,而返回的 link 指向 OpenSubtitles 的下载域,是另一台服务器。中转只反代了 api 域的话,前一步通、后一步不通,症状就是「搜得到、能拿到下载地址、就是下不来」。所以取回的下载直链本身也要改写成经中转的地址。

如果你在自建中转,对应地服务端要放行三件事:放行 POST(登录和下载都是 POST,只做刮削中转的话通常只收 GET)、透传 Authorization、以及给下载直链留一条转发路径,并且那条路径的目标 host 要走白名单——不加限制的话你就搭了一个公开的开放代理。

403 说「Api-Key 无效」,但通常不是 key 的问题

这是最浪费时间的一个坑,因为报错信息在主动误导你

请求被拒时服务端返回 403,附带的文字大意是「Api-Key 无效」。任何人看到这句话的第一反应都是去后台重新生成一把 key——然后换上,还是 403;怀疑是账号问题,重注册一个,还是 403。

真实原因常常是 User-Agent这套 API 要求每个请求必须带一个具体的 User-Agent——标明是哪个应用、哪个版本。缺这个头一律 403;用 HTTP 库的默认 UA(那种 okhttp/4.xpython-requests/2.x)同样一律 403。而它回给你的错误文字,说的却是 key 的事。

所以排查顺序应该反过来:先确认 UA 带了、且不是默认值,再去怀疑 key。这一条对自己写脚本调它的人尤其重要——网上大量示例代码只贴了 Api-Key 头,照抄必踩。

406 同时代表两件事

另一个撞码的坑,方向和上面相反:这次不是报错文字骗人,而是两个完全不同的问题共用同一个状态码

在这套 API 里,406 的正常含义是「今日下载配额用完了」。这是个设计上的选择,别的 API 一般用 429。但同时,/download 时如果没带 Accept 请求头,也会回 406

于是你会看到这种情况:账号明明一次都没下过,提示却说配额用完;或者刚换了个新账号,第一次下载就说超额。两者的区分办法很直接:

情况特征处理
真的配额用完今天成功下过若干条,之后开始 406;换个时段恢复等重置,或登录账号提高上限
Accept一条都没成功下过就 406;换账号、换 key 都一样补上请求头

判据是「有没有成功过」。一次都没成功而立刻 406 的,几乎可以断定是请求头问题,不是额度问题。

还有三条会咬人的规矩

常见问题

不填用户名密码能用吗?

能搜、也能下,只是每日下载配额低一些。先不填用起来,遇到配额不够再补。

配额是怎么算的?

下载次数算,不是按搜索次数。搜索不消耗配额,所以随便搜;真正扣数的是点下去那一下。额度按日重置,登录账号后上限更高。

搜出来一条中文都没有,是不是配错了?

不一定。OpenSubtitles 的中文资源本来就不如英语丰富,冷门片子上一条中文都没有是正常的。这正是要同时配射手网(伪) 的原因——两家并搜,中文那半边由它兜住。

能不能不搭中转?

如果你的网络环境能直连它的 API,可以不填中转,直接用 API Key。中转是为直连不通的情况准备的。另外提醒一句:直连时前面说的 base_url,中转时要,两种模式的行为是相反的。

下好的字幕不显示怎么办?

先看文件有没有正确的扩展名——播放器按扩展名挑解析器,没后缀的文件会被静默跳过,不报错。这一类症状的完整分诊见 字幕加载不出来的六种原因

为什么我的排错日志里看不到这些细节?

因为多数客户端会把 HTTP 层的失败折叠成一句「下载失败」。真要定位,最有效的办法是盯住状态码本身:403 先查 UA,406 先查是不是一次都没成功过,301 查参数排序。把这三条记住,这套 API 就没什么神秘的了。

相关阅读:外挂字幕自动下载指南简体繁体字幕都想搜到字幕加载不出来的六种原因。配置上还有问题的话,带上状态码发到支持页上的邮箱。