quicktool/singbox/singbox_convert_rules.py

67 lines
2.1 KiB
Python

import json
import re
def convert_to_singbox(input_file, output_file):
with open(input_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
rule_groups = {}
for line in lines:
line = line.strip()
if line.startswith('- '):
parts = line.split(',')
if len(parts) >= 3:
rule_type = parts[0][2:] # Remove '- ' from the start
value = parts[1]
outbound = parts[2]
if (rule_type, outbound) not in rule_groups:
rule_groups[(rule_type, outbound)] = []
rule_groups[(rule_type, outbound)].append(value)
elif len(parts) == 2:
rule_type = parts[0][2:]
if rule_type == 'MATCH':
final_outbound = parts[1]
continue
singbox_rules = []
for (rule_type, outbound), values in rule_groups.items():
if rule_type == 'DOMAIN-SUFFIX':
singbox_rules.append({
"domain_suffix": values,
"outbound": outbound
})
elif rule_type == 'DOMAIN-KEYWORD':
singbox_rules.append({
"domain_keyword": values,
"outbound": outbound
})
elif rule_type == 'DOMAIN':
singbox_rules.append({
"domain": values,
"outbound": outbound
})
elif rule_type == 'IP-CIDR':
singbox_rules.append({
"ip_cidr": values,
"outbound": outbound
})
elif rule_type == 'GEOIP':
singbox_rules.append({
"geoip": values,
"outbound": outbound
})
singbox_config = {
"route": {
"rules": singbox_rules,
"final": final_outbound
}
}
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(singbox_config, f, indent=2, ensure_ascii=False)
# Usage
input_file = 'wget_clash_64.txt'
output_file = 'singbox_rules.json'
convert_to_singbox(input_file, output_file)