You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 08:38:07