From d1a9dadbe1b4429007578099416a00282b4f2dd5 Mon Sep 17 00:00:00 2001 From: yuanzhen869 Date: Mon, 23 Mar 2026 15:53:21 +0800 Subject: [PATCH] Sync subset from blackmatrix7/ios_rule_script --- README.md | 7 ++++ scripts/build_singbox_rules.py | 60 ++++++++++++++++++++++++++++++++++ scripts/sync_subset.sh | 13 +++----- 3 files changed, 71 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 19fe019..c9b7558 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,11 @@ - `rule/Surge/ChinaIPs.list` <- `rule/Surge/ChinaIPs/ChinaIPs.list` - `rule/Surge/Proxy.list` <- `rule/Surge/Proxy/Proxy.list` +基于这些 Surge 规则,还会派生出: + +- `rule/Loon/*.list` +- `rule/Clash/*.list` + 同时生成 sing-box 专用规则文件: - `rule/sing-box/ManualBackHome.json` @@ -49,4 +54,6 @@ Gitea Actions 工作流: 这个项目给本地 `surgio` 用作远程规则源: - `https://git.halonice.com/yuanzhen869/ios-rule-script-subset/raw/branch/main/rule/Surge` +- `https://git.halonice.com/yuanzhen869/ios-rule-script-subset/raw/branch/main/rule/Loon` +- `https://git.halonice.com/yuanzhen869/ios-rule-script-subset/raw/branch/main/rule/Clash` - `https://git.halonice.com/yuanzhen869/ios-rule-script-subset/raw/branch/main/rule/sing-box` diff --git a/scripts/build_singbox_rules.py b/scripts/build_singbox_rules.py index 6e10046..ac9c43b 100644 --- a/scripts/build_singbox_rules.py +++ b/scripts/build_singbox_rules.py @@ -6,8 +6,12 @@ from pathlib import Path ROOT = Path(__file__).resolve().parent.parent SURGE_DIR = ROOT / "rule" / "Surge" +LOON_DIR = ROOT / "rule" / "Loon" +CLASH_DIR = ROOT / "rule" / "Clash" SINGBOX_DIR = ROOT / "rule" / "sing-box" +LOON_DIR.mkdir(parents=True, exist_ok=True) +CLASH_DIR.mkdir(parents=True, exist_ok=True) SINGBOX_DIR.mkdir(parents=True, exist_ok=True) UPSTREAM_TARGETS = { @@ -31,6 +35,32 @@ FIELD_MAP = { "PROCESS-NAME": "process_name", } +LOON_SUPPORTED_RULES = { + "DOMAIN-SUFFIX", + "DOMAIN", + "DOMAIN-KEYWORD", + "USER-AGENT", + "URL-REGEX", + "IP-CIDR", + "GEOIP", + "FINAL", +} + +CLASH_SUPPORTED_RULES = { + "DOMAIN-SUFFIX", + "DOMAIN-KEYWORD", + "DOMAIN", + "SRC-IP-CIDR", + "IP-CIDR", + "IP-CIDR6", + "GEOIP", + "DST-PORT", + "SRC-PORT", + "MATCH", + "FINAL", + "PROCESS-NAME", +} + def build_rule_set(entries: dict[str, list[str]]) -> dict: rules = [] @@ -63,6 +93,30 @@ def parse_surge_list(path: Path) -> dict: return build_rule_set(entries) +def convert_for_target(path: Path, target_rules: set[str]) -> list[str]: + out: list[str] = [] + for raw in path.read_text(encoding="utf-8").splitlines(): + line = raw.rstrip() + stripped = line.strip() + if not stripped or stripped.startswith("#"): + out.append(line) + continue + parts = [part.strip() for part in stripped.split(",")] + if len(parts) < 2: + continue + kind = parts[0].upper() + if kind not in target_rules: + continue + if kind == "FINAL": + if target_rules is CLASH_SUPPORTED_RULES: + out.append(line.replace("FINAL,", "MATCH,", 1)) + else: + out.append(line) + continue + out.append(line) + return out + + MANUAL_RULESETS = { "ManualBackHome": {"version": 3, "rules": [{"ip_cidr": ["192.168.10.0/24"]}]}, "ManualReject": {"version": 3, "rules": [{"domain": ["www.axure.com"]}]}, @@ -96,6 +150,12 @@ for name, filename in UPSTREAM_TARGETS.items(): encoding="utf-8", ) + loon_lines = convert_for_target(SURGE_DIR / filename, LOON_SUPPORTED_RULES) + (LOON_DIR / filename).write_text("\n".join(loon_lines).rstrip() + "\n", encoding="utf-8") + + clash_lines = convert_for_target(SURGE_DIR / filename, CLASH_SUPPORTED_RULES) + (CLASH_DIR / filename).write_text("\n".join(clash_lines).rstrip() + "\n", encoding="utf-8") + for name, payload in MANUAL_RULESETS.items(): (SINGBOX_DIR / f"{name}.json").write_text( json.dumps(payload, ensure_ascii=False, indent=2) + "\n", diff --git a/scripts/sync_subset.sh b/scripts/sync_subset.sh index a8358f7..682dcfe 100755 --- a/scripts/sync_subset.sh +++ b/scripts/sync_subset.sh @@ -5,25 +5,20 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" SURGE_DIR="$ROOT_DIR/rule/Surge" SINGBOX_DIR="$ROOT_DIR/rule/sing-box" UPSTREAM_BASE="https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Surge" -GITEA_ENV_FILE="$ROOT_DIR/../gitea/.env" LOCAL_SYNC_ENV_FILE="$ROOT_DIR/.sync.env" -if [[ -f "$GITEA_ENV_FILE" ]]; then - source "$GITEA_ENV_FILE" -fi - if [[ -f "$LOCAL_SYNC_ENV_FILE" ]]; then source "$LOCAL_SYNC_ENV_FILE" fi GITEA_REPO_OWNER="${GITEA_REPO_OWNER:-yuanzhen869}" GITEA_REPO_NAME="${GITEA_REPO_NAME:-ios-rule-script-subset}" -GITEA_SYNC_USERNAME="${GITEA_SYNC_USERNAME:-${GITEA_ADMIN_USERNAME:-yuanzhen869}}" -GITEA_SYNC_EMAIL="${GITEA_SYNC_EMAIL:-${GITEA_ADMIN_EMAIL:-yuanzhen869@gmail.com}}" -GITEA_SYNC_PASSWORD="${GITEA_SYNC_PASSWORD:-${GITEA_SYNC_TOKEN:-${GITEA_ADMIN_PASSWORD:-}}}" +GITEA_SYNC_USERNAME="${GITEA_SYNC_USERNAME:-yuanzhen869}" +GITEA_SYNC_EMAIL="${GITEA_SYNC_EMAIL:-yuanzhen869@gmail.com}" +GITEA_SYNC_PASSWORD="${GITEA_SYNC_PASSWORD:-${GITEA_SYNC_TOKEN:-}}" if [[ -z "${GITEA_SYNC_PASSWORD}" ]]; then - echo "missing push credential: set GITEA_SYNC_TOKEN or GITEA_ADMIN_PASSWORD" >&2 + echo "missing push credential: set GITEA_SYNC_TOKEN" >&2 exit 1 fi