Clash Premium は Python3 ベースのスクリプト機能を実装しており、パケットに適用するポリシーを動的かつ柔軟に選択できます。
単一の Python スクリプトでルール照合エンジン全体を制御することも、ショートカットを定義して通常のルールと併用することもできます。このページでは前者を説明します。後者についてはScript Shortcuts ショートカットを参照してください。
ルール照合エンジン全体を制御する
yaml
mode: Script
# https://lancellc.gitbook.io/clash/clash-config-file/script
script:
code: |
def main(ctx, metadata):
ip = metadata["dst_ip"] = ctx.resolve_ip(metadata["host"])
if ip == "":
return "DIRECT"
code = ctx.geoip(ip)
if code == "LAN" or code == "CN":
return "DIRECT"
return "Proxy" # default policy for requests which are not matched by any other scriptIP ルール(IP-CIDR、GEOIP など)を使う場合は、最初に IP アドレスを手動で解決し、metadata に割り当てる必要があります:
python
def main(ctx, metadata):
# ctx.rule_providers["geoip"].match(metadata) return false
ip = ctx.resolve_ip(metadata["host"])
if ip == "":
return "DIRECT"
metadata["dst_ip"] = ip
# ctx.rule_providers["iprule"].match(metadata) return true
return "Proxy"Metadata と Context のインターフェース定義:
ts
interface Metadata {
type: string // socks5、http
network: string // tcp
host: string
src_ip: string
src_port: string
dst_ip: string
dst_port: string
inbound_port: number
}
interface Context {
resolve_ip: (host: string) => string // ip string
resolve_process_name: (metadata: Metadata) => string
resolve_process_path: (metadata: Metadata) => string
geoip: (ip: string) => string // country code
log: (log: string) => void
proxy_providers: Record<string, Array<{ name: string, alive: boolean, delay: number }>>
rule_providers: Record<string, { match: (metadata: Metadata) => boolean }>
}