Skip to content

给订阅链接加上请求头 #33611

@lwlong0922

Description

@lwlong0922

Fancyss 3.3.8 - 增加订阅下载自定义请求头功能

修改概述

在订阅管理界面添加了自定义请求头功能,用户可以通过勾选框启用该功能,解决某些订阅服务器要求特定 User-Agent 才能正常访问的问题。


文件修改详情

1. fancyss/webs/Module_shadowsocks.asp

修改 1.1: 添加 UI 表单字段(第 6473-6477 行)

位置: 订阅设置区域,在"下载订阅时走代理"选项之后

新增代码:

{ title: '订阅下载自定义请求头', multi: [
    { id:'ss_basic_online_links_header_enable', type:'checkbox', value:false},
    { suffix: ' ' },
    { id:'ss_basic_online_links_header', type:'text', maxlen:'500', style:'width:350px', value:'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', ph:'格式: Header-Name: header-value,用于解决某些订阅服务器的访问限制'}
]},

修改前:

{ title: '下载订阅时走ss/ssr/v2ray/v2ray代理网络', id:'ss_basic_online_links_goss', type:'select', style:'width:auto', options:[["0", "不走代理"], ["1", "走代理"]], value:'0'},
{ title: '订阅计划任务', multi: [

修改后:

{ title: '下载订阅时走ss/ssr/v2ray/v2ray代理网络', id:'ss_basic_online_links_goss', type:'select', style:'width:auto', options:[["0", "不走代理"], ["1", "走代理"]], value:'0'},
{ title: '订阅下载自定义请求头', multi: [
    { id:'ss_basic_online_links_header_enable', type:'checkbox', value:false},
    { suffix: ' ' },
    { id:'ss_basic_online_links_header', type:'text', maxlen:'500', style:'width:350px', value:'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', ph:'格式: Header-Name: header-value,用于解决某些订阅服务器的访问限制'}
]},
{ title: '订阅计划任务', multi: [

UI 组件说明:

  • 勾选框: ss_basic_online_links_header_enable - 控制是否启用自定义请求头功能
  • 文本输入框: ss_basic_online_links_header - 自定义 HTTP 请求头内容
  • 默认值: 预设常用的浏览器 User-Agent

修改 1.2: 添加保存到 dbus 的逻辑(第 5173-5174 行)

位置: save_online_nodes() 函数中的 dbus_post 对象

新增代码:

dbus_post["ss_basic_online_links_header_enable"] = E("ss_basic_online_links_header_enable").checked ? "1":"0";
dbus_post["ss_basic_online_links_header"] = E("ss_basic_online_links_header").value;

修改前:

dbus_post["ss_online_links"] = Base64.encode(E("ss_online_links").value);
dbus_post["ssr_subscribe_mode"] = E("ssr_subscribe_mode").value;
dbus_post["ss_basic_online_links_goss"] = E("ss_basic_online_links_goss").value;
dbus_post["ss_basic_node_update"] = E("ss_basic_node_update").value;

修改后:

dbus_post["ss_online_links"] = Base64.encode(E("ss_online_links").value);
dbus_post["ssr_subscribe_mode"] = E("ssr_subscribe_mode").value;
dbus_post["ss_basic_online_links_goss"] = E("ss_basic_online_links_goss").value;
dbus_post["ss_basic_online_links_header_enable"] = E("ss_basic_online_links_header_enable").checked ? "1":"0";
dbus_post["ss_basic_online_links_header"] = E("ss_basic_online_links_header").value;
dbus_post["ss_basic_node_update"] = E("ss_basic_node_update").value;

数据格式说明:

  • ss_basic_online_links_header_enable: "1" = 启用, "0" = 禁用
  • ss_basic_online_links_header: 字符串,自定义的 HTTP 请求头

2. fancyss/scripts/ss_online_update.sh

修改 2.1: 修改 download_by_curl() 函数(第 1602-1656 行)

功能: 检查勾选框状态,只有勾选时才使用自定义 HTTP 请求头

修改前:

local url_encode=$(echo "$1" | sed 's/[[:space:]]/%20/g')

echo_date "1️⃣使用curl下载订阅,第一次尝试下载..."
run curl-fancyss -4sSk ${EXT_ARG} --connect-timeout 6 "${url_encode}" 2>/dev/null >${DIR}/sub_file_encode_${SUB_LINK_HASH:0:4}.txt
if [ "$?" == "0" ]; then
    return 0
fi

# ... 后续重试 ...

修改后:

# 添加自定义 header 支持
local HEADER_ENABLE=$(dbus get ss_basic_online_links_header_enable)
local CUSTOM_HEADER=$(dbus get ss_basic_online_links_header)
local url_encode=$(echo "$1" | sed 's/[[:space:]]/%20/g')

if [ "${HEADER_ENABLE}" == "1" ] && [ -n "${CUSTOM_HEADER}" ]; then
    echo_date "📝使用自定义请求头下载订阅..."

    echo_date "1️⃣使用curl下载订阅,第一次尝试下载..."
    run curl-fancyss -4sSk ${EXT_ARG} \
        -H "${CUSTOM_HEADER}" \
        -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \
        -H "Accept-Language: en-US,en;q=0.9,zh-CN,zh;q=0.8" \
        --connect-timeout 6 "${url_encode}" 2>/dev/null >${DIR}/sub_file_encode_${SUB_LINK_HASH:0:4}.txt
    if [ "$?" == "0" ]; then
        return 0
    fi

    # ... 后续重试(带 header)...
else
    echo_date "1️⃣使用curl下载订阅,第一次尝试下载..."
    run curl-fancyss -4sSk ${EXT_ARG} --connect-timeout 6 "${url_encode}" 2>/dev/null >${DIR}/sub_file_encode_${SUB_LINK_HASH:0:4}.txt
    if [ "$?" == "0" ]; then
        return 0
    fi

    # ... 后续重试(不带 header)...
fi

关键变化:

  1. 读取勾选框状态:HEADER_ENABLE=$(dbus get ss_basic_online_links_header_enable)
  2. 读取自定义 header:CUSTOM_HEADER=$(dbus get ss_basic_online_links_header)
  3. 双重判断:if [ "${HEADER_ENABLE}" == "1" ] && [ -n "${CUSTOM_HEADER}" ]
    • 必须勾选框启用(值为 "1")
    • 且自定义 header 不为空
  4. 启用时添加三个 HTTP 请求头:
    • 用户配置的自定义 header(通常是 User-Agent)
    • Accept header(模拟浏览器接受类型)
    • Accept-Language header(模拟浏览器语言偏好)
  5. 未启用时使用原有逻辑

修改 2.2: 修改 download_by_wget() 函数(第 1672-1714 行)

功能: 与 curl 函数类似,检查勾选框状态

修改前:

local url_encode=$(echo "$1" | sed 's/[[:space:]]/%20/g')

echo_date "1️⃣使用wget下载订阅,第一次尝试下载..."
wget -4 -t 1 -T 10 --dns-timeout=5 -q ${EXT_OPT} "${url_encode}" -O ${DIR}/sub_file_encode_${SUB_LINK_HASH:0:4}.txt
if [ "$?" == "0" ]; then
    return 0
fi

# ... 后续重试 ...

修改后:

# 添加自定义 header 支持
local HEADER_ENABLE=$(dbus get ss_basic_online_links_header_enable)
local CUSTOM_HEADER=$(dbus get ss_basic_online_links_header)
local url_encode=$(echo "$1" | sed 's/[[:space:]]/%20/g')

if [ "${HEADER_ENABLE}" == "1" ] && [ -n "${CUSTOM_HEADER}" ]; then
    echo_date "1️⃣使用wget下载订阅,第一次尝试下载..."
    wget -4 -t 1 -T 10 --dns-timeout=5 -q ${EXT_OPT} --header="${CUSTOM_HEADER}" "${url_encode}" -O ${DIR}/sub_file_encode_${SUB_LINK_HASH:0:4}.txt
    if [ "$?" == "0" ]; then
        return 0
    fi

    # ... 后续重试(带 header)...
else
    echo_date "1️⃣使用wget下载订阅,第一次尝试下载..."
    wget -4 -t 1 -T 10 --dns-timeout=5 -q ${EXT_OPT} "${url_encode}" -O ${DIR}/sub_file_encode_${SUB_LINK_HASH:0:4}.txt
    if [ "$?" == "0" ]; then
        return 0
    fi

    # ... 后续重试(不带 header)...
fi

关键变化:

  1. 同样读取勾选框状态和自定义 header
  2. 双重判断:勾选框启用且 header 不为空
  3. 使用 wget 的 --header 参数添加自定义请求头
  4. 未启用时使用原有逻辑

技术要点

1. 勾选框控制逻辑

UI 层:

// 勾选框组件
{ id:'ss_basic_online_links_header_enable', type:'checkbox', value:false }

// 保存勾选框状态
dbus_post["ss_basic_online_links_header_enable"] = E("ss_basic_online_links_header_enable").checked ? "1":"0";

Shell 脚本层:

# 读取勾选框状态
local HEADER_ENABLE=$(dbus get ss_basic_online_links_header_enable)

# 双重判断:勾选 + header 不为空
if [ "${HEADER_ENABLE}" == "1" ] && [ -n "${CUSTOM_HEADER}" ]; then
    # 启用自定义 header
else
    # 使用原有逻辑
fi

2. Shell 参数处理

  • 问题: Shell 变量无法正确展开带引号的参数
  • 解决: 使用条件分支,在不同分支中直接使用参数

3. 浏览器模拟增强

启用自定义 header 时,curl 自动添加额外的浏览器 headers:

  • Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  • Accept-Language: en-US,en;q=0.9,zh-CN,zh;q=0.8

提升订阅下载成功率,减少被服务器拦截的可能性。

4. 完全向后兼容

  • 未勾选时: 完全保持原有行为,不使用任何自定义 header
  • 勾选但 header 为空: 同样使用原有逻辑
  • 勾选且 header 不为空: 启用自定义 header 功能
  • 不影响现有订阅链接的正常使用

使用流程

启用功能

步骤 1: 打开订阅管理界面

步骤 2: 找到"订阅下载自定义请求头"配置项

  • 勾选左侧的勾选框
  • 📝 在文本框中填入自定义 header(已预设默认 User-Agent)

步骤 3: 点击"保存并订阅"或"仅保存设置"

禁用功能

步骤 1: 打开订阅管理界面

步骤 2: 找到"订阅下载自定义请求头"配置项

  • 取消勾选左侧的勾选框

步骤 3: 点击"保存并订阅"或"仅保存设置"


实际效果对比

场景 1: 未勾选(默认行为)

curl-fancyss -4sSk --connect-timeout 6 "https://example.com/sub"
# 保持原有行为,不添加任何额外 header

场景 2: 勾选但 header 为空

# 判断条件:HEADER_ENABLE == "1" && CUSTOM_HEADER != ""
# 因为 CUSTOM_HEADER 为空,条件不满足
curl-fancyss -4sSk --connect-timeout 6 "https://example.com/sub"
# 同样使用原有逻辑

场景 3: 勾选且填写了 header

# 判断条件:HEADER_ENABLE == "1" && CUSTOM_HEADER != ""
# 条件满足,启用自定义 header
curl-fancyss -4sSk \
  -H "User-Agent: Mozilla/5.0 ..." \
  -H "Accept: text/html,application/xhtml+xml..." \
  -H "Accept-Language: en-US,en;q=0.9..." \
  --connect-timeout 6 "https://example.com/sub"
# ✅ 使用自定义 header,提升成功率

数据存储

Dbus 配置键值

键名 类型 说明
ss_basic_online_links_header_enable String "0" 或 "1" 0=禁用,1=启用
ss_basic_online_links_header String 自定义内容 HTTP 请求头,如 "User-Agent: ..."

默认值

  • 勾选框: 默认未勾选(value:false)
  • 文本框: 默认填入标准浏览器 User-Agent

界面展示

┌────────────────────────────────────────────────────────────────┐
│ 订阅下载自定义请求头                                            │
├────────────────────────────────────────────────────────────────┤
│ [✓] User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)... │
│     ↑                                                          │
│  勾选框启用                文本框填写自定义 header              │
└────────────────────────────────────────────────────────────────┘

勾选状态: ✓ = 启用功能,□ = 禁用功能(走原逻辑)


总结

修改文件

  1. fancyss/webs/Module_shadowsocks.asp - 添加 UI(勾选框+文本框)和保存逻辑
  2. fancyss/scripts/ss_online_update.sh - 修改下载函数,检查勾选框状态

核心逻辑

用户勾选 ✓ + header不为空  →  启用自定义 header(增强模式)
     ↓
用户未勾选 □ 或 header为空  →  使用原有逻辑(标准模式)

新增功能

  • ✅ 界面新增勾选框,明确控制功能开关
  • ✅ 文本框配置自定义 HTTP 请求头
  • ✅ 默认预设浏览器 User-Agent
  • ✅ curl 下载时自动添加完整浏览器 headers
  • ✅ wget 下载时支持自定义 header
  • ✅ 完全向后兼容,默认禁用不影响现有功能

解决问题

  • ✅ 某些订阅服务器要求特定 User-Agent
  • ✅ 提升订阅下载成功率
  • ✅ 更好地模拟真实浏览器访问
  • ✅ 用户可自主选择是否启用该功能
  • ✅ 避免对不需要该功能的用户造成困扰

用户体验

  • 清晰的开关: 勾选框明确表示功能状态
  • 灵活配置: 可随时启用/禁用
  • 安全默认: 默认禁用,不改变原有行为
  • 即插即用: 勾选后立即生效,无需额外配置

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