通过Go语言配置IPNut 代理:
进入 IPNut 平台购买并获取信息,这里以静态IP为例(假如端口是 http://proxy.ipnut.com:28001,账号: ipnut,密码: 123456789)。
1. SOCKS5代理示例 #
package main
import (
"fmt"
"io/ioutil"
"net/http"
"time"
"golang.org/x/net/proxy"
)
func socks5ProxyDemo() {
fmt.Println("=== SOCKS5 代理演示 ===")
// SOCKS5代理配置
proxyHost := "proxy.ipnut.com"
proxyPort := "28001"
proxyUsername := "ipnut"
proxyPassword := "123456789"
// 创建SOCKS5拨号器
auth := &proxy.Auth{
User: proxyUsername,
Password: proxyPassword,
}
dialer, err := proxy.SOCKS5("tcp", fmt.Sprintf("%s:%s", proxyHost, proxyPort), auth, proxy.Direct)
if err != nil {
fmt.Printf("创建SOCKS5拨号器失败: %v\n", err)
return
}
// 创建HTTP传输层
httpTransport := &http.Transport{
Dial: dialer.Dial,
}
// 创建HTTP客户端
client := &http.Client{
Transport: httpTransport,
Timeout: 30 * time.Second,
}
// 测试请求
testURL := "http://httpbin.org/ip"
fmt.Printf("通过SOCKS5代理访问: %s\n", testURL)
resp, err := client.Get(testURL)
if err != nil {
fmt.Printf("请求失败: %v\n", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取响应失败: %v\n", err)
return
}
fmt.Printf("状态码: %d\n", resp.StatusCode)
fmt.Printf("响应内容: %s\n", string(body))
}
func socks5WithCustomRequest() {
fmt.Println("\n=== SOCKS5 自定义请求演示 ===")
proxyHost := "proxy.ipnut.com"
proxyPort := "28001"
proxyUsername := "ipnut"
proxyPassword := "123456789"
auth := &proxy.Auth{
User: proxyUsername,
Password: proxyPassword,
}
dialer, err := proxy.SOCKS5("tcp", fmt.Sprintf("%s:%s", proxyHost, proxyPort), auth, proxy.Direct)
if err != nil {
fmt.Printf("创建SOCKS5拨号器失败: %v\n", err)
return
}
client := &http.Client{
Transport: &http.Transport{
Dial: dialer.Dial,
},
Timeout: 30 * time.Second,
}
// 创建自定义请求
req, err := http.NewRequest("GET", "https://httpbin.org/user-agent", nil)
if err != nil {
fmt.Printf("创建请求失败: %v\n", err)
return
}
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
resp, err := client.Do(req)
if err != nil {
fmt.Printf("发送请求失败: %v\n", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取响应失败: %v\n", err)
return
}
fmt.Printf("状态码: %d\n", resp.StatusCode)
fmt.Printf("响应内容: %s\n", string(body))
}
2. HTTP代理示例 #
package main
import (
"crypto/tls"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"time"
)
func httpProxyDemo() {
fmt.Println("=== HTTP 代理演示 ===")
// HTTP代理配置
proxyHost := "proxy.ipnut.com"
proxyPort := "28001"
proxyUsername := "ipnut"
proxyPassword := "123456789"
// 构建代理URL
proxyURL := fmt.Sprintf("http://%s:%s@%s:%s",
url.QueryEscape(proxyUsername),
url.QueryEscape(proxyPassword),
proxyHost,
proxyPort)
// 解析代理URL
proxy, err := url.Parse(proxyURL)
if err != nil {
fmt.Printf("解析代理URL失败: %v\n", err)
return
}
// 创建HTTP传输层
httpTransport := &http.Transport{
Proxy: http.ProxyURL(proxy),
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, // 仅测试使用,生产环境应验证证书
},
MaxIdleConns: 10,
IdleConnTimeout: 30 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
}
// 创建HTTP客户端
client := &http.Client{
Transport: httpTransport,
Timeout: 30 * time.Second,
}
// 测试请求
testURL := "http://httpbin.org/ip"
fmt.Printf("通过HTTP代理访问: %s\n", testURL)
resp, err := client.Get(testURL)
if err != nil {
fmt.Printf("请求失败: %v\n", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取响应失败: %v\n", err)
return
}
fmt.Printf("状态码: %d\n", resp.StatusCode)
fmt.Printf("响应内容: %s\n", string(body))
}
func httpProxyWithMultipleRequests() {
fmt.Println("\n=== HTTP 代理多请求演示 ===")
proxyHost := "proxy.ipnut.com"
proxyPort := "28001"
proxyUsername := "ipnut"
proxyPassword := "123456789"
proxyURL := fmt.Sprintf("http://%s:%s@%s:%s",
url.QueryEscape(proxyUsername),
url.QueryEscape(proxyPassword),
proxyHost,
proxyPort)
proxy, err := url.Parse(proxyURL)
if err != nil {
fmt.Printf("解析代理URL失败: %v\n", err)
return
}
client := &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyURL(proxy),
},
Timeout: 30 * time.Second,
}
// 测试多个端点
testURLs := []string{
"http://httpbin.org/ip",
"http://httpbin.org/user-agent",
"http://httpbin.org/headers",
}
for i, testURL := range testURLs {
fmt.Printf("\n请求 %d: %s\n", i+1, testURL)
resp, err := client.Get(testURL)
if err != nil {
fmt.Printf("请求失败: %v\n", err)
continue
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("读取响应失败: %v\n", err)
continue
}
fmt.Printf("状态码: %d\n", resp.StatusCode)
fmt.Printf("响应长度: %d 字节\n", len(body))
time.Sleep(1 * time.Second) // 避免请求过快
}
}
3. 主函数和依赖配置 #
package main
func main() {
fmt.Println("开始代理连接测试...\n")
// 运行SOCKS5代理演示
socks5ProxyDemo()
socks5WithCustomRequest()
fmt.Println("\n" + strings.Repeat("=", 50) + "\n")
// 运行HTTP代理演示
httpProxyDemo()
httpProxyWithMultipleRequests()
fmt.Println("\n代理测试完成!")
}
// 需要安装的依赖:
// go get golang.org/x/net/proxy
4. Go.mod 文件 #
module proxy-demo
go 1.19
require (
golang.org/x/net v0.4.0
)
5. 运行说明:初始化项目并运行程序 #
bash
go mod init proxy-demo
go mod tidy
go run main.go