调用VirusTotal API遭遇403 Forbidden错误,寻求问题排查方案
VirusTotal API V2 返回403 Forbidden 错误的排查与V3版本替代方案
问题背景
按照VirusTotal V2 API的URL扫描示例编写代码后,运行返回Response [403]禁止访问错误,已反复确认API密钥无误,需排查错误成因。
原V2版本代码:
import requests minute = 60 from time import sleep file = open("url.txt","r") #url file contains all URLs lines = file.readlines() file.close() for line in lines: url = "http://" + line[:-3] #Added that because my URLs didn't have http:// at the beggining and contained "Â" at the end because of encoding params = {'apikey': 'my_API_key', 'url':url} # My API key is written inside the '' as such '123456' response = requests.post(url, data=params) responsesFile = open("Responses.txt","w") responsesFile.write(str(response)) sleep(5*minute)
403错误的核心成因
- API端点完全错误:原代码里
requests.post(url, data=params)的url是要扫描的目标网址,不是VirusTotal的API接口地址。V2版本的URL扫描端点应为https://www.virustotal.com/vtapi/v2/url/scan,直接请求目标网站自然会被对方服务器拒绝,返回403。 - 请求逻辑错误:V2 API要求把
apikey和url作为POST参数提交到官方API端点,原代码完全搞反了请求目标,根本没和VirusTotal的服务器做权限校验,必然返回禁止访问。 - V2 API潜在限制:VirusTotal的V2 API可能已逐步缩减支持,部分功能存在访问限制,即使密钥正确也可能触发403。
- URL处理不当:
line[:-3]的截取逻辑可能导致URL格式损坏,比如截断有效字符或残留特殊符号,触发目标网站的反爬机制返回403。
可用的V3版本替代代码
改用VirusTotal API V3版本后可正常运行,基础实现代码如下:
import requests import json headers = {'x-apikey': 'VT_API_KEY'} resource = "https://www.lacoste.com" endpoint = "https://www.virustotal.com/api/v3/urls" response = requests.post(endpoint, headers=headers, data={'url': resource}) print(response.json()) analysis_id = response.json()['data']['id'] analysis_url = f"https://www.virustotal.com/api/v3/analyses/{analysis_id}" response = requests.get(analysis_url, headers=headers) response_json = response.json() print(response_json)
版本差异说明
V3版本API通过x-apikey请求头传递密钥,而非V2的POST参数,端点路径也完全不同,更符合现代API设计规范,且VirusTotal官方目前更推荐使用V3版本。
内容的提问来源于stack exchange,提问作者Wosiru
相关产品推荐
相关产品推荐

