Update getTagProxyInfoToOpenwrtFormat.py

master
wangsiyuan 2024-10-01 00:57:24 +08:00
parent 5fd8552653
commit 8cd306af56
1 changed files with 55 additions and 13 deletions

View File

@ -14,31 +14,70 @@ def base64_decode(encoded_str):
def get_subscription(url):
response = requests.get(url)
if response.status_code == 200:
print("订阅数据获取成功")
return response.text
else:
raise Exception(f"无法获取订阅数据: HTTP 状态码 {response.status_code}")
# 解析订阅内容
# 解析订阅内容,返回明文格式
def parse_subscription(subscription):
decoded_data = base64_decode(subscription)
proxy_list = decoded_data.split('\n')
return [proxy for proxy in proxy_list if proxy]
decoded_data = base64_decode(subscription) # 解码Base64后的订阅内容
proxy_list = decoded_data.split('\n') # 分割成代理列表
proxy_list = [proxy for proxy in proxy_list if proxy] # 过滤掉空白行
parsed_proxies = []
for ss_url in proxy_list:
if ss_url.startswith("ss://"):
base_str = ss_url[5:] # 去掉 'ss://'
# 解码Base64(加密方式:密码)
encryption_and_password_encoded = base_str.split("@")[0]
encryption_and_password = base64_decode(encryption_and_password_encoded)
encryption_method, password = encryption_and_password.split(":")
# 解析服务器地址和端口
server_info = base_str.split("@")[1].split("/?")[0]
server, port = server_info.split(":")
# 解析插件信息
plugin_str = urllib.parse.unquote(base_str.split("/?")[1].split("#")[0])
plugin_params = {}
plugin_parts = plugin_str.split(";")
for part in plugin_parts:
if "=" in part:
key, value = part.split("=")
plugin_params[key] = value
# 解析备注
alias_encoded = base_str.split("#")[1].rstrip("\r")
alias = urllib.parse.unquote(alias_encoded)
# 生成明文格式
parsed_ss_url = f"ss://{encryption_method + ':' + password}@{server}:{port}/?plugin={plugin_params.get('plugin', '')};obfs={plugin_params.get('obfs', '')};obfs-host={plugin_params.get('obfs-host', '')}#{alias}"
parsed_proxies.append(parsed_ss_url)
return parsed_proxies
# 过滤香港、新加坡和美国节点
def filter_proxies_by_region(ss_url_list):
def filter_proxies_by_region(ss_url_list, regions_list):
filtered_proxies = []
for ss_url in ss_url_list:
if any(region in ss_url for region in ['香港', '新加坡', '美国']):
# print(f"ss_url: {ss_url}")
# 检查节点名是否包含特定地区关键字
if any(region in ss_url for region in regions_list):
filtered_proxies.append(ss_url)
return filtered_proxies
# 解析 SS 链接,提取信息
def parse_ss_url(ss_url):
print("ss_url:", ss_url)
base_str = ss_url[5:] # 移除 'ss://'
encryption_and_password = base64_decode(base_str.split("@")[0])
encryption_and_password = base_str.split("@")[0]
encryption_method, password = encryption_and_password.split(":")
server_info = base_str.split("@")[1].split("/?")[0]
@ -53,8 +92,9 @@ def parse_ss_url(ss_url):
key, value = part.split("=")
plugin_params[key] = value
alias = urllib.parse.unquote(base_str.split("#")[1].rstrip("\r"))
# 解码别名部分
alias_cache = base_str.split("#")[1].rstrip("\r")
alias = alias_cache[3:]
return {
"alias": alias,
"server": server,
@ -69,6 +109,7 @@ def parse_ss_url(ss_url):
# 生成配置文件
def generate_config(proxy_info, local_port=1234):
config = f"""
config servers
option switch_enable '0'
option type 'ss'
option alias '{proxy_info['alias']}'
@ -92,12 +133,12 @@ def save_to_file(configs, file_name):
# 主函数
def convert_subscription_to_config(subscription_url):
def convert_subscription_to_config(subscription_url, regions_list):
subscription_data = get_subscription(subscription_url)
ss_url_list = parse_subscription(subscription_data)
# 过滤出符合要求的节点
filtered_proxies = filter_proxies_by_region(ss_url_list)
filtered_proxies = filter_proxies_by_region(ss_url_list, regions_list)
# 解析并生成配置
configs = []
@ -107,12 +148,13 @@ def convert_subscription_to_config(subscription_url):
configs.append(config)
# 保存配置到文件
save_to_file(configs, 'config_servers.conf')
save_to_file(configs, 'tag.conf')
if __name__ == '__main__':
# 订阅地址
subscription_url = "https://link.nobodys.uk/api/v1/client/subscribe?token=26d553424da6d84dccb20dd05dc844c0"
regions_list = ['香港', '新加坡', '美国']
# 转换并保存配置
convert_subscription_to_config(subscription_url)
convert_subscription_to_config(subscription_url, regions_list)