python调用virustota接口api实现上传文件返回查毒结果
virustotal是一个可以检测文件与url,以及接口ip病毒的网站,如果要访问,可能要翻墙,这一就不详解了。在网上查看相关的知识的话,都是python2的代码,好多已经不能用了。因此在这里我就分享一下python3调用virustotal的api接口实现本地文件上传到该网站并返回查毒结果的功能。
这里一般是exe文件,如果有其他格式文件,就需要其他操作,这里先不讲解。
下面是实现代码,这里的apikey保密,大家可以自己去网站注册,私有的api可能要联系网站。
代码如下:
#www.virustotal.com/vtapi/v2/
import requests
import json
def getFileScanId(url,apikey,a,b):
# /file/scan
# /文件/扫描
# 上传并扫描文件
# 限制为32MB
params = {'apikey': apikey}
files = {'file': (a, open(b, 'rb'))}
response = requests.post(url, files=files, params=params)
my_scan_id = str(response.json()['scan_id'])
return my_scan_id
def getFieReportResult(url,apikey,my_scan_id):
#/file/report
# /文件/报告
# 检索文件扫描报告
#该resource参数可以是要获取最新的病毒报告文件的MD5,SHA-1或SHA-256。
#还可以指定/ file / scan端点scan_id返回的值。
#如果allinfo参数设置为true除了返回防病毒结果之外的其他信息。
get_params = {'apikey': apikey, 'resource': my_scan_id,'allinfo': '1'}
response2 = requests.get(url, params=get_params)
jsondata = json.loads(response2.text)
with open("jsonResult.json","w") as f:
json.dump(jsondata, f, indent=4)
return jsondata
def getResult(json):
result = {}
for k,v in json["scans"].items():
result[k] = v['detected']
print(result)
print("一共有{0}条杀毒数据".format(len(result)))
with open("result.txt","w") as g:
g.write(str(result))
def main():
file_name = input("请输入文件名:")
a = str(file_name)
file_src = input("请输入文件路径:")
b = str(file_src)
url1 = 'https://www.virustotal.com/vtapi/v2/file/scan'
url2 = "https://www.virustotal.com/vtapi/v2/file/report"
#需要提供**,否者会出现403错误
apikey = "保密"
#获得文件scan_id
scan_id = getFileScanId(url1,apikey,a,b)
#获得返回的json结果并写入result文件
#getFieReportResult(url2, apikey, scan_id)
json = getFieReportResult(url2,apikey,scan_id)
getResult(json)
if __name__ == '__main__':
main()
结果如下:
如果是False,则是安全的;如果出现了True,这可能有病毒。
没有病毒的文件:
有病毒的文件:
但有时可能会出现:
这里就是没有返回结果,为什么会这样,看一下官方的api文档的一些规则就知道了:
这段英文的意思是:
Public API限制为每分钟4个请求。
Public API不得用于商业产品或服务。
Private API返回更多威胁数据并公开更多端点。
Private API由SLA管理,可确保数据准备就绪。
原来我们的公共api只能够这样访问了,不过这些就够用了。如果大家想要一些高级功能的话,就可以联系官方,获得私有apikey,就可以获得更多功能了。