Whois 域名查询 API 接入实战:用一个 GET 请求获取域名注册信息

在做域名管理、建站工具、资产监控、到期提醒、风控审核时,经常会遇到一个很基础但又很关键的问题:一个域名到底有没有被注册?注册商是谁?什么时候创建?什么时候到期?DNS 服务器配置是否正常?

这些信息通常来自 Whois 数据。Whois 本身是一种用于查询域名、IP 及相关注册信息的协议,传统 Whois 查询通常依赖 43 端口,也可以通过网页工具或接口服务进行查询。对于业务系统来说,直接调用结构化 API 会比手动查 Whois 更适合工程化落地。

本文整理一个 Whois 域名查询 API 的接入思路,重点放在实际项目中怎么用、返回字段怎么理解,以及后端封装时需要注意哪些问题。

一、Whois 查询接口能解决什么问题

Whois 域名查询接口的核心作用,是把原本分散、不太适合程序直接处理的域名注册信息,整理成结构化 JSON 数据。

常见可以拿到的信息包括:

  • 域名是否已注册
  • 域名后缀
  • Whois Server
  • 注册商
  • 创建时间
  • 到期时间
  • DNS 服务器
  • 域名状态
  • DNSSEC 状态

接口通过 GET 请求查询域名注册状态、注册商、创建时间、到期时间、DNS 服务器等信息,并将结果返回为结构化 JSON,适合接入域名管理后台、监控系统或建站类工具。

二、适合接入的业务场景

1. 域名管理后台

如果系统里有很多客户域名,后台通常需要展示:

  • 域名当前是否可用
  • 域名注册商
  • 域名创建时间
  • 域名到期时间
  • DNS 服务器列表

这些信息如果靠人工维护,很容易过期。接入 Whois 查询接口后,可以在用户录入域名时自动补全,也可以定时刷新。

2. 域名到期提醒

很多站点故障不是代码问题,而是域名过期导致解析失效。

通过接口拿到 expiration_date 后,可以在系统里做定时任务:

  • 距离到期 30 天提醒
  • 距离到期 7 天提醒
  • 距离到期 1 天高优提醒
  • 已过期域名进入异常列表

对于企业站点、SaaS 系统、营销落地页来说,这个功能非常实用。

3. 建站工具和 SaaS 系统

用户在绑定自定义域名时,系统可以先查一次 Whois 信息,辅助判断:

  • 域名是否存在
  • 域名是否已经注册
  • DNS 是否已配置
  • 域名状态是否异常

这样可以减少用户填错域名、绑定无效域名带来的后续问题。

4. 安全风控和资产盘点

在风控系统中,域名的注册时间、注册商、DNS 服务器、域名状态都可以作为辅助判断依据。

例如:

  • 刚注册不久的域名,需要提高风险评分
  • DNS 服务器频繁变化的域名,需要重点关注
  • 即将过期的业务域名,需要纳入资产巡检

Whois 信息不能单独决定风险,但非常适合作为域名画像的一部分。

三、接口请求方式

该类接口通常使用 GET 请求,传入域名参数后返回 JSON 数据。

示例形式如下:

复制代码
GET /whois?domain=example.com

实际接入时,请以接口文档中的正式请求地址和认证方式为准。

常见请求参数:

参数名 类型 是否必填 说明
domain string 要查询的域名,例如 example.com

建议传入主域名,不要直接传完整 URL。

例如:

复制代码
https://www.example.com/article?id=1

建议先清洗成:

复制代码
example.com

这样可以减少查询失败或结果不一致的问题。

四、返回字段说明

一次 Whois 查询返回的数据,通常会包含以下字段:

字段 说明
domain 查询后的标准域名
suffix 域名后缀,例如 com、cn、net
is_reg 域名是否已注册
registrar 注册商
whois_server Whois 查询服务器
creation_date 域名创建时间
expiration_date 域名到期时间
name_server DNS 服务器列表
domain_status 域名状态
dnssec DNSSEC 状态

其中最常用的是这几个字段:

1. is_reg

表示域名是否已经被注册。

如果是建站工具,可以用它判断用户输入的域名是否真实存在;如果是域名查询工具,可以用它判断域名是否可能可注册。

2. registrar

表示域名注册商。

这个字段在企业资产管理中比较有用,能帮助运维人员判断域名在哪个服务商处管理。

3. creation_date

表示域名创建时间。

在风控场景中,域名注册时间是一个很常见的参考指标。比如一个刚注册几天的域名,和一个已经稳定使用十年的域名,风险侧重点显然不一样。

4. expiration_date

表示域名到期时间。

这个字段适合做域名到期提醒,也是 Whois 查询接口最常见的落地用途之一。

5. name_server

表示 DNS 服务器列表。

如果域名解析异常,可以结合这个字段判断当前 DNS 是否指向预期服务商。

6. dnssec

表示 DNSSEC 状态。

DNSSEC 用于增强 DNS 解析过程的安全性。不是所有域名都会开启 DNSSEC,但在一些安全要求较高的场景中,这个字段值得关注。

五、Python 调用示例

下面是一个简单的 Python 调用示例,便于在后端服务中快速测试。

python 复制代码
import requests


def query_whois(domain: str):
    url = "https://v1.apizero.cn/api/whois"

    params = {
        "domain": domain
    }

    headers = {
        "Authorization": "Bearer your_api_key"
    }

    response = requests.get(url, params=params, headers=headers, timeout=10)
    response.raise_for_status()

    return response.json()


if __name__ == "__main__":
    result = query_whois("example.com")
    print(result)

实际项目里不要把密钥直接写在代码中,建议放到环境变量或配置中心。

例如:

复制代码
import os

api_key = os.getenv("WHOIS_API_KEY")

六、后端封装建议

如果只是写一个 Demo,请求接口再打印结果就够了。

但在真实业务系统里,建议额外做一层封装,不要让业务代码直接依赖第三方接口返回结构。

推荐封装成类似这样的内部方法:

复制代码
def get_domain_profile(domain: str) -> dict:
    """
    查询域名画像信息
    """
    raw_data = query_whois(domain)

    return {
        "domain": raw_data.get("domain"),
        "registered": raw_data.get("is_reg"),
        "registrar": raw_data.get("registrar"),
        "created_at": raw_data.get("creation_date"),
        "expired_at": raw_data.get("expiration_date"),
        "name_servers": raw_data.get("name_server", []),
        "dnssec": raw_data.get("dnssec"),
        "status": raw_data.get("domain_status", [])
    }

这样做有几个好处:

第一,业务层不用关心原始字段名称。

第二,如果以后接口返回结构调整,只需要改封装层。

第三,可以在封装层统一做异常处理、缓存、日志和数据清洗。

七、域名清洗很重要

用户输入的内容不一定是标准域名,可能是这些形式:

复制代码
example.com
www.example.com
https://example.com
https://www.example.com/path?id=1

在查询 Whois 前,建议先做一次域名归一化处理。

示例代码:

复制代码
from urllib.parse import urlparse


def normalize_domain(value: str) -> str:
    value = value.strip().lower()

    if not value.startswith("http://") and not value.startswith("https://"):
        value = "http://" + value

    parsed = urlparse(value)
    host = parsed.netloc

    if host.startswith("www."):
        host = host[4:]

    return host

测试一下:

复制代码
print(normalize_domain("https://www.example.com/article?id=1"))
# example.com

这个小步骤看起来不起眼,但能明显减少接口调用失败和重复查询。

八、建议加缓存,别每次都查

Whois 数据不是每秒都会变化。对于大多数业务来说,没有必要每次页面刷新都调用一次接口。

比较合理的做法是加缓存:

  • 普通查询结果缓存 12 小时或 24 小时
  • 即将过期的域名缩短缓存时间
  • 查询失败的结果缓存几分钟,避免频繁重试
  • 用户手动刷新时再强制更新

如果使用 Redis,可以按域名作为缓存 key:

复制代码
whois:example.com

伪代码如下:

复制代码
def get_domain_profile_with_cache(domain: str):
    cache_key = f"whois:{domain}"

    cached = redis_client.get(cache_key)
    if cached:
        return json.loads(cached)

    data = get_domain_profile(domain)

    redis_client.setex(
        cache_key,
        24 * 60 * 60,
        json.dumps(data, ensure_ascii=False)
    )

    return data

这样既能提高接口响应速度,也能降低外部接口调用次数。

九、异常处理不能省

Whois 查询不是百分百稳定的。

可能遇到的问题包括:

  • 域名格式错误
  • 域名不存在
  • 查询超时
  • 上游 Whois Server 无响应
  • 接口限流
  • 网络异常
  • 返回字段为空

所以不要默认每次请求都会成功。

建议至少区分这几类异常:

复制代码
try:
    data = query_whois(domain)
except requests.Timeout:
    return {"success": False, "message": "Whois 查询超时"}
except requests.HTTPError as e:
    return {"success": False, "message": f"接口请求失败:{e}"}
except Exception as e:
    return {"success": False, "message": f"系统异常:{e}"}

在业务系统里,错误信息也不要直接暴露给普通用户,可以统一转成更友好的提示。

例如:

复制代码
暂时无法获取该域名的 Whois 信息,请稍后重试。

十、到期提醒逻辑示例

拿到域名到期时间后,可以计算剩余天数。

复制代码
from datetime import datetime, timezone


def days_until_expired(expiration_date: str) -> int:
    expired_at = datetime.fromisoformat(
        expiration_date.replace("Z", "+00:00")
    )

    now = datetime.now(timezone.utc)
    delta = expired_at - now

    return delta.days

然后根据剩余天数做提醒:

复制代码
days = days_until_expired("2026-12-01T00:00:00Z")

if days <= 0:
    level = "expired"
elif days <= 7:
    level = "danger"
elif days <= 30:
    level = "warning"
else:
    level = "normal"

在后台列表中可以显示不同状态:

剩余时间 状态
已过期 红色告警
7 天以内 高优提醒
30 天以内 普通提醒
30 天以上 正常

这个功能对运维团队很有价值,因为域名过期造成的故障通常影响范围很大,而且恢复起来不一定即时生效。

十一、前端展示建议

如果要在后台页面展示 Whois 信息,建议不要把所有字段一次性堆出来。

可以分成几块:

基础信息

  • 域名
  • 是否注册
  • 注册商
  • Whois Server

时间信息

  • 创建时间
  • 到期时间
  • 剩余天数

DNS 信息

  • Name Server
  • DNSSEC

状态信息

  • 域名状态
  • 查询时间
  • 数据来源状态

这样展示更清晰,也方便用户快速找到重点。

十二、实际接入时的注意点

1. 不要把 Whois 当成实时数据

Whois 信息可能存在缓存、同步延迟或注册局返回差异。它适合做参考和辅助判断,不适合当成绝对实时状态。

2. 不同后缀返回字段可能不完全一致

不同顶级域名的 Whois 数据结构可能有差异,比如 .com.cn.org 返回内容可能不完全一样。

所以代码里不要强依赖某个字段一定存在。

3. 注意隐私保护

现在很多域名会开启隐私保护,注册人、邮箱、电话等信息可能不会完整返回。

如果接口返回为空,不一定代表域名异常,也可能是隐私保护导致。

4. 注意接口限流

如果要批量查询大量域名,建议控制并发和频率。

不要直接开几十个线程同时打接口,否则容易触发限流,也会影响系统稳定性。

5. 记录查询日志

建议记录这些信息:

  • 查询域名
  • 查询时间
  • 查询结果状态
  • 接口耗时
  • 是否命中缓存
  • 异常信息

这些日志在排查问题时很有用。

十三、总结

Whois 域名查询接口看起来只是一个简单的 GET 请求,但在实际项目中,它能支撑很多实用功能。

比如:

  • 域名注册信息展示
  • 域名到期提醒
  • 站点资产盘点
  • 建站工具域名校验
  • 风控系统域名画像
  • DNS 配置辅助检查

真正落地时,不建议只停留在"调通接口"这一步。更好的做法是把它封装成一个稳定的内部能力:前面做域名清洗,中间做统一字段映射,后面加缓存、异常处理和日志记录。

这样接入一次,后续多个业务模块都能复用。对于域名管理、运维平台、SaaS 系统来说,这类基础能力非常值得提前建设。

相关推荐
组合缺一1 小时前
Solon 热加载与插件热插拔:Debug 模式 × E-Spi × H-Spi 全解析
java·solon·插件·plugin·热插拨
MandalaO_O1 小时前
SpringMVC:框架搭建、核心配置与前后端交
java
jerryinwuhan1 小时前
marker BiBERTo解释
java·前端·人工智能
darkb1rd1 小时前
Odysseus:私有化 AI 工作流部署实战指南
开源·github·好物分享
在繁华处1 小时前
Java从零到熟练(八):泛型与注解
java·开发语言·python
黑猫警长丶1 小时前
Git 本地操作基础
git
半夜修仙1 小时前
RabbitMQ入门概述
java·rabbitmq·java-rabbitmq
fengxin_rou1 小时前
【滑动窗口与前缀和算法实战】:LeetCode560.438 高频题深度解析
java·算法·leetcode
dusk_star1 小时前
go语言--笔记--接口
java·笔记·golang