核心代码
python
# 导入必要的库
import whois # 用于查询域名的WHOIS信息,提供域名注册信息查询功能
import sys # 提供对Python解释器使用或维护的变量以及与解释器强烈交互的函数的访问
import argparse # 用于解析命令行参数和选项
from datetime import datetime # 从datetime模块导入datetime类,用于处理日期和时间
def get_whois_data(domain):
"""
获取指定域名的WHOIS信息
参数:
domain (str): 要查询的域名
返回值:
dict: 包含域名WHOIS信息的字典对象,如果查询失败则返回None
功能说明:
使用python-whois库查询域名的注册信息,包括注册商、创建日期、过期日期等
通过异常处理确保程序在查询失败时不会崩溃
"""
try:
# 调用whois.whois()方法查询域名信息
# whois.whois()是python-whois库的核心方法,它会向相应的WHOIS服务器发送请求
whois_info = whois.whois(domain)
return whois_info
except whois.parser.PywhoisError as e:
# 处理常见的WHOIS查询错误,如域名不存在或TLD(顶级域)不支持
# 将错误信息输出到标准错误流(sys.stderr),便于错误追踪
print(f"[!] 查询 '{domain}' 失败: {e}", file=sys.stderr)
return None
except Exception as e:
# 处理其他未知的异常情况
# 使用sys.stderr确保错误信息被正确记录,即使标准输出被重定向
print(f"[!] 发生未知错误: {e}", file=sys.stderr)
return None
def print_whois_info(info):
"""
格式化并打印WHOIS信息
参数:
info (dict): 从get_whois_data获取的WHOIS信息字典
功能说明:
1. 检查输入的有效性
2. 格式化关键域名信息
3. 格式化联系人信息
4. 以清晰的格式输出所有信息
"""
if not info or info.status == "unknown":
print("[!] 无法获取该域名的whois信息")
return
def format_field(value):
"""
格式化字段值,特别是处理列表类型的值
参数:
value: 待格式化的值,可能是字符串、列表或其他类型
返回值:
格式化后的字符串
"""
if isinstance(value, list):
# 如果值是列表,则将其转换为逗号分隔的字符串
# 这对于处理多个名称服务器等情况很有用
return ",".join([str(v) for v in value])
return value
# 定义要显示的关键信息及其对应的WHOIS数据字段
key_info = {
"Domain Name": info.domain_name, # 域名名称
"Registrar": info.registrar, # 注册商
"WHOIS Server": info.whois_server, # WHOIS服务器
"Creation Date": info.creation_date, # 创建日期 - 使用datetime对象表示
"Expiration Date": info.expiration_date, # 过期日期 - 使用datetime对象表示
"Last Updated": info.updated_date, # 最后更新日期 - 使用datetime对象表示
"Name Servers": format_field(info.name_servers), # 名称服务器
}
print("--------------------------------------------------")
print("Whois信息:")
# 打印关键信息,使用左对齐格式化使输出更整齐
for key, value in key_info.items():
print(f"{key:<20}: {value}")
# 定义联系人相关信息
contact_info = {
"Registrant Name": info.name, # 注册人姓名
"Registrant Org": info.org, # 注册人组织
"Registrant Country": info.country, # 注册人国家
}
# 只有当存在联系人信息时才打印
if any(contact_info.values()):
print("联系人信息:")
for key, value in contact_info.items():
if value: # 只打印非空值
print(f"{key:<20}: {value}")
def main():
"""
主函数:程序入口点
功能:
1. 解析命令行参数
2. 调用WHOIS查询函数
3. 打印结果
"""
# 创建ArgumentParser对象用于解析命令行参数
parser = argparse.ArgumentParser(description="查询域名的whois信息")
# 添加域名参数,-d和--domain都是有效的命令行选项
# required=True表示这是必填参数
# help参数提供帮助信息
parser.add_argument("-d", "--domain", required=True, help="目标域名")
# 解析实际传入的命令行参数
args = parser.parse_args()
# 输出查询提示信息
print(f"[+] 正在查询 '{args.domain}' 的whois信息...")
print("-"*50)
# 获取WHOIS信息
whois_info = get_whois_data(args.domain)
# 如果成功获取信息,则打印
if whois_info:
print_whois_info(whois_info)
# 输出结束分隔线
print("-"*50)
# 程序入口点检查
# 当脚本直接运行时,__name__等于"__main__",此时执行main()函数
# 当脚本被导入作为模块时,这部分代码不会执行
if __name__ == "__main__":
main()
whois 包
作用: 用于查询域名的WHOIS信息,即域名注册信息。
主要功能:
- 查询域名的注册商、注册日期、过期日期等信息
- 支持多种顶级域名(TLD)的查询
- 自动识别并连接到相应的WHOIS服务器
常用属性:
- domain_name: 域名名称
- registrar: 注册商
- creation_date: 创建日期 (datetime对象)
- expiration_date: 过期日期 (datetime对象)
- updated_date: 最后更新日期 (datetime对象)
- name_servers: 名称服务器列表
- status: 域名状态
- emails: 注册邮箱
- name, org, country: 注册人信息
sys 包
作用: 提供对Python解释器相关变量和函数的访问。
在本代码中的用途:
- sys.stderr: 标准错误输出流,用于输出错误信息
- 优点:即使标准输出被重定向,错误信息仍能正常显示
其他常用功能:
- sys.argv: 命令行参数列表
- sys.exit(): 退出程序
- sys.path: Python模块搜索路径
datetime 包
作用: 用于处理日期和时间。
在本代码中的用途:
- datetime 类:表示具体的日期和时间
- WHOIS查询返回的日期字段(如创建日期、过期日期)都是datetime对象
- 可以进行日期计算、格式化等操作
常用方法:
- datetime.now(): 获取当前时间
- strftime(format): 格式化日期时间为字符串
- 日期比较:可以直接使用 <, >, == 等运算符比较两个datetime对象
这个工具的主要工作流程是:
- 通过命令行参数接收要查询的域名
- 使用whois库查询域名信息
- 处理可能出现的异常情况
- 格式化并输出查询结果