独享代理 Go 示例

阅读模式

这个示例基于 demo-sdk-dedicated-proxy 的 Go 目录整理,适合先确认 net/http 下的独享代理接入方式。

运行前准备

  • 设置环境变量:
    • PRIVATE_HOST
    • PRIVATE_PORT
    • PRIVATE_USERNAME
    • PRIVATE_PASSWORD
    • 可选:PRIVATE_BASE
    • 可选:TARGET_URL

示例代码

1
package main
2
3
import (
4
"fmt"
5
"io"
6
"net/http"
7
"net/url"
8
"os"
9
"strings"
10
"time"
11
)
12
13
func getenv(key, fallback string) string {
14
value := os.Getenv(key)
15
if value == "" {
16
return fallback
17
}
18
return value
19
}
20
21
func main() {
22
host := getenv("PRIVATE_HOST", "s1.ip.16yun.cn")
23
port := getenv("PRIVATE_PORT", "39010")
24
user := os.Getenv("PRIVATE_USERNAME")
25
pass := os.Getenv("PRIVATE_PASSWORD")
26
target := getenv("TARGET_URL", "https://httpbin.org/ip")
27
base := strings.TrimRight(getenv("PRIVATE_BASE", "http://s1.ip.16yun.cn:887"), "/")
28
29
if user == "" || pass == "" {
30
panic("缺少 PRIVATE_USERNAME/PRIVATE_PASSWORD")
31
}
32
33
http.DefaultClient.Timeout = 15 * time.Second
34
for _, path := range []string{"current-ip", "switch-ip", "update"} {
35
url := fmt.Sprintf("%s/simple/%s?username=%s&password=%s", base, path, user, pass)
36
resp, err := http.Get(url)
37
if err != nil {
38
fmt.Println(path, "error:", err)
39
continue
40
}
41
body, _ := io.ReadAll(resp.Body)
42
resp.Body.Close()
43
fmt.Println(path, resp.Status, string(body))
44
}
45
46
proxyURL, _ := url.Parse(fmt.Sprintf("http://%s:%s@%s:%s", user, pass, host, port))
47
client := &http.Client{
48
Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)},
49
Timeout: 15 * time.Second,
50
}
51
52
resp, err := client.Get(target)
53
if err != nil {
54
panic(err)
55
}
56
defer resp.Body.Close()
57
fmt.Println(resp.Status)
58
}

适合什么情况

  • 你用 net/http 写最小验证程序
  • 你要先确认环境变量和代理地址是否正确
  • 你准备把独享代理接到 Go 服务或脚本里

相关入口