1 Star 0 Fork 0

蔡风华/fisher

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
proxy.go 3.41 KB
一键复制 编辑 原始数据 按行查看 历史
蔡风华 提交于 2021-10-14 10:52 +08:00 . 1.增加代理输出方式。
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&regions="
// ret, err := GetSocks5Proxy(context.Background(), url)
// if err != nil {
// fmt.Printf("err: %v.\n", err)
// }
// fmt.Printf("ret: %v.\n", ret)
// }
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/cfh008/fisher.git
git@gitee.com:cfh008/fisher.git
cfh008
fisher
fisher
v0.2.3

搜索帮助