clash-sub-test / app.py
megatrump's picture
修改了 interval
1d668b6
raw
history blame
4.34 kB
import os
import re
import sys
import yaml
import requests
from flask import Flask, Response, request
from urllib.parse import urlencode
from asgiref.wsgi import WsgiToAsgi
app = Flask(__name__)
# 从环境变量中获取密钥
API_KEY = os.environ.get('API_KEY')
SUBSCRIBE_URLS = os.environ.get('SUBSCRIBE_URLS') # 存储真实URL的变量
def subscribe_mixin(content: str) -> str:
"""输入 YAML 字符串,输出转换后的 YAML 字符串
"""
try:
d = yaml.safe_load(content)
my_auto_group_name = "AI Unrestrict"
regex_list = [
re.compile(r"美国", re.IGNORECASE), # 美国 (不区分大小写)
re.compile(r"america", re.IGNORECASE), # america (不区分大小写)
re.compile(r"us", re.IGNORECASE), # us (不区分大小写)
re.compile(r"新加坡", re.IGNORECASE), # 新加坡 (不区分大小写)
re.compile(r"singapore", re.IGNORECASE), # singapore (不区分大小写)
re.compile(r"sg", re.IGNORECASE), # sg (不区分大小写)
re.compile(r"加拿大", re.IGNORECASE), # 加拿大 (不区分大小写)
re.compile(r"canada", re.IGNORECASE), # canada (不区分大小写)
re.compile(r"ca", re.IGNORECASE), # ca (不区分大小写)
]
matching_proxies = [] # 用于存储匹配的代理名称
# 1. 查找并保存符合正则表达式的 proxy name
if "proxies" in d and isinstance(d["proxies"], list):
for proxy in d["proxies"]:
if "name" in proxy:
for regex in regex_list:
if regex.search(proxy["name"]): # 使用 re.search
matching_proxies.append(proxy["name"])
break # 匹配到一个 regex 就跳出循环,避免重复添加
# 2. 创建新的 proxy-group 对象
new_proxy_group = {
"name": my_auto_group_name,
"type": "url-test",
"proxies": matching_proxies,
"url": "http://www.gstatic.com/generate_204",
"interval": 7200
}
# 3. 将新的 proxy-group 添加到 proxy-groups 数组
if "proxy-groups" in d and isinstance(d["proxy-groups"], list):
d["proxy-groups"].append(new_proxy_group)
# 4. 将 myAutoGroupName 添加到第一个 proxy-group 的 "proxies" 列表的最前面
if d["proxy-groups"] and len(d["proxy-groups"]) > 0 and \
"proxies" in d["proxy-groups"][0] and isinstance(d["proxy-groups"][0]["proxies"], list):
d["proxy-groups"][0]["proxies"].insert(0, my_auto_group_name) # 使用 insert(0, ...)
else:
d["proxy-groups"] = [new_proxy_group] # 如果 proxy-groups 不存在,则创建
# 将修改后的字典转换回 YAML 字符串
modified_yaml = yaml.dump(d, allow_unicode=True, indent=2) # 使用 yaml.dump
return modified_yaml
except yaml.YAMLError as e:
print(f"YAML 解析错误:{e}")
return "" # 或者抛出异常,根据你的需求
except Exception as e:
print(f"其他错误:{e}")
return ""
@app.get("/getsub")
def read_subscribe():
# 验证API Key
key = request.args.get('key')
if key != API_KEY:
return {"error": "Unauthorized"}, 401
# 从环境变量获取URL列表
if not SUBSCRIBE_URLS:
return {"error": "SUBSCRIBE_URLS not configured"}, 500
urls = SUBSCRIBE_URLS.split('\n')
cleaned_urls = [url.strip() for url in urls]
new_url = '|'.join(cleaned_urls)
encoded_url = urlencode({
'target': 'clash',
'url': new_url
}) # Correct way to encode the URL
target_url = f"http://127.0.0.1:25500/sub?{encoded_url}"
try:
resp = requests.get(target_url)
resp.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
data = resp.text
data = subscribe_mixin(data)
return Response(data, mimetype='text/yaml')
except requests.exceptions.RequestException as e:
return {"error": str(e)}, 500 # Handle request errors and return an error response
@app.get("/")
def read_root():
return {"hello": 'world'}
asgi_app = WsgiToAsgi(app)