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

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -52
app.py CHANGED
@@ -48,20 +48,18 @@ async def fetch_url(url, session, max_retries=5):
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:
@@ -74,9 +72,9 @@ async def extract_and_transform_proxies(input_text):
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 "未找到有效的代理配置"
@@ -85,47 +83,52 @@ async def extract_and_transform_proxies(input_text):
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_portport
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)}"
 
48
 
49
  async def extract_and_transform_proxies(input_text):
50
  try:
51
+ # 首先尝试解析为JSON
52
+ try:
53
+ config = json.loads(input_text)
54
+ # 检查是否是完整的配置文件格式
55
+ if 'outbounds' in config:
56
+ proxies_list = [outbound for outbound in config['outbounds']
57
+ if outbound.get('type') in ['ss', 'trojan', 'hysteria2']]
58
+ else:
59
+ # 如果不是完整配置文件,假设它是代理列表
60
+ proxies_list = config if isinstance(config, list) else [config]
61
+ except json.JSONDecodeError:
62
+ # 如果不是JSON,尝试YAML格式
 
 
63
  try:
64
  data = yaml.safe_load(input_text)
65
  if isinstance(data, dict) and 'proxies' in data:
 
72
  proxies_text = proxies_match.group(1)
73
  proxies_list = yaml.safe_load(proxies_text)
74
  else:
75
+ return "未找到有效的代理配置"
76
  except yaml.YAMLError:
77
+ return "YAML解析错误"
78
 
79
  if not proxies_list:
80
  return "未找到有效的代理配置"
 
83
 
84
  for proxy in proxies_list:
85
  proxy_type = proxy.get('type')
86
+ if proxy_type not in ['ss', 'trojan', 'hysteria2']:
87
+ continue
88
+
89
+ name = proxy.get('tag', '') or proxy.get('name', '')
90
+ name = name.strip()
91
+ server = proxy.get('server', '').strip()
92
+ port = str(proxy.get('server_port', '') or proxy.get('port', '')).strip()
93
+
94
+ parts = [f"{name} = {proxy_type}, {server}, {port}"]
95
+
96
+ if proxy_type == 'ss':
97
+ if 'cipher' in proxy:
98
+ parts.append(f"encrypt-method={proxy['cipher'].strip()}")
99
+ elif 'method' in proxy:
100
+ parts.append(f"encrypt-method={proxy['method'].strip()}")
101
+ if 'password' in proxy:
102
+ parts.append(f"password={proxy['password'].strip()}")
103
+ elif proxy_type in ['trojan', 'hysteria2']:
104
+ if 'password' in proxy:
105
+ parts.append(f"password={proxy['password'].strip()}")
106
 
107
+ # 处理TLS配置
108
+ tls_config = proxy.get('tls', {})
109
+ if isinstance(tls_config, dict):
110
+ if tls_config.get('insecure', False):
111
+ parts.append("skip-cert-verify=true")
112
+ if 'server_name' in tls_config:
113
+ parts.append(f"sni={tls_config['server_name'].strip()}")
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
+ if 'sni' in proxy:
120
+ parts.append(f"sni={proxy['sni'].strip()}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
 
122
+ # 处理TCP Fast Open配置
123
+ if 'tcp_fast_open' in proxy:
124
+ parts.append(f"tfo={str(proxy['tcp_fast_open']).lower()}")
125
+
126
+ if 'udp' in proxy:
127
+ parts.append(f"udp-relay={'true' if proxy['udp'] in [True, 'true', 'True'] else 'false'}")
128
 
129
+ transformed_proxies.append(", ".join(parts))
130
 
131
+ return "\n".join(transformed_proxies) if transformed_proxies else "未找到有效的SS、Trojan或Hysteria2代理配置"
132
  except Exception as e:
133
  print(f"Error in extract_and_transform_proxies: {str(e)}", flush=True)
134
  return f"配置解析错误: {str(e)}"