快速回答
如何检查代理是否为静态?
要检查代理是否为静态,请在至少 24 小时内每小时通过代理请求一次 api.ipify.org 和 ipinfo.io/json。然后对比所有成功检测中的出口 IP、ASN(org 字段)和国家。每一行都是同一个 IP 和同一个 ASN,就说明代理在该时间段内保持静态。SteadyProxy 静态 IP 在每个 30 天租期内应保持固定;此测试可让你自行验证。更新于 2026 年 10 月 19 日。
该测试的关键事实有哪些?
| 测试端点 | api.ipify.org(仅出口 IP)和 ipinfo.io/json(IP、org/ASN、城市、地区、国家) |
|---|---|
| 建议时间窗口 | 24 小时,每小时检测一次(共 24 次);长期任务在第 7 天再重复一次 |
| 静态结果 | 每次成功检测中 IP 和 ASN 都相同 |
| 轮换结果 | 出现两个或更多不同 IP,或 ASN 发生变化 |
| 请求失败 | 超时不是 IP 变化:只对比成功的行 |
| 城市变化 | 数据库更新时可能发生;IP 和 ASN 是更强的信号 |
| 测试情况 | 两个脚本均于 2026 年 10 月 19 日通过一个受密码保护的测试代理运行 |
静态代理上究竟哪些值应保持不变?
有三个值不能变:出口 IP、ASN 和国家。出口 IP 是网站看到的地址;api.ipify.org 只返回该值。ASN 是宣告该 IP 的网络;ipinfo.io 在 org 字段中显示它,例如 AS9009 后跟网络名称。国家来自 IP 数据库。即使 IP 保持不变,数据库更新时城市和地区也可能变动。注意,你连接的主机不一定是出口 IP:请始终通过代理读取出口 IP。
如何用 curl 检查代理?
先运行一次检测查看字段,再运行循环。将 USERNAME、PASSWORD、host 和 port 替换为仪表板中为你 IP 显示的四个值。循环每次检测向 ip-log.txt 写入一行,并在两次检测之间休眠 3,600 秒。最后两条命令统计不同 IP 和网络的数量:各只有一行说明代理在测试期间保持静态。
# One check through the proxy: IP, network (org = ASN + name), country, city
curl -s -m 30 -x "http://USERNAME:[email protected]:7777" https://ipinfo.io/json
# 24 checks, one per hour, one line per check in ip-log.txt
PROXY="http://USERNAME:[email protected]:7777"
for i in $(seq 1 24); do
printf '%s ' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> ip-log.txt
curl -s -m 30 -x "$PROXY" https://ipinfo.io/json | tr -d '\n' >> ip-log.txt
echo >> ip-log.txt
sleep 3600
done
# Count the distinct exit IPs and networks in the log (one line each = static)
grep -o '"ip": *"[^"]*"' ip-log.txt | sort | uniq -c
grep -o '"org": *"[^"]*"' ip-log.txt | sort | uniq -c
如何用 Python 检查代理?
Python 脚本执行相同的测试,并写入可用电子表格打开的 CSV 文件。它从环境变量(PROXY_HOST、PROXY_PORT、PROXY_USER、PROXY_PASS)读取代理详情,以及两个设置:CHECKS(默认 24)和 INTERVAL_SECONDS(默认 3600)。每轮它查询两个端点,因此还能发现两者不一致。最后它打印不同 IP、网络和国家的数量,以及一行结果。我们于 2026 年 10 月 19 日使用 Python 3.14 和 Requests 2.34,通过一个需要用户名和密码的本地测试代理运行了它。
"""Log the exit IP, network and location of one proxy over time.
A static IP shows the same IP, network (ASN) and country in every row.
Install: python -m pip install requests
"""
import csv
import os
import time
from datetime import datetime, timezone
from urllib.parse import quote
import requests
HOST = os.environ.get("PROXY_HOST", "gw.steadyproxy.com")
PORT = os.environ.get("PROXY_PORT", "7777")
USER = os.environ.get("PROXY_USER", "USERNAME")
PASSWORD = os.environ.get("PROXY_PASS", "PASSWORD")
CHECKS = int(os.environ.get("CHECKS", "24"))
INTERVAL = int(os.environ.get("INTERVAL_SECONDS", "3600"))
LOG_FILE = os.environ.get("LOG_FILE", "static-ip-log.csv")
PROXY = "http://" + quote(USER, safe="") + ":" + quote(PASSWORD, safe="") + "@" + HOST + ":" + PORT
PROXIES = {"http": PROXY, "https": PROXY}
FIELDS = ["time_utc", "ipify_ip", "ipinfo_ip", "org", "country", "region", "city"]
def check_once(session):
ipify = session.get("https://api.ipify.org?format=json", proxies=PROXIES, timeout=(10, 30))
ipify.raise_for_status()
info = session.get("https://ipinfo.io/json", proxies=PROXIES, timeout=(10, 30))
info.raise_for_status()
data = info.json()
return {
"time_utc": datetime.now(timezone.utc).isoformat(timespec="seconds"),
"ipify_ip": ipify.json()["ip"],
"ipinfo_ip": data.get("ip", ""),
"org": data.get("org", ""),
"country": data.get("country", ""),
"region": data.get("region", ""),
"city": data.get("city", ""),
}
def main():
rows = []
with requests.Session() as session, open(LOG_FILE, "a", newline="", encoding="utf-8") as fh:
session.trust_env = False
writer = csv.DictWriter(fh, fieldnames=FIELDS)
if fh.tell() == 0:
writer.writeheader()
for n in range(CHECKS):
try:
row = check_once(session)
except requests.RequestException as exc:
print("check", n + 1, "failed:", type(exc).__name__)
else:
writer.writerow(row)
fh.flush()
rows.append(row)
print(row["time_utc"], row["ipify_ip"], row["org"], row["country"], row["city"])
if n + 1 < CHECKS:
time.sleep(INTERVAL)
ips = {r["ipify_ip"] for r in rows} | {r["ipinfo_ip"] for r in rows}
orgs = {r["org"] for r in rows}
countries = {r["country"] for r in rows}
print("successful checks:", len(rows), "of", CHECKS)
print("distinct IPs:", sorted(ips))
print("distinct networks:", sorted(orgs))
print("distinct countries:", sorted(countries))
if len(rows) >= 2 and len(ips) == 1 and len(orgs) == 1 and len(countries) == 1:
print("RESULT: same IP, network and country in every successful check")
else:
print("RESULT: not stable, or not enough data - read the log")
if __name__ == "__main__":
main()
测试应运行多久?
至少运行 24 小时。许多轮换产品按请求、按会话或每隔固定分钟数更换 IP,因此一分钟内几次检测可能错过变化。对于每周运行的任务,7 天后再重复测试。每小时检测一次就足够,且远低于免费查询服务的使用限制。仅在短测试时使用更短的间隔,例如间隔 5 分钟共 12 次检测。
如果测试期间 IP 发生变化怎么办?
先排除设置错误。检查每次请求是否使用了相同的主机、端口和用户名:两个不同 IP 常常来自两条不同的凭据行。然后检查你机器上的系统代理或 VPN 是否接管了部分请求;Python 脚本通过 trust_env = False 忽略此类设置。如果某条 SteadyProxy 凭据行的出口 IP 确实在租期内发生变化,请将日志发送给支持团队。我们的更换规则:如果某个 IP 无法使用,请联系客服:在库存允许的情况下,我们会修复它,或用同一国家/地区的另一个 IP 替换。
为什么 IP 不变而位置会变?
因为位置是数据库的估算,而不是 IP 的属性。地理位置供应商会更新数据,静态 IP 在两次更新之间可能从一座城市移到附近城市。注册机构数据也好不到哪去:RIPE 的文档说明其国家属性不能可靠地用于将 IP 映射到国家。将城市变化视为数据库事件,将 IP 或 ASN 变化视为真实变化。我们的指南 静态住宅代理真的是住宅代理吗? 说明了如何解读这些记录。
关于测试静态代理,人们还问什么?
多少次检测能证明代理是静态的?
没有任何数字能为未来证明;测试只描述你测量的时间窗口。实践中,24 次每小时检测均为同一 IP 和同一 ASN,说明代理一天内没有轮换。一周后再重复测试并保留日志。在 SteadyProxy,每个 IP 在其 30 天租期内应保持固定。
为什么要同时使用 api.ipify.org 和 ipinfo.io?
api.ipify.org 只返回 IP,是干净的参照。ipinfo.io 增加 ASN 和组织、城市、地区和国家。如果两个服务在同一轮中报告不同 IP,你的客户端可能正通过不同路线打开多个连接。在信任任何结果之前,这值得检查。
粘性会话会在短测试中看起来像静态吗?
会。带粘性会话的轮换住宅代理会在设定时间内保持一个 IP(通常几分钟),然后更换。几分钟的测试会看起来是静态的。这就是本指南要求至少 24 小时检测的原因。真正的静态 IP 会跨天保持相同的 IP 和 ASN。
请求失败是否意味着 IP 变了?
不会。超时或代理错误只意味着那一次请求没有完成。脚本会跳过失败的轮次,只对比成功的行。连续出现大量失败就值得检查一下:核对凭据、端口和你自己的连接,如果问题仍然存在,请联系支持。
不提供 token 就把这些检查发送到 ipinfo.io 可以吗?
轻度使用的话,可以:每小时一次请求属于非常轻的流量。正如我们 2026 年 10 月 19 日的测试所示,ipinfo.io 无需 token 即可响应基本请求,同时也为更高流量提供 token。如果你要一次性测试大量 IP,请创建一个免费 token 并将其加入请求,或者单独使用 api.ipify.org。
我应该测试出口 IP 还是仪表盘中的主机?
出口 IP。你连接的主机可能是名称或地址,与网站看到的 IP 不同。请通过代理运行检查,并使用 api.ipify.org 返回的 IP。这个出口 IP 也是需要加入允许列表或在 WHOIS 中查询的那个 IP。
我可以在依赖某个 SteadyProxy IP 之前先对它进行测试吗?
可以,而且我们建议这样做。从 US$2.24 订购一个 IP,使用 30 天,运行 Python 脚本一天,然后查看日志。根据我们的退款政策,交付后 24 小时内无法正常工作、且我们无法修复或更换的 IP,会全额退还到你的余额。
本指南使用了哪些来源? (5)
- ipify API — ipify (2026-10-19)
- IPinfo 开发者文档 — IPinfo (2026-10-19)
- Requests 高级用法:代理与超时 — Requests (2026-10-19)
- curl 手册页 — curl (2026-10-19)
- RIPE 数据库文档:country 属性 — RIPE NCC (2026-10-19)