集成 · 中级

在 Go 和 PHP 中使用代理:net/http Transport、x/net/proxy、cURL 与 Guzzle

在 Go 和 PHP 中显式配置 HTTP 或 SOCKS 代理、设置超时,并避免将凭据写入日志。示例涵盖 http.Transport、cURL 和 Guzzle;实际出口由交付的网关配置决定。

阅读约需 2 分钟 6 个章节 审核日期 编辑团队 Proxy Cyber

Go:使用 http.Transport#

Go
package main

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

func main() {
	proxyURL, _ := url.Parse("http://USER-cc-us:PASS@res.proxy-cyber.com:9000")
	client := &http.Client{
		Timeout: 45 * time.Second,
		Transport: &http.Transport{
			Proxy:             http.ProxyURL(proxyURL),
			DisableKeepAlives: true, // 在轮换网关上,新连接意味着新出口
		},
	}
	resp, err := client.Get("https://api.ipify.org")
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()
	body, _ := io.ReadAll(resp.Body)
	fmt.Println(string(body))
}

连接复用与 IP 分配是不同的机制。客户端会话复用套接字,而轮换与持续会话由实际交付的网关控制。请使用服务中提供的会话参数,并通过多次请求检查出口。关闭连接或发送 Connection: close 并不保证获得另一个 IP。

Go:按请求选择代理#

Go
tr := &http.Transport{
	Proxy: func(r *http.Request) (*url.URL, error) {
		sid := r.Header.Get("X-Session") // 自定义提示,绝不会发送给代理
		r.Header.Del("X-Session")
		return url.Parse(fmt.Sprintf("http://USER-cc-de-sid-%s-ttl-10m:PASS@res.proxy-cyber.com:9000", sid))
	},
}

Go:SOCKS5#

Go
import "golang.org/x/net/proxy"

dialer, err := proxy.SOCKS5("tcp", "res.proxy-cyber.com:9001", &proxy.Auth{User: "USER-cc-us", Password: "PASS"}, proxy.Direct)
if err != nil { panic(err) }
tr := &http.Transport{Dial: dialer.Dial}
client := &http.Client{Transport: tr, Timeout: 45 * time.Second}

PHP:cURL#

PHP
<?php
$ch = curl_init("https://api.ipify.org");
curl_setopt_array($ch, [
    CURLOPT_PROXY          => "http://res.proxy-cyber.com:9000",
    CURLOPT_PROXYUSERPWD   => "USER-cc-us:PASS",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CONNECTTIMEOUT => 15,
    CURLOPT_TIMEOUT        => 45,
    CURLOPT_FORBID_REUSE   => true, // 在轮换网关上,每次调用都使用新出口
]);
echo curl_exec($ch);

// 使用远程 DNS 的 SOCKS5
curl_setopt($ch, CURLOPT_PROXY, "res.proxy-cyber.com:9001");
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);

PHP:Guzzle#

PHP
<?php
use GuzzleHttp\Client;

$sticky = "http://USER-cc-de-city-berlin-sid-cart42-ttl-15m:PASS@res.proxy-cyber.com:9000";
$client = new Client(['proxy' => $sticky, 'timeout' => 45, 'connect_timeout' => 15]);

$r = $client->get('https://api.ipify.org');
echo $r->getBody();

检查清单#

  • 如果交付的网关支持会话标识,请为每个独立流程使用不同标识。允许的持续时间和地区参数应以连接信息为准。住宅设备可能提前离线,因此持续会话不保证数日使用同一 IP。需要固定地址时,应比较独享静态产品。
  • 根据出口类型调整超时;遇到传输错误时重试一次。
  • 切勿记录代理 URL,其中包含密码;请改为记录会话 ID。

大家常问的问题#

Go 的 http.ProxyFromEnvironment 可以使用吗?

可以:将含有 Proxy Cyber URL 的 HTTPS_PROXY 和 HTTP_PROXY 导出,并将 http.ProxyFromEnvironment 用作 Transport 的 Proxy 函数。NO_PROXY 用于排除本地主机。

您的账户

在一个账户中管理代理服务

在同一控制台比较网络、下单并查看余额与支持请求。团队人工核验付款,交付后提供连接信息。

创建账户