Premium 버전 · Clash 문서

기능: Script

Script 모드에서 Python3 main(ctx, metadata)로 규칙 일치를 제어하는 방법과 resolve_ip, geoip, rule_providers, IP 해석 요구 사항을 설명합니다.

  • Script
  • metadata
  • resolve_ip
  • geoip
  • rule_providers
Premium 버전

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 script

IP 규칙(예: 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 }>
}