11import asyncio
2+ import dataclasses
23from typing import Any , Dict , List , Optional
34
45import aiohttp
@@ -104,7 +105,7 @@ async def get_statistics(self) -> Statistics:
104105 async def get_popup_notice (self ) -> str :
105106 return await self ._request ("GET" , "/auth/popupNotice" )
106107
107- async def get_notice (self ) -> List [ str ] :
108+ async def get_notice (self ) -> str :
108109 return await self ._request ("GET" , "/auth/notice" )
109110
110111 async def get_system_status (self ) -> SystemStatus :
@@ -116,17 +117,17 @@ async def get_user_info(self) -> UserInfo:
116117 data = await self ._request ("GET" , "/auth/user/info" )
117118 return UserInfo (** data )
118119
120+ async def get_frp_token (self ) -> str :
121+ data = await self ._request ("GET" , "/auth/user/frpToken" )
122+ return data .get ("token" ) if isinstance (data , dict ) else data
123+
119124 async def sign (self , captcha_token : str ):
120125 return await self ._request ("POST" , "/auth/user/sign" , {"captchaToken" : captcha_token })
121126
122127 async def get_user_groups (self ) -> List [UserGroup ]:
123128 data = await self ._request ("GET" , "/auth/user/groups" )
124129 return [UserGroup (** g ) for g in data ]
125130
126- async def get_frp_token (self ) -> str :
127- data = await self ._request ("GET" , "/auth/user/frpToken" )
128- return data .get ("frpToken" ) if isinstance (data , dict ) else data
129-
130131 async def reset_token (self , captcha_token : str ):
131132 return await self ._request ("POST" , "/auth/user/tokenReset" , {"captchaToken" : captcha_token })
132133
@@ -170,21 +171,21 @@ async def get_node_list(self) -> List[Node]:
170171 data = await self ._request ("GET" , "/auth/node/list" )
171172 return [Node (** n ) for n in data ]
172173
173- async def get_node_status (self , node_id : int ) -> NodeStatus :
174- data = await self ._request ("GET" , "/auth/node/status" , params = {"nodeId" : node_id })
175- return NodeStatus (** data )
176-
177174 async def get_node_name_list (self ) -> List [NodeNameListItem ]:
178175 data = await self ._request ("GET" , "/auth/node/nameList" )
179176 return [NodeNameListItem (** n ) for n in data ]
180177
178+ async def get_node_status (self ) -> List [NodeStatus ]:
179+ data = await self ._request ("GET" , "/auth/node/status" )
180+ return [NodeStatus (** n ) for n in data ]
181+
181182 async def get_node_token (self , node_id : int ) -> str :
182183 data = await self ._request ("POST" , "/auth/node/secret" , {"nodeId" : node_id })
183184 return data .get ("token" ) if isinstance (data , dict ) else data
184185
185- async def get_free_port (self , node_id : int , proxy_type : str ):
186+ async def get_free_port (self , node_id : int , protocol : str ):
186187 return await self ._request (
187- "GET " , "/auth/node/freePort" , params = {"nodeId" : node_id , "proxyType " : proxy_type }
188+ "POST " , "/auth/node/freePort" , {"nodeId" : node_id , "protocol " : protocol }
188189 )
189190
190191 # --- Ads API ---
@@ -240,7 +241,19 @@ async def get_operation_log_stats(self) -> OperationLogStats:
240241
241242 async def get_create_proxy_data (self ) -> CreateProxyDataResponse :
242243 data = await self ._request ("GET" , "/auth/createProxyData" )
243- return CreateProxyDataResponse (** data )
244+ nodes = []
245+ # 获取 Node 类定义的字段,用于过滤后端返回的冗余字段
246+ node_fields = {f .name for f in dataclasses .fields (Node )}
247+ for n in data ["nodes" ]:
248+ load_percent = n .pop ("loadPercent" , 0 )
249+ # 过滤掉不在 Node 定义中的字段
250+ filtered_n = {k : v for k , v in n .items () if k in node_fields }
251+ node_base = Node (** filtered_n )
252+ nodes .append (NodeWithLoad (** node_base .__dict__ , loadPercent = load_percent ))
253+ groups = [UserGroup (** g ) for g in data ["groups" ]]
254+ return CreateProxyDataResponse (
255+ nodes = nodes , groups = groups , currentGroup = data ["currentGroup" ]
256+ )
244257
245258 # --- CDK API ---
246259 async def redeem_cdk (self , code : str ):
0 commit comments