sfun commited on
Commit
62fd134
·
verified ·
1 Parent(s): de35157

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +62 -70
app.py CHANGED
@@ -48,18 +48,21 @@ async def fetch_url(url, session, max_retries=5):
48
 
49
  async def extract_and_transform_proxies(input_text):
50
  try:
51
- # 首先尝试解析为JSON格式
52
- try:
53
- # 检查是否是JSON数组格式
54
- if input_text.strip().startswith('['):
55
- proxies_list = json.loads(input_text)
56
- # 检查是否是多个JSON对象
57
- elif input_text.strip().startswith('{'):
58
- # 将多个JSON对象转换为数组
59
- input_text = f"[{input_text}]"
60
  proxies_list = json.loads(input_text)
61
- else:
62
- # 如果不是JSON格式,继续尝试YAML格式
 
 
 
 
63
  data = yaml.safe_load(input_text)
64
  if isinstance(data, dict) and 'proxies' in data:
65
  proxies_list = data['proxies']
@@ -71,72 +74,61 @@ async def extract_and_transform_proxies(input_text):
71
  proxies_text = proxies_match.group(1)
72
  proxies_list = yaml.safe_load(proxies_text)
73
  else:
74
- return "未找到有效的代理配置"
75
- except json.JSONDecodeError:
76
- # 如果JSON解析失败,继续使用YAML解析
77
- data = yaml.safe_load(input_text)
78
- if isinstance(data, dict) and 'proxies' in data:
79
- proxies_list = data['proxies']
80
- elif isinstance(data, list):
81
- proxies_list = data
82
- else:
83
- proxies_match = re.search(r'proxies:\s*\n((?:[-\s]*{.*\n?)*)', input_text, re.MULTILINE)
84
- if proxies_match:
85
- proxies_text = proxies_match.group(1)
86
- proxies_list = yaml.safe_load(proxies_text)
87
- else:
88
- return "未找到有效的代理配置"
89
- except yaml.YAMLError:
90
- return "YAML解析错误"
91
 
92
- if not proxies_list:
93
- return "未找到有效的代理配置"
94
 
95
- transformed_proxies = []
96
 
97
- for proxy in proxies_list:
98
- proxy_type = proxy.get('type')
99
- if proxy_type in ['ss', 'trojan', 'hysteria2']:
100
- # 获取名称,优先使用tag字段
101
- name = proxy.get('tag', '') or proxy.get('name', '')
102
- name = name.strip()
103
-
104
- server = proxy.get('server', '').strip()
105
- # 处理端口,可能是server_port或port
106
- port = str(proxy.get('server_port', '') or proxy.get('port', '')).strip()
107
-
108
- parts = [f"{name} = {proxy_type}, {server}, {port}"]
109
-
110
- if proxy_type == 'ss':
111
- if 'cipher' in proxy:
112
- parts.append(f"encrypt-method={proxy['cipher'].strip()}")
113
- if 'password' in proxy:
114
- parts.append(f"password={proxy['password'].strip()}")
115
- elif proxy_type in ['trojan', 'hysteria2']:
116
- if 'password' in proxy:
117
- parts.append(f"password={proxy['password'].strip()}")
118
- if 'sni' in proxy:
119
- parts.append(f"sni={proxy['sni'].strip()}")
120
 
121
- # 处理TLS配置
122
- if 'tls' in proxy and isinstance(proxy['tls'], dict):
123
- if proxy['tls'].get('insecure', False):
124
- parts.append("skip-cert-verify=true")
125
- elif 'skip-cert-verify' in proxy:
126
- parts.append(f"skip-cert-verify={str(proxy['skip-cert-verify']).lower()}")
127
- elif proxy_type == 'hysteria2':
128
- parts.append(f"skip-cert-verify=true")
129
 
130
- # 处理TCP Fast Open配置
131
- if 'tcp_fast_open' in proxy:
132
- parts.append(f"tfo={str(proxy['tcp_fast_open']).lower()}")
133
-
134
- if 'udp' in proxy:
135
- parts.append(f"udp-relay={'true' if proxy['udp'] in [True, 'true', 'True'] else 'false'}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
 
137
- transformed_proxies.append(", ".join(parts))
138
 
139
- return "\n".join(transformed_proxies) if transformed_proxies else "未找到有效的代理配置"
 
 
 
140
 
141
  def get_client_ip(request):
142
  headers_to_check = [
 
48
 
49
  async def extract_and_transform_proxies(input_text):
50
  try:
51
+ # 首先尝试处理特殊的JSON格式
52
+ if input_text.strip().startswith('{"type"'):
53
+ # 处理多个相邻的JSON对象
54
+ # 将它们用逗号分隔并包装在数组中
55
+ input_text = f"[{input_text}]"
56
+ # 替换相邻的JSON对象之间的}{为},{
57
+ input_text = input_text.replace('},{', '},{')
58
+ try:
 
59
  proxies_list = json.loads(input_text)
60
+ except json.JSONDecodeError:
61
+ # 如果JSON解析失败,尝试其他格式
62
+ proxies_list = None
63
+ else:
64
+ # 尝试常规的YAML格式
65
+ try:
66
  data = yaml.safe_load(input_text)
67
  if isinstance(data, dict) and 'proxies' in data:
68
  proxies_list = data['proxies']
 
74
  proxies_text = proxies_match.group(1)
75
  proxies_list = yaml.safe_load(proxies_text)
76
  else:
77
+ proxies_list = None
78
+ except yaml.YAMLError:
79
+ proxies_list = None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
 
81
+ if not proxies_list:
82
+ return "未找到有效的代理配置"
83
 
84
+ transformed_proxies = []
85
 
86
+ for proxy in proxies_list:
87
+ proxy_type = proxy.get('type')
88
+ if proxy_type in ['ss', 'trojan', 'hysteria2']:
89
+ # 获取名称,优先使用tag字段
90
+ name = proxy.get('tag', '') or proxy.get('name', '')
91
+ name = name.strip()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
 
93
+ server = proxy.get('server', '').strip()
94
+ # 处理端口,可能是server_port或port
95
+ port = str(proxy.get('server_port', '') or proxy.get('port', '')).strip()
 
 
 
 
 
96
 
97
+ parts = [f"{name} = {proxy_type}, {server}, {port}"]
98
+
99
+ if proxy_type == 'ss':
100
+ if 'cipher' in proxy:
101
+ parts.append(f"encrypt-method={proxy['cipher'].strip()}")
102
+ if 'password' in proxy:
103
+ parts.append(f"password={proxy['password'].strip()}")
104
+ elif proxy_type in ['trojan', 'hysteria2']:
105
+ if 'password' in proxy:
106
+ parts.append(f"password={proxy['password'].strip()}")
107
+ if 'sni' in proxy:
108
+ parts.append(f"sni={proxy['sni'].strip()}")
109
+
110
+ # 处理TLS配置
111
+ if 'tls' in proxy and isinstance(proxy['tls'], dict):
112
+ if proxy['tls'].get('insecure', False):
113
+ parts.append("skip-cert-verify=true")
114
+ elif 'skip-cert-verify' in proxy:
115
+ parts.append(f"skip-cert-verify={str(proxy['skip-cert-verify']).lower()}")
116
+ elif proxy_type == 'hysteria2':
117
+ parts.append(f"skip-cert-verify=true")
118
+
119
+ # 处理TCP Fast Open配置
120
+ if 'tcp_fast_open' in proxy:
121
+ parts.append(f"tfo={str(proxy['tcp_fast_open']).lower()}")
122
+
123
+ if 'udp' in proxy:
124
+ parts.append(f"udp-relay={'true' if proxy['udp'] in [True, 'true', 'True'] else 'false'}")
125
 
126
+ transformed_proxies.append(", ".join(parts))
127
 
128
+ return "\n".join(transformed_proxies) if transformed_proxies else "未找到有效的代理配置"
129
+ except Exception as e:
130
+ print(f"Error in extract_and_transform_proxies: {str(e)}", flush=True)
131
+ return f"配置解析错误: {str(e)}"
132
 
133
  def get_client_ip(request):
134
  headers_to_check = [