Skip to content

Commit

Permalink
重构框架 提供更多API 无需json&&新增Surge-RULE-SET转换&&修复singbox转换bug
Browse files Browse the repository at this point in the history
  • Loading branch information
elysias123 committed May 11, 2024
1 parent 0905aa8 commit 6cc145b
Show file tree
Hide file tree
Showing 23 changed files with 169 additions and 228 deletions.
Empty file modified .github/workflows/build.yaml
100644 → 100755
Empty file.
Empty file modified LICENSE
100644 → 100755
Empty file.
4 changes: 2 additions & 2 deletions README.md
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
## build

此分支将[rule](./rule)中的 `domain.txt` `domain_regex.txt` 等基础规则转换
此分支将构建[rule](./rule)中的基础规则

插件文档见[script](./script)
转换插件文档见[script](./script)

添加规则文档见[rule](./rule)

Expand Down
20 changes: 0 additions & 20 deletions build.json

This file was deleted.

52 changes: 24 additions & 28 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,37 @@
import json
import importlib
from datetime import datetime


try:
with open("build.json", 'r', encoding="utf-8") as file:
config = json.loads(file.read())
except Exception as e:
print(f"读取json失败: {e}")
sys.exit(1)

global output, domain_file, domain_file, suffix_file, regex_file
current_time = datetime.now()
format_time = current_time.strftime("%Y-%m-%d")

SCRIPT_PATH = os.path.join(os.getcwd(), "script")
RULE_PATH = os.path.join(os.getcwd(), "rule")
OUT_PATH = os.getcwd() + config["out_path"]
domain_file=RULE_PATH + "/" + config["domain_name"]
regex_file=RULE_PATH + "/" + config["regex_name"]
OUT_PATH = os.getcwd() + "/out"
domain_file=RULE_PATH + "/domain.txt"
regex_file=RULE_PATH + "/domain_regex.txt"
ip_file=RULE_PATH + "/ip.txt"

if not os.path.exists(OUT_PATH):
print(f"{OUT_PATH} 目录不存在!")
sys.exit(1)

def WriteFile(name, text):
class RuleList:
def __init__(self, domain_file, regex_file, ip_file):
with open(domain_file, 'r') as file:
self.domain_list = file.readlines()
with open(regex_file, 'r') as file:
self.regex_list = file.readlines()
with open(ip_file, 'r') as file:
self.ip_list = file.readlines()

rule = RuleList(domain_file, regex_file, ip_file)

def WriteFile(name, text, suffix):
try:
for File in config["suffix"]:
if name == File["name"]:
with open(OUT_PATH + "/AWAvenue-Ads-Rule-" + name + File["suffix"], 'w', encoding="utf-8") as file:
title = [File["comment"] + " " + line for line in config["title"].split('\n')]
title = '\n'.join(title)
file.write(title.replace("version", config["version"]).replace("format_time", format_time) + "\n\n")
for line in text:
file.write(line + "\n")
with open(OUT_PATH + "/AWAvenue-Ads-Rule-" + name + suffix, 'w', encoding="utf-8") as file:
for line in text:
file.write(line + "\n")
except Exception as e:
print(f"读取json失败: {e}")
print(f"写入插件:{module_name}执行失败: {e}")

def RunScript():
for filename in os.listdir(SCRIPT_PATH):
Expand All @@ -45,10 +42,9 @@ def RunScript():
full_module_name = f"script.{module_name}"
try:
module = importlib.import_module(full_module_name)
print(f"正在转换:{module_name}")
module_list = module.build(domain_file, regex_file)
WriteFile(module_name, module_list)
except ImportError as e:
module_list, module_suffix = module.build(rule)
WriteFile(module_name, module_list, module_suffix)
except Exception as e:
print(f"转换插件:{module_name}执行失败: {e}")


Expand Down
4 changes: 3 additions & 1 deletion rule/README.md
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@ fork本分支,修改本目录的文件

`domain.txt` 文件为域名列表 一行一个 不会匹配子域名

`domain_regex.txt` 文件为`domain.txt`的正则表达式版本
`domain_regex.txt` 文件为`domain.txt`的正则表达式版本(并不是所有插件都会调用此规则)

`ip.txt` 文件为ip列表(并不是所有插件都会调用此规则)
3 changes: 0 additions & 3 deletions rule/domain.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
1010pic.com
123.56.23.22
182.254.116.116
203.205.137.89
8le8le.com
a0.app.xiaomi.com
aaid.umeng.com
Expand Down
3 changes: 3 additions & 0 deletions rule/ip.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
123.56.23.22
182.254.116.116
203.205.137.89
19 changes: 7 additions & 12 deletions script/AdClose.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,23 +1,18 @@
def format_domain(domain_file):
def format_domain(List):
domain = []
with open(domain_file, 'r') as file:
lines = file.readlines()
for line in lines:
for line in List:
domain_lines = f"{line.strip()}"
domain.append(domain_lines)
return domain


def format_regex(regex_file):
def format_regex(List):
regex = []

with open(regex_file, 'r') as file:
lines = file.readlines()
for line in lines:
for line in List:
regex_lines = f"{line.strip()}"
regex.append(regex_lines)
return regex

def build(domain_file, regex_file):
Adclose_list = format_domain(domain_file) + format_regex(regex_file)
return Adclose_list
def build(rule):
Adclose_list = format_domain(rule.domain_list) + format_regex(rule.regex_list)
return Adclose_list, ".txt"
19 changes: 7 additions & 12 deletions script/Adblock.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,23 +1,18 @@
def format_domain(domain_file):
def format_domain(List):
domain = []
with open(domain_file, 'r') as file:
lines = file.readlines()
for line in lines:
for line in List:
domain_lines = f"||{line.strip()}^"
domain.append(domain_lines)
return domain


def format_regex(regex_file):
def format_regex(List):
regex = []

with open(regex_file, 'r') as file:
lines = file.readlines()
for line in lines:
for line in List:
regex_lines = f"/{line.strip()}/".replace("\.","\\\.").replace("\*","\.\*")
regex.append(regex_lines)
return regex

def build(domain_file, regex_file):
Adblock_list = format_domain(domain_file) + format_regex(regex_file)
return Adblock_list
def build(rule):
Adblock_list = format_domain(rule.domain_list) + format_regex(rule.regex_list)
return Adblock_list, ".txt"
19 changes: 7 additions & 12 deletions script/Adguard.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,23 +1,18 @@
def format_domain(domain_file):
def format_domain(List):
domain = []
with open(domain_file, 'r') as file:
lines = file.readlines()
for line in lines:
for line in List:
domain_lines = f"||{line.strip()}^"
domain.append(domain_lines)
return domain


def format_regex(regex_file):
def format_regex(List):
regex = []

with open(regex_file, 'r') as file:
lines = file.readlines()
for line in lines:
for line in List:
regex_lines = f"/{line.strip()}/".replace("\.","\\\.").replace("\*","\.\*")
regex.append(regex_lines)
return regex

def build(domain_file, regex_file):
Adguard_list = format_domain(domain_file) + format_regex(regex_file)
return Adguard_list
def build(rule):
Adguard_list = format_domain(rule.domain_list) + format_regex(rule.regex_list)
return Adguard_list, ".txt"
26 changes: 14 additions & 12 deletions script/Clash.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@

def format_domain(domain_file):
def format_domain(List):
domain = []
with open(domain_file, 'r') as file:
lines = file.readlines()
for line in lines:
for line in List:
domain_lines = f" - '{line.strip()}'"
domain.append(domain_lines)
return domain

def format_regex(regex_file):
def format_regex(List):
regex = []

with open(regex_file, 'r') as file:
lines = file.readlines()
for line in lines:
for line in List:
regex_lines = f" - '{line.strip()}'".replace("$","").replace("^","")
regex.append(regex_lines)
return regex

def build(domain_file, regex_file):
clash_list = ["payload:"] + format_domain(domain_file) + format_regex(regex_file)
return clash_list
def format_ip(List):
ip = []
for line in List:
ip_lines = f" - '{line.strip()}'".replace("$","").replace("^","")
ip.append(ip_lines)
return ip

def build(rule):
clash_list = ["payload:"] + format_ip(rule.ip_list) + format_domain(rule.domain_list) + format_regex(rule.regex_list)
return clash_list, ".yaml"
11 changes: 4 additions & 7 deletions script/Mosdns_v5.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
import json

def format_domain(domain_file):
def format_domain(List):
domain = []
with open(domain_file, 'r') as file:
lines = file.readlines()

for line in lines:
for line in List:
domain_lines = f"domain:{line.strip()}"
domain.append(domain_lines)
return domain


def build(domain_file, regex_file):
return format_domain(domain_file)
def build(rule):
return format_domain(rule.domain_list), ".txt"
24 changes: 13 additions & 11 deletions script/QuantumultX.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@

def format_domain(domain_file):
def format_domain(List):
domain = []
with open(domain_file, 'r') as file:
lines = file.readlines()
for line in lines:
for line in List:
domain_lines = f"DOMAIN,{line.strip()},reject"
domain.append(domain_lines)
return domain

def format_regex(regex_file):
def format_regex(List):
regex = []

with open(regex_file, 'r') as file:
lines = file.readlines()
for line in lines:
for line in List:
regex_lines = f"DOMAIN-KEYWORD,{line.strip()},reject".replace("$","").replace("^","").replace("*","")
regex.append(regex_lines)
return regex

def build(domain_file, regex_file):
return format_domain(domain_file) + format_regex(regex_file)
def format_ip(List):
ip = []
for line in List:
ip_lines = f"IP-CIDR,{line.strip()},reject"
ip.append(ip_lines)
return ip

def build(rule):
return format_ip(rule.ip_list) + format_domain(rule.domain_list) + format_regex(rule.regex_list), ".list"
29 changes: 17 additions & 12 deletions script/README.md
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,23 +1,28 @@
## 插件开发文档

插件入口函数为`build()`
插件入口函数为`build(rule)`

参考[Clash.py](./Clash.py)

插件返回的list格式参考下面的模板
插件返回的list格式参考:

`Adguard.py`:

```python
["||xxx.com^","||xxx.cc^"]
["||xxx.com^","||xxx.cc^"], ".txt"
```
> 后缀名以及注释符请在build.json中添加 如果不存在则不执行此插件
提供的变量:
> **有两个返回值**
API:
- rule.domain_list(获取域名列表)
- rule.regex_list(获取正则表达式的域名列表)
- rule.ip_list(获取ip列表)

## domain_file
> 获取 rule目录的 domain.txt 路径
> 所有变量均为列表 无需读取文件
## regex_file
>获取 rule目录的 domain_regex.txt 路径
模板:
```
# 主函数并且引入rule(对象)
def build(rule):
list = rule.domain_list + rule.regex_list + rule.ip_list
return list, ".yaml" # 返回处理后的列表和文件后缀名
```
> 输出文件名=插件名
11 changes: 4 additions & 7 deletions script/RouterOS-Adlist.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
import json

def format_domain(domain_file):
def format_domain(List):
domain = ["0.0.0.0 localhost", "::1 localhost", "", ""]
with open(domain_file, 'r') as file:
lines = file.readlines()

for line in lines:
for line in List:
domain_lines = f"0.0.0.0 {line.strip()}"
domain.append(domain_lines)
return domain


def build(domain_file, regex_file):
return format_domain(domain_file)
def build(rule):
return format_domain(rule.domain_list), ".txt"
Loading

0 comments on commit 6cc145b

Please sign in to comment.