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. 格式化并输出查询结果
相关推荐
wanhengidc5 小时前
服务器租用有何优点
运维·服务器·安全·web安全
方也_arkling6 小时前
【Java-Day08】static / final / 枚举
java·开发语言
橙淮6 小时前
Spring Bean作用域与生命周期全解析
java·spring
csdn_aspnet6 小时前
Gemini赋能安全工程师,自动写PoC脚本,探索Gemini在网络安全领域辅助漏洞验证与POC生成的实战路径
安全·web安全·prompt·poc·gemini·工程师
风吹夏回6 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
Chengbei116 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_1126 小时前
web-第一次课后作业
java·开发语言·idea
小熊Coding6 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋96 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本7 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven