跳转到正文

Go 接入 ​

使用已分配的静态端点发送请求。示例从进程环境读取连接信息,默认通过 HTTP 代理服务器访问 HTTPS 目标,不包含提取 IP 或轮换逻辑。

接入准备 ​

在运行程序的终端、容器或部署平台中设置 PROXY_HOST、PROXY_PORT、PROXY_USERNAME、PROXY_PASSWORD。值来自后台当前连接信息;端口必须与协议对应。不要将实际密码提交到代码仓库、输出到日志或放入前端代码。

运行条件与依赖 ​

使用当前受支持的 Go 版本,仅需标准库。将代码保存为 proxy_example.go。

sh
go run proxy_example.go

配置步骤 ​

go
package main

import (
    "context"
    "fmt"
    "io"
    "net"
    "net/http"
    "net/url"
    "os"
    "strconv"
    "strings"
    "time"
)

func required(name string) string {
    value := os.Getenv(name)
    if value == "" {
        fmt.Fprintln(os.Stderr, "Missing environment variable:", name)
        os.Exit(1)
    }
    return value
}

func main() {
    host := strings.Trim(required("PROXY_HOST"), "[]")
    port := required("PROXY_PORT")
    number, err := strconv.Atoi(port)
    if err != nil || number < 1 || number > 65535 {
        fmt.Fprintln(os.Stderr, "Invalid PROXY_PORT")
        os.Exit(1)
    }
    scheme := os.Getenv("PROXY_SCHEME")
    if scheme == "" { scheme = "http" }
    if scheme != "http" && scheme != "socks5h" {
        fmt.Fprintln(os.Stderr, "PROXY_SCHEME must be http or socks5h")
        os.Exit(1)
    }
    endpoint := &url.URL{
        Scheme: scheme,
        Host: net.JoinHostPort(host, port),
        User: url.UserPassword(required("PROXY_USERNAME"), required("PROXY_PASSWORD")),
    }
    transport := http.DefaultTransport.(*http.Transport).Clone()
    transport.Proxy = http.ProxyURL(endpoint)
    defer transport.CloseIdleConnections()
    client := &http.Client{Transport: transport, Timeout: 30 * time.Second}
    ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
    defer cancel()
    request, err := http.NewRequestWithContext(ctx, http.MethodGet, "https://ip123.in/ip.json", nil)
    if err != nil { fmt.Fprintln(os.Stderr, "Invalid request"); os.Exit(1) }
    response, err := client.Do(request)
    if err != nil { fmt.Fprintln(os.Stderr, "Proxy request failed; check network and credentials"); os.Exit(1) }
    defer response.Body.Close()
    if response.StatusCode < 200 || response.StatusCode >= 300 {
        fmt.Fprintln(os.Stderr, "HTTP status:", response.StatusCode)
        os.Exit(1)
    }
    body, err := io.ReadAll(io.LimitReader(response.Body, 1<<20))
    if err != nil { fmt.Fprintln(os.Stderr, "Cannot read response"); os.Exit(1) }
    fmt.Println(string(body))
}

默认 PROXY_SCHEME=http。如需 SOCKS5,改为 socks5h 并使用 SOCKS5 对应端口,让目标域名在远端解析。切换协议不改变已分配的静态出口。

遇到问题 ​

如果示例成功、业务代码失败,检查真正发起请求的进程、SDK 代理 IP 配置、超时和重试策略。不要通过关闭 TLS 证书校验解决连接错误。示例只输出查询结果或不含凭据的错误;排查日志也应脱敏。详见常见问题。