@@ -31,8 +31,7 @@ import (
3131func LoadConfigFromEnv () * Config {
3232 config := & Config {
3333 Proxy : ProxyConfig {
34- TunnelURL : constants .QingGuoTunnelURL ,
35- Enabled : false ,
34+ Enabled : false ,
3635 },
3736 }
3837
@@ -50,52 +49,93 @@ func LoadConfigFromEnv() *Config {
5049 return config
5150}
5251
53- // GetTunnelAddress 获取青果网络隧道地址
54- func (c * Config ) GetTunnelAddress () (string , error ) {
52+ // GetProxyAddress 获取青果网络独享代理地址
53+ func (c * Config ) GetProxyAddress () (string , error ) {
5554 if ! c .Proxy .Enabled || c .Proxy .AuthKey == "" || c .Proxy .AuthPwd == "" {
5655 return "" , fmt .Errorf ("代理未启用或认证信息不完整" )
5756 }
5857
5958 client := & http.Client {}
6059
61- // 构建请求参数
60+ // 首先尝试查询现有的代理
61+ server , err := c .queryExistingProxy (client )
62+ if err == nil && server != "" {
63+ c .Proxy .ProxyServer = server
64+ return server , nil
65+ }
66+
67+ // 如果没有现有代理或查询失败,尝试获取新的代理
68+ return c .getNewProxy (client )
69+ }
70+
71+ // queryExistingProxy 查询现有的代理
72+ func (c * Config ) queryExistingProxy (client * http.Client ) (string , error ) {
73+ params := url.Values {}
74+ params .Set ("key" , c .Proxy .AuthKey )
75+ params .Set ("pwd" , c .Proxy .AuthPwd )
76+
77+ resp , err := client .Get (constants .QingGuoExclusiveQueryURL + "?" + params .Encode ())
78+ if err != nil {
79+ return "" , err
80+ }
81+ defer resp .Body .Close ()
82+
83+ var queryResp ExclusiveProxyQueryResponse
84+ if err := json .NewDecoder (resp .Body ).Decode (& queryResp ); err != nil {
85+ return "" , err
86+ }
87+
88+ if queryResp .Code != "SUCCESS" || queryResp .Data == nil || len (queryResp .Data .Tasks ) == 0 {
89+ return "" , fmt .Errorf ("没有现有的代理" )
90+ }
91+
92+ // 使用第一个任务的第一个IP
93+ task := queryResp .Data .Tasks [0 ]
94+ if len (task .IPs ) == 0 {
95+ return "" , fmt .Errorf ("任务中没有可用的IP" )
96+ }
97+
98+ return task .IPs [0 ].Server , nil
99+ }
100+
101+ // getNewProxy 获取新的代理
102+ func (c * Config ) getNewProxy (client * http.Client ) (string , error ) {
62103 params := url.Values {}
63104 params .Set ("key" , c .Proxy .AuthKey )
64105 params .Set ("pwd" , c .Proxy .AuthPwd )
65106
66- // 发送GET请求
67- resp , err := client .Get (c .Proxy .TunnelURL + "?" + params .Encode ())
107+ resp , err := client .Get (constants .QingGuoExclusiveGetURL + "?" + params .Encode ())
68108 if err != nil {
69- return "" , errno .HTTPQueryError .WithMessage ("获取隧道地址失败 " ).WithErr (err )
109+ return "" , errno .HTTPQueryError .WithMessage ("获取代理地址失败 " ).WithErr (err )
70110 }
71111 defer resp .Body .Close ()
72112
73- var tunnelResp TunnelResponse
74- if err := json .NewDecoder (resp .Body ).Decode (& tunnelResp ); err != nil {
75- return "" , errno .HTTPQueryError .WithMessage ("解析隧道地址响应失败 " ).WithErr (err )
113+ var getResp ExclusiveProxyGetResponse
114+ if err := json .NewDecoder (resp .Body ).Decode (& getResp ); err != nil {
115+ return "" , errno .HTTPQueryError .WithMessage ("解析代理地址响应失败 " ).WithErr (err )
76116 }
77117
78- if tunnelResp .Code != "SUCCESS" {
79- return "" , fmt .Errorf ("获取隧道地址失败 ,响应码: %s" , tunnelResp .Code )
118+ if getResp .Code != "SUCCESS" {
119+ return "" , fmt .Errorf ("获取代理地址失败 ,响应码: %s, 消息: %s " , getResp .Code , getResp . Message )
80120 }
81121
82- // 检查是否有可用的隧道数据
83- if len (tunnelResp .Data ) == 0 {
84- return "" , fmt .Errorf ("没有可用的隧道地址 " )
122+ // 检查是否有可用的数据
123+ if getResp . Data == nil || len (getResp .Data . IPs ) == 0 {
124+ return "" , fmt .Errorf ("没有可用的代理地址 " )
85125 }
86126
87- // 使用第一个可用的隧道地址
88- tunnelServer := tunnelResp .Data [0 ].Server
89- if tunnelServer == "" {
90- return "" , fmt .Errorf ("隧道地址为空 " )
127+ // 使用第一个可用的代理地址
128+ proxyServer := getResp .Data . IPs [0 ].Server
129+ if proxyServer == "" {
130+ return "" , fmt .Errorf ("代理地址为空 " )
91131 }
92132
93133 // 更新配置中的代理服务器地址
94- c .Proxy .ProxyServer = tunnelServer
95- return tunnelServer , nil
134+ c .Proxy .ProxyServer = proxyServer
135+ return proxyServer , nil
96136}
97137
98- // GetProxyURL 根据青果网络文档生成代理URL
138+ // GetProxyURL 根据青果网络独享代理文档生成代理URL
99139func (c * Config ) GetProxyURL () (* url.URL , error ) {
100140 if ! c .Proxy .Enabled {
101141 return nil , fmt .Errorf ("代理未启用" )
@@ -105,7 +145,7 @@ func (c *Config) GetProxyURL() (*url.URL, error) {
105145 return nil , fmt .Errorf ("代理配置信息不完整" )
106146 }
107147
108- // 普通模式:每次请求都自动切换IP
148+ // 独享代理模式:使用key作为用户名,pwd作为密码
109149 link := fmt .Sprintf ("http://%s:%s@%s" , c .Proxy .AuthKey , c .Proxy .AuthPwd , c .Proxy .ProxyServer )
110150 return url .Parse (link )
111151}
0 commit comments