独享代理 Go 示例

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

运行前准备

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

示例代码

package main

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

func getenv(key, fallback string) string {
	value := os.Getenv(key)
	if value == "" {
		return fallback
	}
	return value
}

func main() {
	host := getenv("PRIVATE_HOST", "s1.ip.16yun.cn")
	port := getenv("PRIVATE_PORT", "39010")
	user := os.Getenv("PRIVATE_USERNAME")
	pass := os.Getenv("PRIVATE_PASSWORD")
	target := getenv("TARGET_URL", "https://httpbin.org/ip")
	base := strings.TrimRight(getenv("PRIVATE_BASE", "http://s1.ip.16yun.cn:887"), "/")

	if user == "" || pass == "" {
		panic("缺少 PRIVATE_USERNAME/PRIVATE_PASSWORD")
	}

	http.DefaultClient.Timeout = 15 * time.Second
	for _, path := range []string{"current-ip", "switch-ip", "update"} {
		url := fmt.Sprintf("%s/simple/%s?username=%s&password=%s", base, path, user, pass)
		resp, err := http.Get(url)
		if err != nil {
			fmt.Println(path, "error:", err)
			continue
		}
		body, _ := io.ReadAll(resp.Body)
		resp.Body.Close()
		fmt.Println(path, resp.Status, string(body))
	}

	proxyURL, _ := url.Parse(fmt.Sprintf("http://%s:%s@%s:%s", user, pass, host, port))
	client := &http.Client{
		Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)},
		Timeout: 15 * time.Second,
	}

	resp, err := client.Get(target)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	fmt.Println(resp.Status)
}

适合什么情况

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

相关入口