07-代理使用说明:命令行 - 代码 - 客户端
分类:接入与使用 | 更新日期:2026-09-14
提取出代理只是第一步。这一页把「填进哪里、怎么填、怎么确认通了」按场景讲清楚,代码片段可直接复制。
本页目录
- 一分钟速查:三种写法
- 命令行接入
- 代码接入
- 客户端与系统接入
- 会话与时效
- 协议与 DNS 注意点
- 接入后怎么自检
- 常见问题
前一章讲的是「怎么把代理提取出来」,这一页讲「拿到代理之后怎么接进去」。命令行、代码、系统与指纹浏览器四类场景,每段都给可直接抄走的写法;示例里的 子账号:子账号密码、us.duckip.net:1000 换成你控制台里生成的那一行即可。
HTTP / SOCKS5|账密认证或白名单|支持粘性会话|指纹浏览器可直接粘贴
① 选接入方式 → ② 抄一条对应写法 → ③ 先做连通性自检 → ④ 再批量铺开
开始前先记住三件事 ① 达可云代理只支持 HTTP 与 SOCKS5;② 用户名里的 _area-XX_life-N_session-XXX 是可选的参数段,会参与拼装用户名,复制时不要漏段、也不要把分隔符改成别的字符;③ 主机名与端口以控制台「复制」结果为准——本文里的 us.duckip.net:1000(动态)/ as.duckip.net:2000(静态)只是示例,不同地区与产品线的前缀可能不同,请勿照抄。
一分钟速查:同一份代理,三种写法
控制台「批量生成」给的是四段式(主机:端口:用户名:密码),不同客户端要的形态不一样,按下表换算:
| 你手上有什么 | 填进客户端的样子 | 适用场景 |
|---|---|---|
主机:端口:用户名:密码 | us.duckip.net:1000:子账号:密码 | 指纹浏览器「粘贴导入」、代理管理器批量导入、CMD 批量检测 |
用户名:密码@主机:端口 | http://子账号:密码@us.duckip.net:1000 | curl / 代码里的代理参数(URL 形式)、环境变量 http_proxy |
只有 主机:端口 | http://us.duckip.net:1000 | 已把本机 IP 加进白名单(无需账密) |
第①②种的关系 四段式就是 URL 形式的展开:主机:端口:用户名:密码 → http://用户名:密码@主机:端口。手工换算时最容易漏掉 http:// 前缀,或把用户名里的下划线、session- 前缀写错。
命令行接入
cURL:最常用的三行
先确认链路通不通,再谈业务。下面三条分别对应账密认证、白名单、SOCKS5。
# 账密认证:主机加端口 + 子账号 + 密码(注意 @ 前面是「用户名:密码」)
curl -sS -m 20 -x "http://子账号:子账号密码@us.duckip.net:1000" https://api.ip.cc/
# 只看状态码与耗时,不打印正文(-o /dev/null 表示丢弃正文)
curl -s -o /dev/null -w "HTTP:%{http_code} time:%{time_total}s\n" -m 20 \
-x "http://子账号:子账号密码@us.duckip.net:1000" https://api.ip.cc/# 白名单模式:本机 IP 已在白名单里,则不需要账号密码
curl -sS -m 20 -x "http://us.duckip.net:1000" https://api.ip.cc/
# 静态住宅代理(端口 2000)同样写法,只换主机与端口
curl -sS -m 20 -x "http://子账号:子账号密码@as.duckip.net:2000" https://api.ip.cc/# SOCKS5:用 socks5h:// 让域名在代理端解析(推荐)
curl -sS -m 20 -x "socks5h://子账号:子账号密码@us.duckip.net:1000" https://api.ip.cc/
# 等价写法:代理地址与凭据分开给(部分脚本里更好拼接)
curl -sS -m 20 --socks5-hostname us.duckip.net:1000 \
--proxy-user "子账号:子账号密码" https://api.ip.cc/# 粘性会话:把 session 写进用户名,同一 session 在时效内复用同一出口 IP
curl -sS -m 20 -x "http://子账号_area-US_life-10_session-abc123:子账号密码@us.duckip.net:1000" https://api.ip.cc/
# 每次请求换 IP:不带 session 段即可
curl -sS -m 20 -x "http://子账号:子账号密码@us.duckip.net:1000" https://api.ip.cc/不要漏 http:// 前缀 把四段式直接塞给 -x 会报 curl: (5) Unsupported proxy syntax ... Port number was not a decimal number。正确做法是先按 : 拆开,再拼成 http://用户名:密码@主机:端口;批量脚本见总览与连通性检测。
SOCKS5 为什么要用 socks5h socks5 会在本机解析域名,本机若开着带 fake-ip 的代理软件(例如 Clash 的 198.18.0.0/16),解析结果会被劫持成假 IP;socks5h 把域名交给代理端解析,结果更接近真实出口。
环境变量:一次设置,多个工具受益
git、pip、npm、wget、部分 SDK 都会读 http_proxy / https_proxy。适合临时切到代理做一段工作。
# 环境变量方式:临时(当前终端窗口内有效)——多数命令行工具会自动读取
export http_proxy="http://子账号:子账号密码@us.duckip.net:1000"
export https_proxy="$http_proxy"
export all_proxy="socks5h://子账号:子账号密码@us.duckip.net:1000" # 可选,SOCKS5 场景
# Windows CMD / PowerShell(临时)
set http_proxy=http://子账号:子账号密码@us.duckip.net:1000
set https_proxy=%http_proxy%
# PowerShell 里改用:$env:http_proxy="http://子账号:子账号密码@us.duckip.net:1000"# git 走代理(只在本次命令生效,不写入全局配置)
git -c http.proxy=http://子账号:子账号密码@us.duckip.net:1000 clone https://github.com/用户/仓库.git
# pip 走代理
pip install --proxy http://子账号:子账号密码@us.duckip.net:1000 包名
# npm 走代理(写进项目或全局配置)
npm config set proxy http://子账号:子账号密码@us.duckip.net:1000
npm config set https-proxy http://子账号:子账号密码@us.duckip.net:1000
# 用完想恢复,清掉代理设置
git config --unset http.proxy ; npm config delete proxy ; npm config delete https-proxy代码接入
按你的技术栈抄对应的一段。所有片段都遵循同一套参数:代理 URL、连接超时、失败时打印错误。
import requests
PROXY = "http://子账号:子账号密码@us.duckip.net:1000"
proxies = {"http": PROXY, "https": PROXY}
r = requests.get("https://api.ip.cc/", proxies=proxies, timeout=20)
print(r.status_code, r.json()["ip"])import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
PROXY = "http://子账号:子账号密码@us.duckip.net:1000"
s = requests.Session() # 复用连接,批量请求更快
s.proxies = {"http": PROXY, "https": PROXY}
s.mount("https://", HTTPAdapter(max_retries=Retry(total=2, backoff_factor=0.5)))
for i in range(3):
r = s.get("https://api.ip.cc/", timeout=20)
print(i, r.json()["ip"]) # 不带 session 段时,每次请求会换 IPimport httpx
# httpx 的代理参数是单个 URL(v0.26 起为 proxy=,旧版本用 proxies=)
with httpx.Client(proxy="http://子账号:子账号密码@us.duckip.net:1000", timeout=20) as c:
r = c.get("https://api.ip.cc/")
print(r.status_code, r.json()["ip"])// npm i axios https-proxy-agent
const axios = require("axios");
const { HttpsProxyAgent } = require("https-proxy-agent");
const agent = new HttpsProxyAgent("http://子账号:子账号密码@us.duckip.net:1000");
(async () => {
const r = await axios.get("https://api.ip.cc/", {
httpsAgent: agent,
proxy: false, // 关掉 axios 自己的代理处理,避免重复
timeout: 20000,
});
console.log(r.status, r.data);
})();// 不装依赖:原生 http 发 CONNECT,再在隧道里跑 https
const http = require("http");
const https = require("https");
function viaProxy(proxyUrl, targetUrl, callback) {
const p = new URL(proxyUrl);
const t = new URL(targetUrl);
const auth = p.username
? "Basic " + Buffer.from(
`${decodeURIComponent(p.username)}:${decodeURIComponent(p.password)}`).toString("base64")
: null;
const req = http.request({
host: p.hostname, port: p.port || 80, method: "CONNECT",
path: `${t.hostname}:${t.port || 443}`,
headers: auth ? { "Proxy-Authorization": auth } : {},
timeout: 20000,
});
req.on("connect", (res, socket) => {
if (res.statusCode !== 200) { socket.destroy(); return callback(new Error("代理返回 " + res.statusCode)); }
callback(null, socket, t);
});
req.on("error", callback);
req.end();
}
viaProxy("http://子账号:子账号密码@us.duckip.net:1000", "https://api.ip.cc/", (err, socket, t) => {
if (err) return console.error("失败:", err.message);
const req = https.request({ host: t.hostname, path: "/", socket, agent: false,
headers: { Host: t.hostname } }, (res) => {
let body = "";
res.on("data", (c) => (body += c));
res.on("end", () => console.log(res.statusCode, body));
});
req.on("error", (e) => console.error("失败:", e.message));
req.end();
});package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
proxyURL, _ := url.Parse("http://子账号:子账号密码@us.duckip.net:1000")
client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)}}
resp, err := client.Get("https://api.ip.cc/")
if err != nil {
fmt.Println("请求失败:", err)
return
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(resp.Status, string(body))
}import java.net.Authenticator;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.ProxySelector;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class DuckIPProxy {
public static void main(String[] args) throws Exception {
String user = "子账号";
String pass = "子账号密码";
// 代理认证必须走 Authenticator(Proxy-Authorization 请求头是发给目标站点的,对代理无效)
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("us.duckip.net", 1000)))
.authenticator(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
if (getRequestorType() == RequestorType.PROXY) {
return new PasswordAuthentication(user, pass.toCharArray());
}
return null;
}
})
.connectTimeout(Duration.ofSeconds(20))
.build();
HttpRequest req = HttpRequest.newBuilder(URI.create("https://api.ip.cc/"))
.timeout(Duration.ofSeconds(20))
.GET().build();
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(resp.statusCode() + " " + resp.body());
}
}<?php
$ch = curl_init("https://api.ip.cc/");
curl_setopt_array($ch, [
CURLOPT_PROXY => "us.duckip.net:1000",
CURLOPT_PROXYUSERPWD => "子账号:子账号密码", // 也可直接写成 "子账号:密码@主机:端口"
CURLOPT_PROXYTYPE => CURLPROXY_HTTP,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
]);
$body = curl_exec($ch);
if ($body === false) {
echo "失败: " . curl_error($ch);
} else {
echo curl_getinfo($ch, CURLINFO_HTTP_CODE) . " " . $body;
}
curl_close($ch);# Windows PowerShell:凭据不能写在 -Proxy 的 URL 里(会 407),要用 -ProxyCredential
$secure = ConvertTo-SecureString "子账号密码" -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential("子账号", $secure)
Invoke-RestMethod -Uri "https://api.ip.cc/" `
-Proxy "http://us.duckip.net:1000" -ProxyCredential $cred -TimeoutSec 20两个容易踩的坑 ① 用 axios 时如果同时设置了全局代理与 httpsAgent,要加 proxy: false,否则会重复套一层代理;② PowerShell 的 -Proxy 不认 URL 里的用户名密码(实测会返回 407),必须用 -ProxyCredential。
客户端与系统接入
场景 推荐做法 指纹浏览器(AdsPower / 比特 / Hubstudio / 海豚等) 直接粘贴四段式或填四个字段,协议选 HTTP 或 SOCKS5;逐字段说明见 总览 与各客户端章节 Chrome / Edge(临时) 启动参数 --proxy-server="http://控制台主机:端口" ,示例 http://us.duckip.net:1000 (不建议在主力浏览器上长期开启) Firefox 设置 → 网络设置 → 手动配置代理,填主机与端口(账密可写在 URL 里或弹窗询问) Windows 系统代理 设置 → 网络和 Internet → 代理 → 手动设置,填控制台结果中的主机与端口(示例 us.duckip.net 与 1000 ); 注意系统代理是全局的 ,用完记得关 手机 / 模拟器 Wi-Fi 高级设置里填代理主机与端口;Android 若要 SOCKS5,通常需要走指纹浏览器或代理 App
指纹浏览器为什么优先 指纹浏览器可以为每个环境单独绑定一条代理(一个 session),做到「一个环境一个出口 IP」;系统代理是全局的,做不到按环境隔离,容易把多个账号的出口混在一起。
会话与时效:怎么控制出口 IP 的复用
用户名里可以拼参数段,最常用的三段是 _area-XX(国家/城市)、_life-N(保持 IP 的分钟数)、_session-XXX(会话标识)。
| 你想达到的效果 | 用户名怎么写 | 说明 |
|---|---|---|
| 每次请求都换 IP | 子账号(不带任何参数段) | 不填 session 时,每次请求优先分配不同 IP |
| 同一 IP 用满一段时间 | 子账号_life-30_session-abc123 | 同 session 在 life 时效内复用同一出口 IP |
| 指定地区 + 粘性 | 子账号_area-US_life-10_session-abc123 | 先锁定地区,再锁定时效与会话 |
| 多账号隔离 | 每个环境一个不同的 session 值 | 批量生成时会自动分配互不相同的 session,可直接逐个环境对应 |
session 的写法要一致 session- 后面的值请用字母数字组合,且同一个会话必须用完全相同的字符串(大小写敏感);复制时不要带多余空格或换行。
| 调优项 | 怎么理解 | 建议 |
|---|---|---|
| 并发 | 同一账号的并发请求越多,越容易触发目标站点的风控 | 按业务量逐步加压,观察失败率;不同账号用不同 session |
| 带宽 | 不限量住宅代理按「带宽 + 并发 + 计费周期」选档 | 先按峰值需求选档,不够再加;带宽不足会表现为超时而不是报错 |
| life 时长 | 保持 IP 使用时间,最长 120 分钟 | 登录类操作设 10—30 分钟即可,不必拉满 |
| 流量 | 动态按流量计费、静态按 IP 数计费 | 批量抓取静态资源时开启缓存代理(仅 HTTP、不支持比特浏览器) |
协议与 DNS 的四个注意点
| 注意点 | 现象 | 处理 |
|---|---|---|
| 协议只支持 HTTP / SOCKS5 | 选了 SOCKS4 / SSH 等协议连不上 | 回到客户端把协议切回 HTTP 或 SOCKS5 |
| 本机 DNS 劫持(fake-ip) | SOCKS5 走本机解析时拿到 198.18.x.x | 改用 socks5h://,或把协议换成 HTTP |
| 目标是 HTTPS 站点 | 代理写入后浏览器提示证书错误 | 若是缓存代理场景,按缓存代理安装证书;普通代理不需要证书 |
| 口径统一 | 首页、帮助文档与客户端里的判断不一致 | 以控制台实时显示为准,本文档仅作操作说明 |
接入后怎么自检
- 先看直连出口
- 界面位置:本机终端
- 怎么操作:
curl -sS https://api.ip.cc/ - 预期结果:记录直连出口 IP 与国家,便于与代理出口对比。
- 再走代理看一次
- 界面位置:同上
- 怎么操作:把上一节的 cURL 片段换成你的代理参数执行。
- 预期结果:返回的
country_code与目标区域一致,asn_type为residential。
- 把代理填进客户端
- 界面位置:指纹浏览器环境 / 软件代理设置
- 怎么操作:粘贴四段式,点「检查代理」或保存后打开环境。
- 预期结果:客户端检测通过,页面内查 IP 与终端结果一致。
- 出错按表排查
- 界面位置:排错速查表
- 怎么操作:按 407 / 612 / HTTP:000 等返回码对号入座。
- 预期结果:定位到是凭据、白名单、协议还是本机网络问题。
常见问题
| 问题 | 处理 |
|---|---|
| 同一段代码在终端能跑,在指纹浏览器里失败 | 客户端协议多半选成了非 HTTP/SOCKS5,或客户端缓存了旧配置;切成 HTTP 保存后重开环境。 |
curl 提示 CONNECT tunnel failed, response 407 | 凭据没带对(含参数段缺失)或账号未在该端口生效,核对四段后重试。 |
| 返回的 IP 一直不变 | 要么带了固定的 session,要么在 life 时效内;换一个 session 值即可换 IP。 |
| 请求偶尔超时 | 先降并发、加超时到 20—30 秒,再看是否是目标站点限速。 |
Java 客户端报 too many authentication attempts | 代理用户名或密码不对,Java 重试 3 次后抛出该异常(不是简单的 407)——核对四段信息后重试;确认凭据是通过 Authenticator 传入的。 |
| 想同时在多个套餐间切换 | 同一主账号下按套餐分别计费,子账号与套餐绑定、不可跨套餐复用;每个套餐用各自的四段信息。 |
相关文档 账密认证提取 | API 提取与代码接入 | 参数详解与生成格式 | 缓存代理 | 排错速查表
