vernesong/OpenClash

[Bug] script脚本怎么书写

paperbluster opened this issue · 4 comments

Verify Steps

  • Tracker 我已经在 Issue Tracker 中找过我要提出的问题
  • Branch 我知道 OpenClash 的 Dev 分支切换开关位于插件设置-版本更新中,或者我会手动下载并安装 Dev 分支的 OpenClash
  • Latest 我已经使用最新 Dev 版本测试过,问题依旧存在
  • Relevant 我知道 OpenClash 与 内核(Core)、控制面板(Dashboard)、在线订阅转换(Subconverter)等项目之间无直接关系,仅相互调用
  • Definite 这确实是 OpenClash 出现的问题
  • Contributors 我有能力协助 OpenClash 开发并解决此问题
  • Meaningless 我提交的是无意义的催促更新或修复请求

OpenClash Version

v0.46.014-beta

Bug on Environment

Official OpenWrt

OpenWrt Version

OpenWrt R24.8.1

Bug on Platform

Linux-arm64

Describe the Bug

自定义脚本我自己写了一个python方法试图自己实现调用外部的**大陆域名服务,通过udp形式来调用,但是似乎没有起作用,主要是服务器那边没有日志表面没有调用,但是openclash也没有报错,所以不清楚是脚本写错了还是啥

To Reproduce

在自定义规则-优先匹配里加上如下内容

script:

shortcuts:

Notice: The core timezone is UTC

CST 20:00-24:00 = time.now().hour > 12 and time.now().hour < 16

内核时区为UTC,故以下time.now()函数的取值需要根据本地时区进行转换

北京时间(CST) 20:00-24:00 = time.now().hour > 12 and time.now().hour < 16

quic: network == 'udp' and dst_port == 443 and (geoip(resolve_ip(host)) != 'CN' or geoip(dst_ip) != 'CN')

time-limit: in_cidr(src_ip,'192.168.1.2/32') and time.now().hour < 20 or time.now().hour > 21

time-limit: src_ip == '192.168.1.2' and time.now().hour < 20 or time.now().hour > 21

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"

code: |
def main(ctx, metadata):
import socket
host = metadata["host"]
server_ip = "127.0.0.1"
server_port = 5779
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
message = host.encode("iso8859-1")
sock.settimeout(5)
sock.sendto(message, (server_ip, server_port))
response, _ = sock.recvfrom(1024) # Buffer size is 1024 bytes
res = response.decode("iso8859-1")
if res == "1":
ctx.log('[Script] matched keyword %s use direct' % directkeyword)
return "DIRECT"
except Exception as e:
ctx.log("iso8859-1")
pass
finally:
sock.close()

rules:
##- SCRIPT,quic,REJECT #shortcuts rule
##- SCRIPT,time-limit,REJECT #shortcuts rule

##- PROCESS-NAME,curl,DIRECT #匹配路由自身进程(curl直连)
##- DOMAIN-SUFFIX,google.com,Proxy #匹配域名后缀(交由Proxy代理服务器组)
##- DOMAIN-KEYWORD,google,Proxy #匹配域名关键字(交由Proxy代理服务器组)
##- DOMAIN,google.com,Proxy #匹配域名(交由Proxy代理服务器组)
##- DOMAIN-SUFFIX,ad.com,REJECT #匹配域名后缀(拒绝)
##- IP-CIDR,127.0.0.0/8,DIRECT #匹配数据目标IP(直连)
##- SRC-IP-CIDR,192.168.1.201/32,DIRECT #匹配数据发起IP(直连)
##- DST-PORT,80,DIRECT #匹配数据目标端口(直连)
##- SRC-PORT,7777,DIRECT #匹配数据源端口(直连)

##排序在上的规则优先生效,如添加(去除规则前的#号):
##IP段:192.168.1.2-192.168.1.200 直连
##- SRC-IP-CIDR,192.168.1.2/31,DIRECT
##- SRC-IP-CIDR,192.168.1.4/30,DIRECT
##- SRC-IP-CIDR,192.168.1.8/29,DIRECT
##- SRC-IP-CIDR,192.168.1.16/28,DIRECT
##- SRC-IP-CIDR,192.168.1.32/27,DIRECT
##- SRC-IP-CIDR,192.168.1.64/26,DIRECT
##- SRC-IP-CIDR,192.168.1.128/26,DIRECT
##- SRC-IP-CIDR,192.168.1.192/29,DIRECT
##- SRC-IP-CIDR,192.168.1.200/32,DIRECT

##IP段:192.168.1.202-192.168.1.255 直连
##- SRC-IP-CIDR,192.168.1.202/31,DIRECT
##- SRC-IP-CIDR,192.168.1.204/30,DIRECT
##- SRC-IP-CIDR,192.168.1.208/28,DIRECT
##- SRC-IP-CIDR,192.168.1.224/27,DIRECT

##此时IP为192.168.1.1和192.168.1.201的客户端流量走代理(策略),其余客户端不走代理
##因为Fake-IP模式下,IP地址为192.168.1.1的路由器自身流量可走代理(策略),所以需要排除

##仅设置路由器自身直连:
##- SRC-IP-CIDR,192.168.1.1/32,DIRECT
##- SRC-IP-CIDR,198.18.0.1/32,DIRECT

##DDNS
##- DOMAIN-SUFFIX,checkip.dyndns.org,DIRECT
##- DOMAIN-SUFFIX,checkipv6.dyndns.org,DIRECT
##- DOMAIN-SUFFIX,checkip.synology.com,DIRECT
##- DOMAIN-SUFFIX,ifconfig.co,DIRECT
##- DOMAIN-SUFFIX,api.myip.com,DIRECT
##- DOMAIN-SUFFIX,ip-api.com,DIRECT
##- DOMAIN-SUFFIX,ipapi.co,DIRECT
##- DOMAIN-SUFFIX,ip6.seeip.org,DIRECT
##- DOMAIN-SUFFIX,members.3322.org,DIRECT

##在线IP段转CIDR地址:http://ip2cidr.com

OpenClash Log

没有看到日志有与之相关内容

OpenClash Config

No response

Expected Behavior

期望能判断如何知道自己写的python脚本是否有被执行以及执行结果如何

Additional Context

No response

script:

shortcuts:

Notice: The core timezone is UTC

CST 20:00-24:00 = time.now().hour > 12 and time.now().hour < 16

内核时区为UTC,故以下time.now()函数的取值需要根据本地时区进行转换

北京时间(CST) 20:00-24:00 = time.now().hour > 12 and time.now().hour < 16

quic: network == 'udp' and dst_port == 443 and (geoip(resolve_ip(host)) != 'CN' or geoip(dst_ip) != 'CN')

time-limit: in_cidr(src_ip,'192.168.1.2/32') and time.now().hour < 20 or time.now().hour > 21

time-limit: src_ip == '192.168.1.2' and time.now().hour < 20 or time.now().hour > 21

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"

code: |
def main(ctx, metadata):
import socket
host = metadata["host"]
server_ip = "127.0.0.1"
server_port = 5779
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
message = host.encode("iso8859-1")
sock.settimeout(5)
sock.sendto(message, (server_ip, server_port))
response, _ = sock.recvfrom(1024) # Buffer size is 1024 bytes
res = response.decode("iso8859-1")
if res == "1":
ctx.log('[Script] matched keyword %s use direct' % directkeyword)
return "DIRECT"
except Exception as e:
ctx.log("iso8859-1")
pass
finally:
sock.close()

rules:
##- SCRIPT,quic,REJECT #shortcuts rule
##- SCRIPT,time-limit,REJECT #shortcuts rule

##- PROCESS-NAME,curl,DIRECT #匹配路由自身进程(curl直连)
##- DOMAIN-SUFFIX,google.com,Proxy #匹配域名后缀(交由Proxy代理服务器组)
##- DOMAIN-KEYWORD,google,Proxy #匹配域名关键字(交由Proxy代理服务器组)
##- DOMAIN,google.com,Proxy #匹配域名(交由Proxy代理服务器组)
##- DOMAIN-SUFFIX,ad.com,REJECT #匹配域名后缀(拒绝)
##- IP-CIDR,127.0.0.0/8,DIRECT #匹配数据目标IP(直连)
##- SRC-IP-CIDR,192.168.1.201/32,DIRECT #匹配数据发起IP(直连)
##- DST-PORT,80,DIRECT #匹配数据目标端口(直连)
##- SRC-PORT,7777,DIRECT #匹配数据源端口(直连)

##排序在上的规则优先生效,如添加(去除规则前的#号):
##IP段:192.168.1.2-192.168.1.200 直连
##- SRC-IP-CIDR,192.168.1.2/31,DIRECT
##- SRC-IP-CIDR,192.168.1.4/30,DIRECT
##- SRC-IP-CIDR,192.168.1.8/29,DIRECT
##- SRC-IP-CIDR,192.168.1.16/28,DIRECT
##- SRC-IP-CIDR,192.168.1.32/27,DIRECT
##- SRC-IP-CIDR,192.168.1.64/26,DIRECT
##- SRC-IP-CIDR,192.168.1.128/26,DIRECT
##- SRC-IP-CIDR,192.168.1.192/29,DIRECT
##- SRC-IP-CIDR,192.168.1.200/32,DIRECT

##IP段:192.168.1.202-192.168.1.255 直连
##- SRC-IP-CIDR,192.168.1.202/31,DIRECT
##- SRC-IP-CIDR,192.168.1.204/30,DIRECT
##- SRC-IP-CIDR,192.168.1.208/28,DIRECT
##- SRC-IP-CIDR,192.168.1.224/27,DIRECT

##此时IP为192.168.1.1和192.168.1.201的客户端流量走代理(策略),其余客户端不走代理
##因为Fake-IP模式下,IP地址为192.168.1.1的路由器自身流量可走代理(策略),所以需要排除

##仅设置路由器自身直连:
##- SRC-IP-CIDR,192.168.1.1/32,DIRECT
##- SRC-IP-CIDR,198.18.0.1/32,DIRECT

##DDNS
##- DOMAIN-SUFFIX,checkip.dyndns.org,DIRECT
##- DOMAIN-SUFFIX,checkipv6.dyndns.org,DIRECT
##- DOMAIN-SUFFIX,checkip.synology.com,DIRECT
##- DOMAIN-SUFFIX,ifconfig.co,DIRECT
##- DOMAIN-SUFFIX,api.myip.com,DIRECT
##- DOMAIN-SUFFIX,ip-api.com,DIRECT
##- DOMAIN-SUFFIX,ipapi.co,DIRECT
##- DOMAIN-SUFFIX,ip6.seeip.org,DIRECT
##- DOMAIN-SUFFIX,members.3322.org,DIRECT

##在线IP段转CIDR地址:http://ip2cidr.com

新版会删了,不再支持

新版会删了,不再支持

太可惜了,我其实挺想用这个功能的