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

发布时间:2026/6/2 6:18:18

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?domainexample.com实际接入时请以接口文档中的正式请求地址和认证方式为准。常见请求参数参数名类型是否必填说明domainstring是要查询的域名例如 example.com建议传入主域名不要直接传完整 URL。例如https://www.example.com/article?id1建议先清洗成example.com这样可以减少查询失败或结果不一致的问题。四、返回字段说明一次 Whois 查询返回的数据通常会包含以下字段字段说明domain查询后的标准域名suffix域名后缀例如 com、cn、netis_reg域名是否已注册registrar注册商whois_serverWhois 查询服务器creation_date域名创建时间expiration_date域名到期时间name_serverDNS 服务器列表domain_status域名状态dnssecDNSSEC 状态其中最常用的是这几个字段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 调用示例便于在后端服务中快速测试。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, paramsparams, headersheaders, timeout10) 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?id1在查询 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?id1)) # example.com这个小步骤看起来不起眼但能明显减少接口调用失败和重复查询。八、建议加缓存别每次都查Whois 数据不是每秒都会变化。对于大多数业务来说没有必要每次页面刷新都调用一次接口。比较合理的做法是加缓存普通查询结果缓存 12 小时或 24 小时即将过期的域名缩短缓存时间查询失败的结果缓存几分钟避免频繁重试用户手动刷新时再强制更新如果使用 Redis可以按域名作为缓存 keywhois:example.com伪代码如下def get_domain_profile_with_cache(domain: str): cache_key fwhois:{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_asciiFalse) ) 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 ServerDNSSEC状态信息域名状态查询时间数据来源状态这样展示更清晰也方便用户快速找到重点。十二、实际接入时的注意点1. 不要把 Whois 当成实时数据Whois 信息可能存在缓存、同步延迟或注册局返回差异。它适合做参考和辅助判断不适合当成绝对实时状态。2. 不同后缀返回字段可能不完全一致不同顶级域名的 Whois 数据结构可能有差异比如.com、.cn、.org返回内容可能不完全一样。所以代码里不要强依赖某个字段一定存在。3. 注意隐私保护现在很多域名会开启隐私保护注册人、邮箱、电话等信息可能不会完整返回。如果接口返回为空不一定代表域名异常也可能是隐私保护导致。4. 注意接口限流如果要批量查询大量域名建议控制并发和频率。不要直接开几十个线程同时打接口否则容易触发限流也会影响系统稳定性。5. 记录查询日志建议记录这些信息查询域名查询时间查询结果状态接口耗时是否命中缓存异常信息这些日志在排查问题时很有用。十三、总结Whois 域名查询接口看起来只是一个简单的 GET 请求但在实际项目中它能支撑很多实用功能。比如域名注册信息展示域名到期提醒站点资产盘点建站工具域名校验风控系统域名画像DNS 配置辅助检查真正落地时不建议只停留在“调通接口”这一步。更好的做法是把它封装成一个稳定的内部能力前面做域名清洗中间做统一字段映射后面加缓存、异常处理和日志记录。这样接入一次后续多个业务模块都能复用。对于域名管理、运维平台、SaaS 系统来说这类基础能力非常值得提前建设。

相关新闻