适用场景
无论是个人博客、企业服务还是 CDN 加速节点,网站的访问速度直接影响用户体验。传统的测速工具通常需要手动操作或依赖图形界面,无法方便地集成到自动化脚本或监控系统中。网站测速诊断 API提供了一次接口请求即可获取 DNS 解析、TCP 连接、SSL 握手、首字节时间(TTFB)、总耗时以及重定向链和 SSL 证书摘要的能力,非常适合以下场景:
- 自动化监控:定时检查目标站点各阶段的响应耗时,及时发现性能劣化。
- 批量检测:结合脚本对多个 URL 进行并发或顺序测速,生成报告。
- 故障排查:当用户反馈“网站打不开”时,快速从服务器端判断是 DNS 问题、网络问题还是 SSL 握手失败。
- CI/CD 流水线:在部署后验证新节点或新域名的网络连通性和延迟。
接口能力边界
本 API 的QPS 限制为 2 次/秒,即每秒最多发送 2 个请求,超出会收到限流错误(HTTP 429)。单次请求可以覆盖以下六个维度的指标:
- DNS 解析时间:从发起请求到 DNS 域名解析完成。
- TCP 连接时间:三次握手耗时。
- SSL 握手时间:TLS 协商阶段耗时(如果目标是 HTTPS)。
- TTFB:从发起请求到收到第一个响应字节的时间。
- 总耗时:整个请求从开始到结束的时间。
- 重定向链与最终 URL:自动跟踪 301/302 等重定向,记录跳转次数和最终地址。
此外还会提取响应头中的Content-Type、Content-Length(页面体积)以及 SSL 证书的签发者、有效期等摘要信息(素材中未返回,但文档有提及,以官方文档为准)。
请求参数与鉴权
请求方法 & 地址
- 方法:GET
- URL:
https://v1.apizero.cn/api/site-check
Query 参数
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
url | 是 | string | 目标网站的 URL。如果省略协议,则自动补https://。例如传入baidu.com实际请求的 URL 会变为https://baidu.com。 |
Header 参数
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
Authorization | 是 | string | 用于身份认证的 API Key。具体获取方式请参考官方文档。 |
素材中 curl 示例使用了-H "X-API-Key: $APIZERO_API_KEY",但按规范应使用Authorization头,实际以文档为准。下面示例中均使用Authorization: Bearer <YOUR_API_KEY>格式。
最小可运行示例:curl
以下 curl 命令演示了最简单的请求方式。你需要将<YOUR_API_KEY>替换为真实的密钥,并将url参数替换为待测网站地址。
curl -sS \ -X GET \ -H "Authorization: Bearer YOUR_API_KEY" \ "https://v1.apizero.cn/api/site-check?url=example.com"请求说明:
-sS:静默模式但保留错误输出。-X GET:显式指定 GET 方法(curl 默认也是 GET,可省略)。-H添加鉴权头。- URL 参数中
url=example.com会自动补全为https://example.com。
执行后你会收到类似下面的 JSON 响应(已格式化):
{ "code": 0, "msg": "成功", "data": { "url": "http://example.com", "final_url": "https://example.com/", "http_code": 200, "redirect_count": 1, "timing": { "dns_ms": 23.1, "connect_ms": 28.4, "ssl_ms": 65.2, "ttfb_ms": 132.5, "total_ms": 140.3 } } }使用 Python 代码接入
对于需要在程序中集成测速功能的开发者,Python 的requests库是最方便的选择。以下是一个最小可运行的 Python 脚本,包含完整的错误处理:
import requests import sys API_URL = "https://v1.apizero.cn/api/site-check" API_KEY = "YOUR_API_KEY" # 替换为真实密钥 def site_check(url: str) -> dict: """调用网站测速诊断 API,返回 JSON 数据""" headers = { "Authorization": f"Bearer {API_KEY}" } params = { "url": url } try: resp = requests.get(API_URL, headers=headers, params=params, timeout=10) resp.raise_for_status() return resp.json() except requests.exceptions.RequestException as e: print(f"请求出现异常: {e}", file=sys.stderr) sys.exit(1) def main(): if len(sys.argv) < 2: print("用法: python site_check.py <URL>") sys.exit(1) target = sys.argv[1] result = site_check(target) if result.get("code") != 0: print(f"API 返回错误: code={result.get('code')}, msg={result.get('msg')}") return data = result["data"] timing = data["timing"] print(f"目标 URL: {data['url']}") print(f"最终 URL: {data['final_url']}") print(f"HTTP 状态码: {data['http_code']}") print(f"重定向次数: {data['redirect_count']}") print("--- 耗时明细 (毫秒) ---") print(f"DNS: {timing['dns_ms']}") print(f"TCP: {timing['connect_ms']}") print(f"SSL: {timing['ssl_ms']}") print(f"TTFB: {timing['ttfb_ms']}") print(f"总耗时: {timing['total_ms']}") if __name__ == "__main__": main()运行方式:
python site_check.py baidu.com该脚本会打印出测速结果各阶段的毫秒数。你可以将其集成到定时任务或 CI 脚本中,依据耗时阈值进行告警。
返回值详细解读
从素材给出的示例响应可知,最顶层是数组(但实际单次请求返回的是对象,文档示例中用了数组包裹单个对象,实际调用直接返回 JSON 对象)。以实际响应为准。各字段含义如下:
| 字段 | 类型 | 说明 |
|---|---|---|
code | int | 业务状态码。0 表示成功,非 0 表示错误。 |
msg | string | 与 code 对应的描述信息。 |
data.url | string | 请求时传入的原始 URL(可能未补全协议)。 |
data.final_url | string | 经过重定向后的最终 URL。 |
data.http_code | int | 最终请求的 HTTP 状态码(如 200、301 等)。 |
data.redirect_count | int | 重定向跳转次数。 |
data.timing.dns_ms | float | DNS 解析耗时,单位毫秒。 |
data.timing.connect_ms | float | TCP 连接耗时(不含 DNS),单位毫秒。 |
data.timing.ssl_ms | float | SSL 握手耗时(如果未使用 HTTPS 则该值为 0),单位毫秒。 |
data.timing.ttfb_ms | float | 首字节时间(TTFB),单位毫秒。 |
data.timing.total_ms | float | 从请求到响应结束的总耗时,单位毫秒。 |
注意:素材未给出 SSL 摘要和页面体积字段,这些可能需要在响应data中额外返回,具体请参考官方文档。
常见错误处理
1. HTTP 401 Unauthorized
- 原因:
Authorization头缺失或提供的 API Key 无效。 - 解决:检查密钥是否正确,并确保使用了正确的 Header 名称(
Authorization而非X-API-Key,以文档为准)。
2. HTTP 400 Bad Request
- 原因:缺少必填参数
url,或url格式无法解析。 - 解决:检查 Query 参数,并确保 URL 字符串正确编码(curl 会自动编码,Python 的
requests也会编码)。
3. HTTP 429 Too Many Requests
- 原因:QPS 超过 2 次/秒。
- 解决:在短时间内的请求之间加入至少 500ms 的间隔,或者使用队列控制并发。
4. 业务状态码非 0
- 原因:API 内部处理出错,例如目标网站无法访问、DNS 解析失败、连接超时等。
- 解决:打印
msg字段获取具体原因,并检查目标 URL 是否可达。
工程化注意事项
- API Key 管理:不要将密钥硬编码在代码中。建议通过环境变量注入(例如
os.getenv("SITE_CHECK_API_KEY"))或使用 .env 文件。 - 超时设置:网络请求可能因目标网站响应慢而卡住,Python 中建议设置
timeout(如 10 秒)。curl 可加--connect-timeout 5 --max-time 15。 - 限流处理:QPS 2/s 意味着批量测速时需要控制并发数。可以使用
time.sleep(0.6)间隔,或使用令牌桶算法。 - 重定向跟踪:API 已经服务端跟踪了重定向链,客户端不需要额外设置
allow_redirects=False。但需要注意:如果目标网站重定向次数超过 API 内部限制,可能返回部分结果,具体以文档为准。 - 结果存储:将测速结果结构化存入数据库(如 InfluxDB 或 Prometheus),便于长期趋势分析。
- 日志记录:记录每次请求的 URL、状态码和耗时,方便排查问题。
参考文档
- 官方文档页:https://apizero.cn/aidocs/site-check
- 原始文档(raw):https://apizero.cn/aidocs/site-check/raw.md
本文中的 API 参数、响应字段和 QPS 限制均以上述文档为准,若存在差异请以官方最新说明为准。