跳转到内容

HTTP/Socks5 网络代理

为确保脚本在全球范围内稳定访问目标网站,平台会在运行时提供一条加密通道(代理服务器)。

脚本无需自行购买或维护代理,只需读取平台注入的代理认证信息,并在 HTTP 请求中正确配置即可。

  • 协议SOCKS5
  • 域名:运行时从 PROXY_DOMAIN 环境变量读取(host:port
  • 认证方式
    • 环境变量名:PROXY_AUTH
    • 格式:username:password
  • 配置方式:代理由平台在运行时分配并注入,脚本无需自行购买、部署或配置代理。

requests 走 SOCKS5 需要安装 PySockspip install "requests[socks]")。使用 socks5h 协议头,让 DNS 也通过代理解析。

import os
import requests
# 1. 读取代理地址(host:port)与认证信息(username:password)
proxy_domain = os.environ.get("PROXY_DOMAIN")
proxy_auth = os.environ.get("PROXY_AUTH")
print(f"是否已配置代理: {bool(proxy_auth and proxy_domain)}")
# 2. 拼接 SOCKS5 代理 URL(切勿打印该值——它包含密码)
proxy_url = (
f"socks5h://{proxy_auth}@{proxy_domain}"
if proxy_auth and proxy_domain
else None
)
# 3. 创建走代理的会话
session = requests.Session()
if proxy_url:
session.proxies = {"http": proxy_url, "https": proxy_url}
# 4. 示例请求
response = session.get("https://ipinfo.io/ip", timeout=30)
print(f"状态码: {response.status_code}")
print(f"当前出口 IP: {response.text.strip()}")

Go 标准库的 http.Transport.Proxy 不支持 SOCKS5。请使用 golang.org/x/net/proxygo get golang.org/x/net/proxy)提供的 SOCKS5 dialer,并保持 TLS 校验开启。

// 1. 读取代理地址(host:port)与认证信息(username:password)
proxyDomain := os.Getenv("PROXY_DOMAIN")
proxyAuth := os.Getenv("PROXY_AUTH")
coresdk.Log.Info(ctx, fmt.Sprintf("是否已配置代理: %v", proxyAuth != "" && proxyDomain != ""))
httpClient := &http.Client{Timeout: 30 * time.Second}
// 2. 构建 SOCKS5 dialer 并注入 HTTP transport
if proxyAuth != "" && proxyDomain != "" {
var auth *proxy.Auth
if user, pass, ok := strings.Cut(proxyAuth, ":"); ok {
auth = &proxy.Auth{User: user, Password: pass}
}
dialer, err := proxy.SOCKS5("tcp", proxyDomain, auth, proxy.Direct)
if err != nil {
coresdk.Log.Error(ctx, fmt.Sprintf("创建 SOCKS5 dialer 失败: %v", err))
return
}
contextDialer := dialer.(proxy.ContextDialer)
httpClient.Transport = &http.Transport{
DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
return contextDialer.DialContext(ctx, network, addr)
},
}
}
// 3. 示例业务请求
req, err := http.NewRequestWithContext(ctx, "GET", "https://ipinfo.io/ip", nil)
if err != nil {
coresdk.Log.Error(ctx, fmt.Sprintf("创建请求失败: %v", err))
return
}
resp, err := httpClient.Do(req)
if err != nil {
coresdk.Log.Error(ctx, fmt.Sprintf("请求失败: %v", err))
return
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
coresdk.Log.Info(ctx, fmt.Sprintf("响应状态码: %d", resp.StatusCode))
coresdk.Log.Info(ctx, fmt.Sprintf("当前出口 IP: %s", strings.TrimSpace(string(body))))

步骤 1:安装依赖

Terminal window
npm install axios socks-proxy-agent

步骤 2:示例代码

import axios from 'axios'
import { SocksProxyAgent } from 'socks-proxy-agent'
// 1. 获取代理服务地址(仅从运行环境读取)
const proxyDomain = process.env.PROXY_DOMAIN
// 2. 读取代理认证信息(username:password)
const proxyAuth = process.env.PROXY_AUTH
await coresdk.log.info(`是否已配置代理: ${Boolean(proxyAuth && proxyDomain)}`)
// 3. 拼接 SOCKS5 代理 URL(切勿记录该值——它包含密码)
const proxyUrl =
proxyAuth && proxyDomain ? `socks5://${proxyAuth}@${proxyDomain}` : null
// 4. 创建 HTTP Client 配置
const axiosConfig = {
timeout: 30000,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
},
}
// 5. 如果存在代理,配置 Agent
if (proxyUrl) {
const agent = new SocksProxyAgent(proxyUrl)
axiosConfig.httpAgent = agent
axiosConfig.httpsAgent = agent
axiosConfig.proxy = false // 必须禁用 axios 默认代理处理
}
// 6. 示例业务请求
try {
const response = await axios.get('https://ipinfo.io/ip', axiosConfig)
await coresdk.log.info(`响应状态码: ${response.status}`)
await coresdk.log.info(`当前出口 IP: ${String(response.data).trim()}`)
} catch (err) {
await coresdk.log.error(`请求失败: ${err.message}`)
}

代理可以从指定的国家或地区出口。可用的区域代码由 API 返回,且可能随时间变化,因此请在运行时查询,而不要依赖硬编码列表:

将所选区域代码通过 Worker 的系统参数传入(例如当 Worker 的输入 schema 暴露了 proxy_region 字段时)。未指定区域时,平台会选择一个默认出口。