引言
Whois 是互联网基础设施中极为重要的协议,用于查询域名是否已被注册、注册人信息、注册商、到期日期等关键数据。对于开发者而言,手动通过命令行whois example.com查询虽简单,却难以集成到自动化流程中。随着 API 经济的兴起,Whois 域名查询 API成为了构建域名监控、品牌保护、安全研究等应用的首选方案。
以 ApiZero 极数本源 这样的聚合 API 市场为例,它们将数百个高质量 API(包括 Whois )统一接入,开发者只需5分钟即可完成认证、获取密钥并调用。本文将从接口原理到代码实战,带你完整掌握 Whois API 的使用。
一、Whois 域名查询 API 简介
Whois API 是对传统 Whois 协议的 RESTful 封装,返回结构化 JSON 数据,通常包含以下核心信息:
| 字段 | 说明 | 示例 |
|---|---|---|
domainName | 查询的域名 | example.com |
registrar | 注册商名称 | NameCheap, Inc. |
registrant | 注册人(可能被隐私保护隐藏) | Whois Privacy Service |
creationDate | 注册时间 | 1997-09-15T04:00:00Z |
expirationDate | 到期时间 | 2028-09-14T04:00:00Z |
nameServers | 权威 DNS 服务器列表 | ["ns1.example.com", "ns2.example.com"] |
status | 域名状态(如 clientTransferProhibited) | ["clientTransferProhibited"] |
API 一般通过 GET 请求调用,传入域名参数,返回 JSON。聚合平台还会提供统一的鉴权、计费和限流机制。
二、API 调用准备
2.1 获取 API Key
大多数商业 API 需要注册并获取密钥。以 ApiZero 为例(假设其 Whois API 位于/marketplace/whois),流程如下:
- 注册账号并登录
- 进入 Whois API 详情页(素材中提到的页面)
- 订阅或获取免费额度,得到 API Key(如
sk-xxxx) - 阅读文档,了解请求端点和参数约束
2.2 接口与参数
假设通用端点为:
GET https://api.apizero.cn/v1/whois?domain={domain}&apikey={apikey}常用参数:
| 参数 | 必填 | 说明 |
|---|---|---|
domain | 是 | 要查询的域名(如 example.com) |
apikey | 是 | 认证密钥,通常放在 Header 而非 URL 中更安全 |
verbose | 否 | 是否返回完整原始 Whois 文本(true/false),默认 false |
format | 否 | 响应格式,通常固定为 json |
最佳实践:将 API Key 配置为环境变量,避免硬编码。
三、接口调用示例
3.1 使用 curl 快速测试
# 假设 API Key 已设置为环境变量 curl -s "https://api.apizero.cn/v1/whois?domain=example.com&apikey=$API_KEY" | jq .返回的 JSON 示例:
{ "domainName": "EXAMPLE.COM", "registrar": "RESERVED-Internet Assigned Numbers Authority", "creationDate": "1995-08-14T04:00:00Z", "expirationDate": "2026-08-13T04:00:00Z", "nameServers": [ "A.IANA-SERVERS.NET", "B.IANA-SERVERS.NET" ], "status": ["clientDeleteProhibited", "clientTransferProhibited", "clientUpdateProhibited"], "registrant": "Internet Assigned Numbers Authority", "rawWhois": null }3.2 Python 实战代码
以下是一个完整的 Python 脚本,用于查询域名 Whois 信息并打印关键字段:
import os import requests from typing import Dict, Any API_KEY = os.getenv("WHOIS_API_KEY", "your_api_key_here") API_URL = "https://api.apizero.cn/v1/whois" def query_whois(domain: str) -> Dict[str, Any]: """ 查询域名的 Whois 信息 :param domain: 域名,如 "example.com" :return: 解析后的 JSON 字典 """ headers = { "Authorization": f"Bearer {API_KEY}", "Accept": "application/json" } params = { "domain": domain, "verbose": "false" } try: response = requests.get(API_URL, headers=headers, params=params, timeout=10) response.raise_for_status() # 如果状态码不是200,抛出异常 data = response.json() return data except requests.exceptions.RequestException as e: print(f"请求失败: {e}") return {} def main(): domain = input("请输入要查询的域名 (例如 example.com): ").strip() if not domain: domain = "example.com" result = query_whois(domain) if result: print(f"域名: {result.get('domainName', 'N/A')}") print(f"注册商: {result.get('registrar', 'N/A')}") print(f"创建日期: {result.get('creationDate', 'N/A')}") print(f"到期日期: {result.get('expirationDate', 'N/A')}") print(f"DNS 服务器: {', '.join(result.get('nameServers', []))}") else: print("未查询到有效信息,请检查域名和 API Key。") if __name__ == "__main__": main()运行说明:
- 安装依赖:
pip install requests - 设置环境变量
WHOIS_API_KEY(或在代码中直接替换) - 执行脚本,输入域名即可
3.3 JavaScript (Fetch) 调用
const API_KEY = process.env.WHOIS_API_KEY || 'your_api_key_here'; const url = `https://api.apizero.cn/v1/whois?domain=example.com`; fetch(url, { headers: { 'Authorization': `Bearer ${API_KEY}`, 'Accept': 'application/json' } }) .then(response => { if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); return response.json(); }) .then(data => { console.log('Whois 数据:', data); }) .catch(error => { console.error('请求失败:', error); });四、响应数据结构解析
返回的 JSON 对象常见字段及处理方式:
| 字段名 | 类型 | 说明 | 使用场景 |
|---|---|---|---|
domainName | string | 查询的域名(大写) | 用于展示 |
registrar | string | 当前注册商 | 域名迁移时参考 |
creationDate | string (ISO 8601) | 注册时间 | 计算域名年龄 |
expirationDate | string | 到期时间 | 监控续费预警 |
nameServers | array | 名称服务器列表 | DNS 变更检查 |
status | array | 域名状态码列表 | 检测域名是否被锁定 |
registrant | string | 注册人名称(可能被隐藏) | 联系域名所有者 |
rawWhois | string | 原始 Whois 文本(verbose=true时) | 深度解析 |
注意:creationDate和expirationDate通常以 UTC 格式返回,需要转换为本地时间。例如在 Python 中可以:
from datetime import datetime exp_date_str = result.get('expirationDate') if exp_date_str: exp_dt = datetime.fromisoformat(exp_date_str.replace('Z', '+00:00')) print(f"到期时间(本地): {exp_dt.astimezone()}")五、实际应用场景
5.1 域名到期监控
通过定时任务(如 crontab)调用 Whois API,检查多个域名的到期日期,到期前 30 天自动发送邮件或钉钉通知。示例:
# 在上一节的 main 函数基础上,增加到期判断 import datetime exp_date = result.get('expirationDate') if exp_date: exp = datetime.datetime.fromisoformat(exp_date.replace('Z', '+00:00')) days_left = (exp - datetime.datetime.utcnow()).days if days_left < 30: print(f"⚠️ 域名 {domain} 将在 {days_left} 天后到期,请及时续费!")5.2 域名注册信息变更检测
定期调用并将结果与上次缓存对比,若注册商、DNS 服务器发生变化,触发告警。这可用于发现域名劫持或配置错误。
5.3 批量域名估值与交易分析
结合 Whois 中的创建时间、过期时间等,评估域名价值。许多后端系统会调用 Whois API 作为数据源。
六、聚合 API 市场的优势(以 ApiZero 为例)
参考素材中介绍的 ApiZero 极数本源,它聚合了天气、IP、翻译、AI、Whois 等数百个 API,并提供以下便利:
- 统一认证:一个 API Key 可调用所有 API,无需逐一注册
- 在线调试:在网页上即可测试接口,预览响应(素材中提及“在线调试与调用示例”)
- 稳定计费:按调用量付费,免费额度充足
- 标准化文档:每个 API 都有相似的结构,降低学习成本
- 5分钟接入:从注册到首次调用,通常不超过5分钟(素材所述)
对于开发者而言,与其逐一对接不同服务商的 Whois API,不如通过一个聚合市场快速集成,后续维护也更简单。
七、常见问题与最佳实践
7.1 请求频率限制
大部分免费或低价 Whois API 会限制每分钟请求数(如 60次/分钟)。建议:
- 在代码中添加指数退避重试机制
- 使用缓存:对同域名一天内只查一次
- 购买更高流量包
7.2 数据隐私问题
由于 GDPR 等法规,很多域名的注册人信息被隐藏(显示为 Redacted 或代理)。API 返回的registrant字段可能非真实所有者,需要留意。
7.3 错误码处理
常见 HTTP 状态码:
| 状态码 | 含义 | 处理方式 |
|---|---|---|
| 200 | 成功 | 解析 JSON |
| 400 | 参数错误 | 检查 domain 格式 |
| 401 | 未授权 | 检查 API Key |
| 403 | 无权限 | 套餐不足或未订阅 |
| 429 | 频率超限 | 等待后重试 |
| 500 | 服务端错误 | 重试或联系客服 |
7.4 代码中 API Key 管理
- 永远不要将 API Key 硬编码在代码公开仓库中
- 使用环境变量或密钥管理服务(如 AWS Secrets Manager)
- 前端调用时通过后端代理,避免暴露 Key
结语
Whois 域名查询 API 是网络基础设施的实用组件,无论你是运维人员、安全工程师还是全栈开发者,都能从中受益。结合聚合 API 市场(如 ApiZero)的便捷性,你可以在几分钟内搭建起自动化域名信息查询与监控系统。本文提供的 Python、JavaScript 示例均已可运行,你可以直接复制到项目中使用。
最后,牢记 API 调用的最佳实践:保护密钥、处理错误、合理缓存。让 Whois 数据为你的应用赋能,提升自动化与智能水平。