python中json VirusTotal API调用出错

python中json VirusTotal API调用出错,python,json,python-requests,Python,Json,Python Requests,我需要检索已经执行的VirusTotal扫描的结果,提供文件的散列,而无需再次发送文件。 您可以找到API的文档 我基本上需要发送以下格式的json:{“resource”:“hash”,“apikey”:api}。 我使用的是请求,它非常有用,即使不使用json或simplejson模块,它也应该处理json 如果我发送这样的请求,它会工作: r = requests.post(url, data = {"resource": "dbbe9c39df7c355f9

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

我基本上需要发送以下格式的json:
{“resource”:“hash”,“apikey”:api}
。 我使用的是请求,它非常有用,即使不使用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格式,因为它包含单引号,它应该包含双引号。我想避免使用另一个模块,但我尝试使用
json
simplejson
模块将字典转换为有效的json(带双引号),显然效果不错。我知道请求还有一个
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)
其中
hash
api
是两个字符串

我仍然得到相同的错误:

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)
回溯(最近一次呼叫最后一次):
文件“C:/Users/Fabio/PycharmProjects/dfir/requests try prova.py”,第15行,在
打印(r.json())
json格式的文件“C:\Users\Fabio\AppData\Local\Programs\Python\35\lib\site packages\requests\models.py”,第812行
返回complexjson.load(self.text,**kwargs)
文件“C:\Users\Fabio\AppData\Local\Programs\Python\Python35\lib\site packages\simplejson\\uuuu init\uuuu.py”,第516行,装入
返回\u默认\u解码器。解码
文件“C:\Users\Fabio\AppData\Local\Programs\Python\35\lib\site packages\simplejson\decoder.py”,第370行,在decode中
obj,end=self.raw_解码
文件“C:\Users\Fabio\AppData\Local\Programs\Python\35\lib\site packages\simplejson\decoder.py”,第400行,原始解码
返回self.scan_一次(s,idx=_w(s,idx.end())
simplejson.scanner.JSONDecodeError:预期值:第1行第1列(字符0)
从错误来看,问题似乎在于获取或解码json响应,但我想知道问题是否在于请求最初没有正确发送。 如果不是打印json响应,而是打印(r.status_code())我会得到一个403状态


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

我注意到我使用了一个名为
hash
的变量,它可能会导致问题,因为Python可能会将其与方法误操作解释器,因此我将其重命名为
文件\u hash
。然后,我没有使用
r.json
而是使用
r.text
将响应作为文本获取,然后将其作为参数传递给函数
json.loads
,而是将值存储在名为
response
的变量中
response
是一个字典,它包含由单引号包装的键和值,而不是像在有效的json中那样的双引号,因此当我想从响应中提取值时,必须考虑到这一点。我现在没有收到任何错误,代码正在运行。唯一的问题是,在检索了几次JSON(精确到4)之后,我得到了与之前相同的错误:
simplejson.scanner.JSONDecodeError:期望值:第1行第1列(char 0)
这可能是因为我再也没有得到json响应了。如果你问为什么,那是因为公共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)
    for file_hash in md5:
        params = {"apikey": api, "resource": file_hash}
        r = requests.post(url, data=params)
        report = json.loads(r.text)
        print(report)