Skip to content

使用第三方后端和远端模板更新订阅时报错 #412

Description

@mi0e

问题描述

更新到最新版本后,使用第三方转换后端获取订阅时,如果节点数量较多,会返回以下错误:

{
  "error": "Internal Server Error",
  "message": "external nodes callback secret is missing"
}

节点数量较少时转换正常。

该问题在同时使用第三方转换后端和远程模板时较容易复现。

相关 Issue:#397

原因分析

当前实现会先将完整节点列表内联到第三方转换请求的 url 参数中。当 URL 长度超过 6000 字符或节点数量超过 80 个时,项目会切
换到临时回调模式。

临时回调模式依赖 CALLBACK_TOKEN_SECRET 或 COOKIE_SECRET。如果未配置对应密钥,项目会在生成回调令牌时抛出:

external nodes callback secret is missing

因此,节点数量只是触发回调分支的条件,实际的 500 错误来自项目内部缺少回调密钥。

此外,当前流程会先写入临时节点缓存,再生成回调令牌。如果令牌生成失败,可能留下无效的临时缓存写入,操作不具备原子性。

复现步骤

  1. 配置第三方 subconverter 后端。
  2. 使用包含较多节点的订阅,例如超过 80 个节点。
  3. 不配置 CALLBACK_TOKEN_SECRET 和 COOKIE_SECRET。
  4. 请求 Clash 等需要第三方转换的订阅链接。
  5. 服务返回 500,并提示回调密钥缺失。

期望行为

项目已有 Base64 订阅输出能力,可以将当前订阅地址转换为:

https://example.com/<subscription-path>?base64&callback_token=external

建议修复

  • 第三方转换请求的 url 参数统一使用当前订阅的 ?base64&callback_token=external 地址。
  • 不再内联完整节点列表。
  • 不再根据节点数量或 URL 长度切换临时回调模式。

这样既能修复回调密钥缺失导致的 500,也能避免完整节点列表造成 URL 过长。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions