gpt4 book ai didi

python - python 中 json VirusTotal API 调用出错

转载 作者:太空宇宙 更新时间:2023-11-03 16:17:45 25 4
gpt4 key购买 nike

我需要检索已执行的 VirusTotal 扫描的结果,提供文件的哈希值,而无需再次发送文件。您可以找到API的文档here .

我基本上需要发送这种格式的json:{"resource": "hash", "apikey": api}。我正在使用 requests,它非常有用,即使不使用 jsonsimplejson 模块,它也应该处理 json。

如果我发送这样的请求,它会起作用:

r = requests.post(url, data = {"resource": "dbbe9c39df7c355f970e3a9636fbac04" , "apikey": "myapikey"}
print(r.json())

但我有很多哈希值,因此我需要以编程方式生成 json,而不是在程序中对其进行硬编码。

首先我尝试使用字典:api 键不会改变,因此我将分配放在循环之外,而对于哈希,我循环遍历名为的哈希值的列表 md5

params = {}
params["apikey"] = api
for hash in md5:
params["resource"] = hash

我为传递给 API 调用的请求的每个循环获取一个字典。表示 json 的字典的格式如下:

{'apikey': myapikey', 'resource': 'hash'}

文档将 resource 显示为 json 的第一个元素,而不是在我生成的字典中,我首先得到 apikey ,无论如何,如果它们正确实现了 json 标准,顺序应该没关系。无论如何,这不是有效的 json 格式,因为它包含单引号,它应该包含双引号。我想避免使用另一个模块,但我尝试使用 jsonsimplejson 模块将字典转换为有效的 json(带双引号),并且它显然有效。我知道 requests 还有一个 json = 参数,您可以在其中传递字典,它应该为您将其编码为 json,但我不确定它是否有效。否则,您可以只使用 data = 参数,并在发出请求时将 json 分配给它。

如果我提出这样的请求:

params = {}
params["apikey"] = api
for hash in md5:
params["resource"] = hash
json_params = json.dumps(params)
r = requests.post(url, data = json_params)
print(r.json())

我收到此错误:

Traceback (most recent call last):
File "C:/Users/Fabio/PycharmProjects/dfir/requests-try-prova.py", line 15, in <module>
print(r.json())
File "C:\Users\Fabio\AppData\Local\Programs\Python\Python35\lib\site-packages\requests\models.py", line 812, in json
return complexjson.loads(self.text, **kwargs)
File "C:\Users\Fabio\AppData\Local\Programs\Python\Python35\lib\site-packages\simplejson\__init__.py", line 516, in loads
return _default_decoder.decode(s)
File "C:\Users\Fabio\AppData\Local\Programs\Python\Python35\lib\site-packages\simplejson\decoder.py", line 370, in decode
obj, end = self.raw_decode(s)
File "C:\Users\Fabio\AppData\Local\Programs\Python\Python35\lib\site-packages\simplejson\decoder.py", line 400, in raw_decode
return self.scan_once(s, idx=_w(s, idx).end())
simplejson.scanner.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

我的代码中的第 15 行由 print(r.json()) 表示

如果我 print(r.text()) 相反,它会显示 TypeError: 'str' object is not callable

<小时/>

然后我尝试了一种稍微不同的方法,仍然使用 json 模块,而不传递预定义的字典:

for hash in md5:
r = requests.post(url, data = json.dumps({"resource": hash, "apikey": api}))
print(r.json())

其中 hashapi 是 2 个字符串。

我仍然遇到同样的错误:

Traceback (most recent call last):
File "C:/Users/Fabio/PycharmProjects/dfir/requests-try-prova.py", line 15, in <module>
print(r.json())
File "C:\Users\Fabio\AppData\Local\Programs\Python\Python35\lib\site-packages\requests\models.py", line 812, in json
return complexjson.loads(self.text, **kwargs)
File "C:\Users\Fabio\AppData\Local\Programs\Python\Python35\lib\site-packages\simplejson\__init__.py", line 516, in loads
return _default_decoder.decode(s)
File "C:\Users\Fabio\AppData\Local\Programs\Python\Python35\lib\site-packages\simplejson\decoder.py", line 370, in decode
obj, end = self.raw_decode(s)
File "C:\Users\Fabio\AppData\Local\Programs\Python\Python35\lib\site-packages\simplejson\decoder.py", line 400, in raw_decode
return self.scan_once(s, idx=_w(s, idx).end())
simplejson.scanner.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

从错误来看,问题似乎在于获取或解码 json 响应,但我想知道问题是否在于请求一开始就没有正确发送。如果我不打印 json 响应,而是执行 print(r.status_code()),我会得到 403 状态。

这是一种典型的 HTTP 状态,表示“禁止”,并且 Virus Total API 文档也表示:如果您尝试对您没有所需权限的函数执行调用,引发 HTTP 错误 403 Forbidden

最佳答案

我注意到我使用了一个名为 hash 的变量这可能会导致问题,因为 Python 解释器可能会误认为它是一个方法,所以我将其重命名为 file_hash 。然后而不是使用 r.json我用过r.text以文本形式获取响应,然后将其作为参数传递给函数 json.loads ,我将该值存储在名为 response 的变量中。 response是一个字典,它包含用单引号包裹的键和值,而不是像有效json中的双引号,所以当我想从响应中提取值时,我必须考虑到这一点。我现在没有收到任何错误,代码运行。唯一的问题是,在检索了一些 json(正好是 4 个)之后,我得到了与之前相同的错误:simplejson.scanner.JSONDecodeError: Expecting value: line 1 column 1 (char 0)这可能是因为我不再收到 json 响应。如果你问为什么,那是因为公共(public) API 最多只支持 4 个请求/分钟,所以我必须实现一个 sleep 功能,以便每 4 个请求暂停报告检索 1 分钟。 (我从一开始就意识到了这一点)。我在代码中实现了其他几个检查和函数,无论如何,我向您展示了有效的基本代码:

    for file_hash in md5:
params = {"apikey": api, "resource": file_hash}
r = requests.post(url, data=params)
report = json.loads(r.text)
print(report)

关于python - python 中 json VirusTotal API 调用出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38787051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com