#!/bin/sh set -eu SUBCONVERTER_BASE="http://127.0.0.1:25500" # 原始机场订阅地址,仅保存在 NAS 本地脚本里,不暴露到最终 YAML。 RAW_SUB_URL='https://2000w.xyz/c/qirkb4vkatdepdfj' # 手机 Clash Meta 专用 ini 模板。 REMOTE_CONFIG_URL='http://192.168.1.1/openclash/local_geosite_geoip_lite_clashmeta_phone.ini' # Funnel 公网地址。 PUBLIC_BASE_URL='https://ds218plus.tailc8a403.ts.net' OUT_DIR="/volume1/docker/subscription_public" MAIN_FILE="${OUT_DIR}/clashmeta-phone.yaml" MAIN_TMP="${MAIN_FILE}.tmp" PROVIDER_NAME="Provider_21FB7B" PROVIDER_FILE="${OUT_DIR}/${PROVIDER_NAME}.yaml" PROVIDER_TMP="${PROVIDER_FILE}.tmp" mkdir -p "$OUT_DIR" urlencode() { python3 -c 'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))' "$1" } ENC_SUB="$(urlencode "$RAW_SUB_URL")" ENC_CONFIG="$(urlencode "$REMOTE_CONFIG_URL")" # 1. 生成主配置:保留 proxy-providers / proxy-groups / rules 结构。 CONVERT_MAIN_URL="${SUBCONVERTER_BASE}/sub?target=clash&url=${ENC_SUB}&config=${ENC_CONFIG}&insert=true&emoji=true&list=false&tfo=false&scv=true&fdn=false&expand=true&sort=false&udp=true&new_name=true" curl -fsSL "$CONVERT_MAIN_URL" -o "$MAIN_TMP" if ! grep -Eq '^(proxy-providers:|proxy-groups:|rules:|mixed-port:|port:|socks-port:)' "$MAIN_TMP"; then echo "Main config does not look like a Clash YAML. Abort." head -n 20 "$MAIN_TMP" || true rm -f "$MAIN_TMP" exit 1 fi # 替换主配置中的原始机场订阅 URL 为 Funnel provider URL。 python3 - "$MAIN_TMP" "$RAW_SUB_URL" "${PUBLIC_BASE_URL}/${PROVIDER_NAME}.yaml" <<'PY' import sys path, old, new = sys.argv[1], sys.argv[2], sys.argv[3] with open(path, "r", encoding="utf-8") as f: s = f.read() s = s.replace(old, new) with open(path, "w", encoding="utf-8") as f: f.write(s) PY # 防止主配置继续泄露原始订阅地址。 if grep -q "$RAW_SUB_URL" "$MAIN_TMP"; then echo "Raw subscription URL still exists in main config. Abort." rm -f "$MAIN_TMP" exit 1 fi # 2. 生成 provider 文件:只包含 proxies。 CONVERT_PROVIDER_URL="${SUBCONVERTER_BASE}/sub?target=clash&url=${ENC_SUB}&insert=true&emoji=true&list=true&tfo=false&scv=true&fdn=false&expand=true&sort=false&udp=true&new_name=true" curl -fsSL "$CONVERT_PROVIDER_URL" -o "$PROVIDER_TMP" if ! grep -q '^proxies:' "$PROVIDER_TMP"; then echo "Provider file does not contain proxies:. Abort." head -n 20 "$PROVIDER_TMP" || true rm -f "$PROVIDER_TMP" exit 1 fi if grep -q "$RAW_SUB_URL" "$PROVIDER_TMP"; then echo "Raw subscription URL exists in provider file. Abort." rm -f "$PROVIDER_TMP" exit 1 fi mv "$MAIN_TMP" "$MAIN_FILE" mv "$PROVIDER_TMP" "$PROVIDER_FILE" echo "Updated:" echo " $MAIN_FILE" echo " $PROVIDER_FILE"