-
Notifications
You must be signed in to change notification settings - Fork 3.2k
Closed
Description
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关键变化:
- 读取勾选框状态:
HEADER_ENABLE=$(dbus get ss_basic_online_links_header_enable) - 读取自定义 header:
CUSTOM_HEADER=$(dbus get ss_basic_online_links_header) - 双重判断:
if [ "${HEADER_ENABLE}" == "1" ] && [ -n "${CUSTOM_HEADER}" ]- 必须勾选框启用(值为 "1")
- 且自定义 header 不为空
- 启用时添加三个 HTTP 请求头:
- 用户配置的自定义 header(通常是 User-Agent)
- Accept header(模拟浏览器接受类型)
- Accept-Language header(模拟浏览器语言偏好)
- 未启用时使用原有逻辑
修改 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关键变化:
- 同样读取勾选框状态和自定义 header
- 双重判断:勾选框启用且 header 不为空
- 使用 wget 的
--header参数添加自定义请求头 - 未启用时使用原有逻辑
技术要点
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
# 使用原有逻辑
fi2. Shell 参数处理
- 问题: Shell 变量无法正确展开带引号的参数
- 解决: 使用条件分支,在不同分支中直接使用参数
3. 浏览器模拟增强
启用自定义 header 时,curl 自动添加额外的浏览器 headers:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-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 │
└────────────────────────────────────────────────────────────────┘
勾选状态: ✓ = 启用功能,□ = 禁用功能(走原逻辑)
总结
修改文件
fancyss/webs/Module_shadowsocks.asp- 添加 UI(勾选框+文本框)和保存逻辑fancyss/scripts/ss_online_update.sh- 修改下载函数,检查勾选框状态
核心逻辑
用户勾选 ✓ + header不为空 → 启用自定义 header(增强模式)
↓
用户未勾选 □ 或 header为空 → 使用原有逻辑(标准模式)
新增功能
- ✅ 界面新增勾选框,明确控制功能开关
- ✅ 文本框配置自定义 HTTP 请求头
- ✅ 默认预设浏览器 User-Agent
- ✅ curl 下载时自动添加完整浏览器 headers
- ✅ wget 下载时支持自定义 header
- ✅ 完全向后兼容,默认禁用不影响现有功能
解决问题
- ✅ 某些订阅服务器要求特定 User-Agent
- ✅ 提升订阅下载成功率
- ✅ 更好地模拟真实浏览器访问
- ✅ 用户可自主选择是否启用该功能
- ✅ 避免对不需要该功能的用户造成困扰
用户体验
- 清晰的开关: 勾选框明确表示功能状态
- 灵活配置: 可随时启用/禁用
- 安全默认: 默认禁用,不改变原有行为
- 即插即用: 勾选后立即生效,无需额外配置
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels