批量域名解析

"""
Excel域名解析工具 v1.3
功能:读取Excel中的域名列,解析A记录并添加到右侧新列
"""

import pandas as pd
from dns import resolver
from dns.exception import DNSException

配置参数(可根据需要修改)

INPUT_FILE = "input.xlsx" # 输入文件名
OUTPUT_FILE = "output.xlsx" # 输出文件名
DNS_SERVERS = ["223.5.5.5", "223.6.6.6"] # 阿里公共DNS
TIMEOUT = 5 # 解析超时时间(秒)
COLUMN_NAME = "域名" # 域名列名称
IP_PATTERN = r'^((25[0-5]|2[0-4]\d|[01]?\d\d?).){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$' # IP正则

def resolve_domain(domain: str) -> str:
"""
解析域名的A记录
:param domain: 要解析的域名
:return: 逗号分隔的IP地址或错误信息
"""
resolver_obj = resolver.Resolver()
resolver_obj.nameservers = DNS_SERVERS
resolver_obj.timeout = TIMEOUT
resolver_obj.lifetime = TIMEOUT

try:
    # 清理域名输入
    clean_domain = domain.strip().lower()
    clean_domain = clean_domain.replace("https://", "").replace("http://", "")
    clean_domain = clean_domain.split("/")[0].split(":")[0]
    
    # 空域名检查
    if not clean_domain:
        return "空域名"
    
    # 执行DNS查询
    answers = resolver.resolve(clean_domain, 'A')
    return ', '.join([answer.address for answer in answers])

except resolver.NXDOMAIN:
    return "域名不存在"
except resolver.NoAnswer:
    return "无A记录"
except resolver.NoNameservers:
    return "DNS服务器故障"
except resolver.Timeout:
    return "查询超时"
except DNSException as e:
    return f"DNS错误: {str(e)}"
except Exception as e:
    return f"解析异常: {str(e)}"

def main():
try:
# 读取Excel文件
df = pd.read_excel(INPUT_FILE, engine='openpyxl')

    # 检查域名列是否存在
    if COLUMN_NAME not in df.columns:
        raise ValueError(f"Excel文件中缺少'{COLUMN_NAME}'列")

    # 执行域名解析
    print("正在解析域名...")
    df["解析结果"] = df[COLUMN_NAME].apply(resolve_domain)
    
    # 调整列顺序到域名列右侧
    columns = list(df.columns)
    domain_index = columns.index(COLUMN_NAME)
    columns.insert(domain_index + 1, columns.pop(columns.index("解析结果")))
    df = df[columns]

    # 保存结果
    df.to_excel(OUTPUT_FILE, index=False, engine='openpyxl')
    print(f"解析完成!结果已保存到:{OUTPUT_FILE}")
    
    # 统计成功数量
    success_count = len(df[df["解析结果"].str.contains(IP_PATTERN, regex=True)])
    print(f"成功解析记录:{success_count}/{len(df)} 条")
    if success_count < len(df):
        error_count = len(df) - success_count
        print(f"失败明细:")
        print(df[df["解析结果"].str.contains(IP_PATTERN, regex=True) == False]["解析结果"].value_counts())

except FileNotFoundError:
    print(f"错误:输入文件 {INPUT_FILE} 不存在")
except PermissionError:
    print(f"错误:输出文件 {OUTPUT_FILE} 被占用,请关闭文件后重试")
except Exception as e:
    print(f"程序运行异常:{str(e)}")

if name == "main":
print(r"""
____ _ _ ____ ___ __ _ ____
( _ / )( ( )/ )( / )( )
) /) / ( ) )( ( ) ( ) _)
(
) _
/(____)_
)(___)(____)
""")
main()

posted on 2025-04-13 11:37  wenlf136  阅读(26)  评论(0)    收藏  举报

导航