使用Virustotal API批量将SHA256哈希转换为MD5时输出空文件的问题排查
Virustotal API批量将SHA256哈希转换为MD5时输出空文件的问题排查
我来帮你排查下脚本里的问题,这些错误直接导致了空输出甚至脚本隐性崩溃,我们一个个拆解:
1. URL格式化完全错误
你在循环里写了url = url.format("HASH"),这里的"HASH"是硬编码的字符串,根本不是你从文件里读取的哈希变量!而且初始的url是模板字符串,第一次循环后会被替换成带HASH固定值的无效URL,后续所有请求都会用这个错误地址,自然拿不到数据。
正确的做法是每次循环都用原始模板字符串格式化当前的哈希变量,比如把模板和格式化步骤分开处理。
2. JSON数据访问路径错误
从你提供的返回JSON可以看到,MD5值的实际路径是data["data"]["attributes"]["md5"],但你直接写了data["md5"]——这个路径在返回结果里根本不存在,会直接触发KeyError,脚本可能悄悄崩溃(如果没捕获异常的话),这是空输出的核心原因。
3. 文件写入缺少换行符
你用output.write(md5)时没有加换行符,就算拿到了MD5,所有值也会连在一起变成一长串,后续读取完全没法用,应该改成output.write(md5 + "\n")让每个MD5单独占一行。
4. 缺少异常处理(隐性坑)
比如当哈希在Virustotal数据库不存在、API密钥错误、速率限制触发时,脚本会直接崩溃,连错误信息都看不到。最好加上异常捕获,确保脚本能跑完所有哈希并记录问题。
修正后的完整脚本
import requests import time # 固定API模板,避免循环中被污染 URL_TEMPLATE = 'https://www.virustotal.com/api/v3/files/{}' headers = {"accept": "application/json", "x-apikey": "<你的API密钥>"} inf = input("What hash file? ") with open(inf, "r") as f, open("hashout.txt", "w") as output: for line in f: hash_sha256 = line.strip() if not hash_sha256: # 跳过空行 continue # 用当前哈希生成有效请求URL current_url = URL_TEMPLATE.format(hash_sha256) try: response = requests.get(current_url, headers=headers) response.raise_for_status() # 主动触发HTTP错误(比如404、403) data = response.json() # 从正确的JSON路径提取MD5 md5 = data["data"]["attributes"]["md5"] output.write(f"{md5}\n") print(f"已获取 {hash_sha256} 的MD5: {md5}") except requests.exceptions.HTTPError as e: error_msg = f"哈希 {hash_sha256} 请求失败: {str(e)}" print(error_msg) output.write(f"ERROR: {error_msg}\n") except KeyError as e: error_msg = f"哈希 {hash_sha256} 响应中缺少字段: {str(e)}" print(error_msg) output.write(f"ERROR: {error_msg}\n") except Exception as e: error_msg = f"哈希 {hash_sha256} 发生意外错误: {str(e)}" print(error_msg) output.write(f"ERROR: {error_msg}\n") # 遵守公共API速率限制(4请求/分钟,16秒间隔更稳妥) time.sleep(16) print("File Complete")
额外说明
- 记得把
<你的API密钥>替换成真实的Virustotal API密钥 - 异常处理会把错误信息写入输出文件,方便你后续排查哪些哈希出了问题
- 跳过空行的逻辑避免了处理无效的空哈希请求
内容来源于stack exchange
相关产品推荐
相关产品推荐

