imroc / req

Simple Go HTTP client with Black Magic
https://req.cool
MIT License
4.12k stars 334 forks source link

使用代理时代理服务器需要认证如何使用呢? #330

Closed putianhui closed 3 months ago

putianhui commented 4 months ago

我下面的示例把认证去掉可以正常访问,但是认证加上就无法使用了

package main

import (
    "fmt"
    "github.com/imroc/req/v3"
    "math/rand"
    "time"
)

func main() {
    c:=NewAutoChangeProxyClient()
    fmt.Println(getProxyUrl())
    resp, _ := c.R().Get("https://xxxx.com/ip")
    fmt.Println(resp.String())
}
var proxies = []string{
         // 没有认证可以使用
    "http://x.x.x.x:8888", 
         // 有认证无法使用
    "http://user:password@x.x.x.x:8888", 
}
// getProxyUrl 随机选择并返回一个代理URL
func getProxyUrl() string {
    rand.Seed(time.Now().UnixNano()) // 初始化随机种子
    if len(proxies) > 0 {
        randomIndex := rand.Intn(len(proxies)) // 生成一个随机索引
        return proxies[randomIndex] // 返回随机选中的代理URL
    }
    return "" // 如果没有代理配置,返回空字符串
}

func NewAutoChangeProxyClient() *req.Client {
    client := req.C()

    // 在初始化客户端时设置一个随机代理
    client.SetProxyURL(getProxyUrl())

    client.SetTimeout(5 * time.Second).
        EnableDumpEachRequest().
        SetCommonRetryCount(len(proxies)).
        SetCommonRetryCondition(func(resp *req.Response, err error) bool {
            return err != nil || resp.StatusCode == 403
        }).
        SetCommonRetryHook(func(resp *req.Response, err error) {
            // 如果需要重试,随机选择一个新的代理
            c := client.Clone().SetProxyURL(getProxyUrl()) // 使用新的随机代理创建客户端副本
            resp.Request.SetClient(c) // 为当前请求设置新的客户端实例,该实例使用了新的代理
        })

    return client
}
imroc commented 4 months ago

http://user:password@x.x.x.x:8888 这种应该可以用

putianhui commented 3 months ago

确实可以 我代码中使用代理服务器时的账号错了,sorry。