WHOIS 不返回 .eu 域名的注册、到期和更新日期,该如何获取?
结论
如果 whois.eu:43 的完整原始响应没有注册、到期或更新日期,更换 Python WHOIS 库也无法补出这些字段。
自有域名应优先通过注册商控制台查询日期。需要自动化时,可以确认注册商是否提供可授权访问的 API。对于他人的 .eu 域名,不能保证存在公开、可自动查询全部日期的接口。网页查询和端口 43 查询返回的字段也可能不同。
为什么代码没有报错,却拿不到日期?
示例通过 socket 发送域名,然后循环读取服务器响应,没有解析日期字段。需要先区分两种情况:
- 原始响应包含日期,但某个 WHOIS 库没有解析出来:检查字段格式和解析规则。
- 原始响应本身没有日期:需要更换数据来源,修改解析器没有作用。
没有错误或警告,只说明程序这次执行时没有抛出异常,不代表服务器返回了业务需要的所有字段。题目没有附上完整响应,因此无法仅凭代码确认具体返回了哪些内容。
recv(4096) 表示每次最多读取 4096 字节。原代码会持续读取,直到 recv() 返回空字节串,所以整个响应并没有被限制在 4096 字节以内。
先确认是否完整读取了 WHOIS 响应
下面的代码用于查看原始响应。它增加了超时设置,使用 sendall() 发送完整请求,并通过上下文管理器关闭连接。代码无法增加服务器没有提供的日期字段。
import socket
def get_raw_whois(domain, timeout=10):
chunks = []
with socket.create_connection(("whois.eu", 43), timeout=timeout) as s:
s.sendall((domain + "\r\n").encode("utf-8"))
while True:
data = s.recv(4096)
if not data:
break
chunks.append(data)
return b"".join(chunks).decode("utf-8")
print(get_raw_whois("example.eu"))
timeout=10 是示例中的超时设置,可以根据网络条件调整。如果发生超时,应将本次查询标记为失败,不要误判为“查询成功但日期为空”。
提问中粘贴的代码缺少 Python 必需的缩进。如果实际运行的脚本正常,可能是粘贴时丢失了格式;上面的示例已补齐缩进。
如何获取需要的日期?
自己管理的域名:向注册商查询
登录购买或管理该域名的注册商账户,查看域名详情中的到期时间、续费时间和可用的注册记录。如果要自动生成续费提醒,可以向注册商确认:
- 是否提供域名详情 API,以及是否支持
.eu。 - API 凭据是否有权读取目标域名。
- 返回的日期分别代表注册局到期时间、账户续费截止时间,还是其他业务时间。
- 是否提供注册日期和最后更新日期,以及“更新”具体指哪类变更。
EURid 的续费帮助建议联系注册商,确认域名何时到期以及到期后的处理方式,因为不同注册商可能采用不同政策。EURid:如何及何时续费域名
注册日期、到期日期和更新日期应分别处理。接口提供到期日期,不意味着它也提供另外两个字段。
他人的域名:以公开查询实际披露的内容为准
可以按正常流程使用 EURid 的网页 WHOIS,查看页面是否披露所需日期。题目已经排除了网页抓取,因此这只能用于人工查询,不能作为现有脚本的自动化方案。
EURid 的帮助说明,网页 WHOIS 查询可能要求完成 CAPTCHA。EURid:如何查询域名关联的 name servers
如果公开渠道没有提供日期,可以联系注册商或 EURid,询问是否有适用于该用途的数据访问方式。但不能预设对方会披露第三方域名的日期,或提供批量查询权限。
使用其他 API 前:确认数据来源和覆盖范围
换用 RDAP 或第三方域名查询 API 前,需要确认服务支持 .eu,并且实际返回目标日期字段。协议或接口名称本身不能保证数据完整。
如果服务只能返回历史记录,还应检查采集时间。历史到期日期可能已经因续费或其他操作而改变,不适合作为当前续费提醒的唯一依据。
日期缺失时,程序应该怎么处理?
将日期保留为空值,并记录来源和缺失原因,例如“本次 WHOIS 响应未提供到期日期”。网络错误、查询失败和字段未披露应分别记录。
不要用注册日期加一年推算当前到期日期。EURid 的规则允许不同的注册年限,并规定了续期机制,仅有注册日期不足以确定当前注册期限。EURid:域名规则
用于续费管理时,还应分别保存注册局到期时间和注册商要求的付款或续费截止时间,避免提醒时间选错。
备注:内容仅供参考。
