Files
clash-for-linux/scripts/clash_profile_conversion.sh
2026-01-17 20:06:15 +08:00

78 lines
2.5 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
set -euo pipefail
# 作用:
# - 将订阅内容转换成 Clash Meta / Mihomo 可用的完整 YAML 配置
# - 默认使用 subconverter HTTP /sub 接口(最稳:用 -G + --data-urlencode
# - 失败则跳过,不影响主流程
#
# 输入/输出约定:
# - IN_FILE原订阅默认 temp/clash.yaml
# - OUT_FILE转换后的配置默认 temp/clash_config.yaml
#
# 设计原则:
# - 绝不 exit 1失败只 warn 并 exit 0
# - 已是完整 Clash 配置则直接 copy
# - 没有 CLASH_URL原始订阅 URL则不转换subconverter 最稳是 url=...
Server_Dir="${Server_Dir:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
Temp_Dir="${Temp_Dir:-$Server_Dir/temp}"
mkdir -p "$Temp_Dir"
IN_FILE="${IN_FILE:-$Temp_Dir/clash.yaml}"
OUT_FILE="${OUT_FILE:-$Temp_Dir/clash_config.yaml}"
# “更先进”的默认Clash Meta / Mihomo
SUB_TARGET="${SUB_TARGET:-clashmeta}" # 推荐 clashmeta兼容面最广
SUB_URL="${CLASH_URL:-}" # 原始订阅 URL.env 里 export CLASH_URL=...
# 0) 输入不存在就跳过
if [ ! -s "$IN_FILE" ]; then
echo "[WARN] no input file: $IN_FILE"
exit 0
fi
# 1) 如果看起来已经是完整 Clash 配置,就直接用,不转换
# (包含 proxies / proxy-providers / rules / port 等任一关键词即可认为是完整配置)
if grep -qE '^(proxies:|proxy-providers:|mixed-port:|port:|rules:|dns:)' "$IN_FILE"; then
cp -f "$IN_FILE" "$OUT_FILE"
echo "[OK] input already looks like a Clash config -> $OUT_FILE"
exit 0
fi
# 2) subconverter 不可用就跳过
if [ "${SUBCONVERTER_READY:-false}" != "true" ] || [ -z "${SUBCONVERTER_URL:-}" ]; then
echo "[WARN] subconverter not ready, skip conversion"
exit 0
fi
# 3) 没有原始 URL 就不转subconverter 最稳是 url=... 拉取)
if [ -z "${SUB_URL:-}" ]; then
echo "[WARN] CLASH_URL empty, cannot convert via /sub, skip"
exit 0
fi
# 4) 调用 subconverter用 -G + --data-urlencode避免 url 参数里含 ? & 导致 400
# 注意SUB_URL 必须是原始订阅 URL例如 https://.../subscribe?token=xxx
TMP_OUT="${OUT_FILE}.tmp"
rm -f "$TMP_OUT" 2>/dev/null || true
set +e
curl -fsSLG "${SUBCONVERTER_URL}/sub" \
--data-urlencode "target=${SUB_TARGET}" \
--data-urlencode "url=${SUB_URL}" \
-o "${TMP_OUT}"
rc=$?
set -e
if [ "$rc" -ne 0 ] || [ ! -s "$TMP_OUT" ]; then
echo "[WARN] convert failed (rc=${rc}), skip"
rm -f "$TMP_OUT" 2>/dev/null || true
exit 0
fi
mv -f "$TMP_OUT" "$OUT_FILE"
echo "[OK] converted via subconverter -> ${OUT_FILE} (target=${SUB_TARGET})"
true