vernesong / OpenClash

A Clash Client For OpenWrt
MIT License
16.63k stars 3.07k forks source link

自定义规则加入Script相关问题请教 #2021

Closed secondpaul closed 2 years ago

secondpaul commented 2 years ago

在自定义规则里面添加以下代码

Script: 
  code: |
     directkeywordlist = ["yinfans"]
     for directkeyword in directkeywordlist:
       if directkeyword in metadata["host"]:
         ctx.log('[Script] matched keyword %s use direct' % directkeyword)
         return "DIRECT"

发现配置文件管理-配置文件编辑-OPENCLASH修改后用于启动的配置文件没有看到有新加入的Script规则,运行日志 2022-02-04 02:04:11 第三步: 修改配置文件... 之后出现错误

2022-02-04 02:04:14 错误:设置自定义规则失败,【undefined method `merge!' for "def main(ctx, metadata):\n    ruleset_action = {\"Reject\": \"REJECT\",\n        \"Special\": \"DIRECT\",\n        \"Netflix\": \"GlobalMedia\",\n        \"Spotify\": \"GlobalMedia\",\n        \"YouTube\": \"GlobalMedia\",\n        \"Disney Plus\": \"GlobalMedia\",\n        \"Bilibili\": \"DIRECT\",\n        \"IQ\": \"DIRECT\",\n        \"IQIYI\": \"DIRECT\",\n        \"Letv\": \"DIRECT\",\n        \"Netease Music\": \"DIRECT\",\n        \"Tencent Video\": \"DIRECT\",\n        \"Youku\": \"DIRECT\",\n        \"WeTV\": \"DIRECT\",\n        \"ABC\": \"GlobalMedia\",\n        \"Abema TV\": \"GlobalMedia\",\n        \"Amazon\": \"GlobalMedia\",\n        \"Apple News\": \"GlobalMedia\",\n        \"Apple TV\": \"GlobalMedia\",\n        \"Bahamut\": \"GlobalMedia\",\n        \"BBC iPlayer\": \"GlobalMedia\",\n        \"DAZN\": \"GlobalMedia\",\n        \"Discovery Plus\": \"GlobalMedia\",\n        \"encoreTVB\": \"GlobalMedia\",\n        \"Fox Now\": \"GlobalMedia\",\n        \"Fox+\": \"GlobalMedia\",\n        \"HBO Go\": \"GlobalMedia\",\n        \"HBO Max\": \"GlobalMedia\",\n        \"Hulu Japan\": \"GlobalMedia\",\n        \"Hulu\": \"GlobalMedia\",\n        \"Japonx\": \"GlobalMedia\",\n        \"JOOX\": \"GlobalMedia\",\n        \"KKBOX\": \"GlobalMedia\",\n        \"KKTV\": \"GlobalMedia\",\n        \"Line TV\": \"GlobalMedia\",\n        \"myTV SUPER\": \"GlobalMedia\",\n        \"Pandora\": \"GlobalMedia\",\n        \"PBS\": \"GlobalMedia\",\n        \"Pornhub\": \"GlobalMedia\",\n        \"Soundcloud\": \"GlobalMedia\",\n        \"ViuTV\": \"GlobalMedia\",\n        \"Telegram\": \"PROXY\",\n        \"Steam\": \"GlobalMedia\",\n        \"Speedtest\": \"DIRECT\",\n        \"PayPal\": \"PROXY\",\n        \"Microsoft\": \"PROXY\",\n        \"Apple\": \"Apple\",\n        \"Google FCM\": \"PROXY\",\n        \"Scholar\": \"PROXY\",\n        \"PROXY\": \"PROXY\",\n        \"Domestic\": \"DIRECT\",\n        \"Domestic IPs\": \"DIRECT\",\n        \"LAN\": \"DIRECT\"\n      }\n\n    port = int(metadata[\"dst_port\"])\n\n    if metadata[\"network\"] == \"UDP\":\n        if port == 443:\n            ctx.log('[Script] matched QUIC traffic use reject')\n            return \"REJECT\"\n\n    port_list = [21, 22, 23, 53, 80, 123, 143, 194, 443, 465, 587, 853, 993, 995, 998, 2052, 2053, 2082, 2083, 2086, 2095, 2096, 5222, 5228, 5229, 5230, 8080, 8443, 8880, 8888, 8889]\n    if port not in port_list:\n        ctx.log('[Script] not common port use direct')\n        return \"DIRECT\"\n\n    if metadata[\"dst_ip\"] == \"\":\n        metadata[\"dst_ip\"] = ctx.resolve_ip(metadata[\"host\"])\n\n    for ruleset in ruleset_action:\n        if ctx.rule_providers[ruleset].match(metadata):\n            return ruleset_action[ruleset]\n\n    if metadata[\"dst_ip\"] == \"\":\n        return \"DIRECT\"\n\n    code = ctx.geoip(metadata[\"dst_ip\"])\n    if code == \"CN\":\n        ctx.log('[Script] Geoip CN')\n        return \"DIRECT\"\n\n    ctx.log('[Script] FINAL')\n    return \"Final\"\n":String】

这个undefined method 'merge!'并不是很理解,是我环境问题还是我代码有错,求助大神!

vernesong commented 2 years ago
script:
  code: |
    def main(ctx, metadata):
        directkeywordlist = ["baidu"]
        for directkeyword in directkeywordlist:
          if directkeyword in metadata["host"]:
            ctx.log('[Script] matched keyword %s use direct' % directkeyword)
            return "DIRECT"

注意缩进要与配置文件中已经存在的对齐

secondpaul commented 2 years ago

感谢作者大大,终于成功了。现在还想了解一下shortcut的用法,是在RULE模式下使用呢还是SCRIPT模式呢?

vernesong commented 2 years ago

rule