Python安全开发之简易whois查询

核心代码

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对象
    这个工具的主要工作流程是:
  1. 通过命令行参数接收要查询的域名
  2. 使用whois库查询域名信息
  3. 处理可能出现的异常情况
  4. 格式化并输出查询结果
相关推荐
左左右右左右摇晃2 小时前
Java笔记 —— 泛型
java·笔记
Aloha_up2 小时前
spring的几个八股
java·后端·spring
阿钱真强道2 小时前
26 Python 分类:一个模型不够稳怎么办?一文认识组合分类
python·随机森林·分类·提升·组合分类·装袋·投票分类器
逸Y 仙X2 小时前
文章九:ElasticSearch索引字段常见属性
java·大数据·服务器·数据库·elasticsearch·搜索引擎
左左右右左右摇晃2 小时前
Java笔记——多态
java·笔记·python
十月南城2 小时前
安全与合规检查表——隐私、审计与日志合规的关键条款与落地建议
安全
空空潍2 小时前
2026年IDEA、PyCharm等专业版学生免费申请教育许可证
java·ide·intellij-idea
qyzm2 小时前
天梯赛练习题
数据结构·python·算法·贪心算法
爱编程的小吴2 小时前
LangChain基础入门:DocumentLoader加载PDF/Markdown文档实战
python·langchain·pdf