代码拉取完成,页面将自动刷新
package fisher
import (
"context"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"time"
"gitee.com/cfh008/runutils"
)
// 先对 json 格式进行 struct 结构定义
type ProxyInfo struct {
IP string `json:"ip"`
Port int `json:"port"`
}
type ProxyResponse struct {
Code int `json:"code"`
Data []ProxyInfo `json:"data"`
Msg string `json:"msg"`
Success bool `json:"success"`
}
// 获取一组代理地址信息
func GetProxyInfo(ctx context.Context, url string) (ret []ProxyInfo, err error) {
// req, _ := http.NewRequest("GET", url, nil)
// req = req.WithContext(ctx)
req, newErr := http.NewRequestWithContext(ctx, "GET", url, nil)
if newErr != nil {
return ret, err
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return ret, err
}
defer resp.Body.Close()
var rtnData ProxyResponse
//返回的状态码
bodyContent, _ := io.ReadAll(resp.Body)
if err = json.Unmarshal(bodyContent, &rtnData); err == nil {
if rtnData.Code == 0 {
ret = rtnData.Data
return ret, err
} else {
newErr = errors.New(rtnData.Msg)
return ret, newErr
}
// fmt.Printf("target: %v\n", ret)
}
return ret, err
}
type ConvertFunc func(obj ProxyInfo) (result string)
func GetSocks5ProxyUrl(obj ProxyInfo) (result string) {
result = fmt.Sprintf("SOCKS5://%v:%v", obj.IP, obj.Port)
return
}
func GetProxyAddressString(obj ProxyInfo) (result string) {
result = fmt.Sprintf("%v:%v", obj.IP, obj.Port)
return
}
// 获取一组SOCKS5代理地址
func GetProxyArrayWithConvertFunc(ctx context.Context, url string, convertFunc ConvertFunc) (rtn []string, err error) {
const initCap = 32
cntButt := 3
cnt := 0
for {
proxyArray, doErr := GetProxyInfo(ctx, url)
if doErr == nil {
rtn = make([]string, 0, initCap)
for _, item := range proxyArray {
url := convertFunc(item)
rtn = append(rtn, url)
}
// fmt.Printf("proxy: %v.\n", rtn)
err = nil
break
} else {
// 至少要等待1秒以上才能重新请求,避免被服务器拒绝
err = fmt.Errorf("%v call GetProxyInfo failed with error %v", runutils.RunFuncName(), doErr)
time.Sleep(2 * time.Second)
}
cnt += 1
if cnt >= cntButt {
break
}
}
return
}
// 获取一组SOCKS5代理地址
func GetSocks5ProxyArray(ctx context.Context, url string) (rtn []string, err error) {
return GetProxyArrayWithConvertFunc(ctx, url, GetSocks5ProxyUrl)
}
// 获取单个SOCKS5代理地址
func GetSocks5Proxy(ctx context.Context, url string) (rtn string, err error) {
rtnArray, actErr := GetSocks5ProxyArray(ctx, url)
if actErr != nil {
err = actErr
return
}
rtn = rtnArray[0]
return
}
// 获取一组SOCKS5代理地址
func GetProxyAddressArray(ctx context.Context, url string) (rtn []string, err error) {
return GetProxyArrayWithConvertFunc(ctx, url, GetProxyAddressString)
}
// 获取单个SOCKS5代理地址
func GetProxyAddress(ctx context.Context, url string) (rtn string, err error) {
rtnArray, actErr := GetProxyAddressArray(ctx, url)
if actErr != nil {
err = actErr
return
}
rtn = rtnArray[0]
return
}
// 验证代码逻辑,先注释,后续有需要可参考
// func proxyCheck() {
// url := "http://http.tiqu.letecs.com/getip3?num=1&type=2&pro=440000&city=441900&yys=0&port=2&time=1&ts=1&ys=1&cs=1&lb=1&sb=0&pb=4&mr=1®ions="
// ret, err := GetSocks5Proxy(context.Background(), url)
// if err != nil {
// fmt.Printf("err: %v.\n", err)
// }
// fmt.Printf("ret: %v.\n", ret)
// }
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。