一、前期准备:安装Python环境与测试工具依赖
1. 安装Python3.8+
首先确保本地电脑已安装Python3.8及以上版本,可通过以下步骤验证或安装:
- 验证已安装:打开Windows命令提示符(cmd)或Mac/Linux终端,输入
python --version(Mac/Linux如果用python3 --version),显示Python版本需≥3.8;
- 未安装的操作:访问Python官网下载稳定版(地址:https://www.python.org/downloads/,安装时务必勾选Add Python to PATH选项,否则需手动配置环境变量。
2. 安装Python依赖库
本次使用requests库(用于调用免费API),打开终端输入以下命令并回车:
```
pip install requests
```
如果安装成功后终端会显示Successfully installed requests-x.x.x类似内容。
二、获取免费恶意链接检测开放API
这里选取VirusTotal Public API v3,无需付费、无需复杂审核,单日调用限制为500次/月4次/分钟,完全满足个人轻量使用:
- 注册VirusTotal账号:访问https://www.virustotal.com/gui/join-us,用邮箱或Google/GitHub账号注册;
- 获取API Key:登录后点击右上角头像→API Key→复制Your API Key(注意保管,不要泄露)。
三、编写完整的恶意链接检测Python脚本

新建一个文本文件,重命名为malicious_link_checker.py,用记事本、VS Code或其他编辑器打开,粘贴以下完整可直接运行的代码:
```python
import requests
import time
配置区域:粘贴你的VirusTotal API Key
API_KEY = "这里粘贴你的API Key"
BASE_URL = "https://www.virustotal.com/api/v3/urls"
HEADERS = {"x-apikey": API_KEY}
def check_malicious_link(url: str) -> dict:
"""
检测单个恶意链接的核心函数
:param url: 需要检测的链接
:return: 检测结果字典
"""
try:
第一步:提交链接到VirusTotal(需要先编码为base64url,v3 API要求)
import base64
url_encoded = base64.urlsafe_b64encode(url.encode()).decode().rstrip('=')
response_submit = requests.post(
BASE_URL,
headers=HEADERS,
data={"url": url}
)
response_submit.raise_for_status() 检查提交请求是否成功
第二步:获取分析ID
analysis_id = response_submit.json()["data"]["id"]
analysis_url = f"https://www.virustotal.com/api/v3/analyses/{analysis_id}"
第三步:轮询分析结果(等待分析完成,免费版最多等30秒,超时返回未完成)
max_wait = 30
wait_interval = 5
elapsed = 0
while elapsed < max_wait:
response_analysis = requests.get(analysis_url, headers=HEADERS)
response_analysis.raise_for_status()
analysis_data = response_analysis.json()["data"]["attributes"]
status = analysis_data["status"]
if status == "completed":
break
elapsed += wait_interval
time.sleep(wait_interval)
if status != "completed":
return {"status": "timeout", "message": "分析超时,请稍后手动在VirusTotal网页查询"}
第四步:解析检测结果
stats = analysis_data["stats"]
return {
"status": "success",
"original_url": url,
"total_engines": stats["harmless"] + stats["malicious"] + stats["suspicious"] + stats["undetected"],
"malicious_count": stats["malicious"],
"suspicious_count": stats["suspicious"],
"harmless_count": stats["harmless"],
"undetected_count": stats["undetected"],
"result_summary": f"{stats['malicious']} 个引擎标记恶意,{stats['suspicious']} 个标记可疑"
}
except requests.exceptions.RequestException as e:
return {"status": "error", "message": f"请求失败:{str(e)}"}
except Exception as e:
return {"status": "error", "message": f"发生未知错误:{str(e)}"}
def main():
"""
主函数:交互检测
"""
print("轻量恶意链接检测工具启动!")
print("提示:单次仅支持单个链接检测,如需批量可修改脚本逻辑")
while True:
url = input("\n请输入需要检测的链接(输入q退出):").strip()
if url.lower() == 'q':
print("工具已退出,再见!")
break
if not url.startswith(('http://', 'https://')):
url = 'https://' + url
print(f"自动补全协议为:{url}")
print("正在检测,请稍候...")
result = check_malicious_link(url)
if result["status"] == "success":
print("\n===== 检测结果 =====")
print(f"原始链接:{result['original_url']}")
print(f"参与检测的引擎总数:{result['total_engines']}")
print(f"恶意引擎标记恶意数:{result['malicious_count']}")
print(f"可疑引擎标记数:{result['suspicious_count']}")
print(f"安全引擎标记数:{result['harmless_count']}")
print(f"未检测到结果:{result['undetected_count']}")
print(f"结果总结:{result['result_summary']}")
if result["malicious_count"] > 0:
print("\n⚠️ ⚠️ ⚠️ 警告:该链接存在风险,谨慎访问!")
elif result["suspicious_count"] > 0:
print("\n⚠️ 提示:该链接存在可疑性,建议谨慎访问!")
else:
print("\n✅ 该链接目前被标记为安全!")
else:
print(f"\n检测出错:{result['message']}")
if __name__ == "__main__":
main()
```
关键修改说明:找到代码中第6行的API_KEY = "这里粘贴你的API Key",将双引号内的内容替换为你刚才复制的VirusTotal API Key,不要留空格。
四、实操运行脚本检测链接
- Windows系统:
- 打开脚本所在的文件夹,在地址栏输入
cmd并回车,打开终端;
- 输入
python malicious_link_checker.py并回车;
- Mac/Linux系统:
- 打开终端,使用
cd命令进入脚本所在文件夹(比如脚本在桌面,输入cd Desktop);
- 输入
python3 malicious_link_checker.py并回车;
运行成功后会出现提示,输入链接回车即可检测,输入q回车退出。
五、简单批量检测优化逻辑(可选进阶)
如果需要批量检测,可新建一个links.txt文本文件,每行放一个待检测链接(不要带多余空格或空行),然后将上面的main()函数替换为以下批量检测的main():
```python
def main():
"""
批量检测主函数
"""
print("轻量批量恶意链接检测工具启动!")
file_path = input("请输入待检测链接的txt文件路径(默认当前目录下的links.txt):").strip()
if not file_path:
file_path = "links.txt"
try:
with open(file_path, 'r', encoding='utf-8') as f:
urls = [line.strip() for line in f if line.strip()]
print(f"共读取到 {len(urls)} 个待检测链接")
safe_links = []
risky_links = []
suspicious_links = []
error_links = []
for i, url in enumerate(urls, 1):
if not url.startswith(('http://', 'https://')):
url = 'https://' + url
print(f"\n正在检测第 {i}/{len(urls)} 个链接:{url}")
result = check_malicious_link(url)
if result["status"] == "success":
if result["malicious_count"] > 0:
risky_links.append(url)
elif result["suspicious_count"] > 0:
suspicious_links.append(url)
else:
safe_links.append(url)
print(f"结果:{result['result_summary']}")
免费版每分钟最多4次,批量检测间隔15秒
if i < len(urls):
time.sleep(15)
else:
error_links.append((url, result["message"])
print(f"结果:{result['message']}")
保存结果到result.txt
with open("result.txt", 'w', encoding='utf-8') as f:
f.write("===== 批量检测结果 =====\n\n")
f.write(f"安全链接({len(safe_links)}):\n")
for link in safe_links:
f.write(f"- {link}\n")
f.write(f"\n可疑链接({len(suspicious_links)}):\n")
for link in suspicious_links:
f.write(f"- {link}\n")
f.write(f"\n风险链接({len(risky_links)}):\n")
for link in risky_links:
f.write(f"- {link}\n")
f.write(f"\n检测失败链接({len(error_links)}):\n")
for url, msg in error_links:
f.write(f"- {url}:{msg}\n")
print("\n===== 批量检测完成!结果已保存到当前目录下的result.txt")
except FileNotFoundError:
print(f"未找到文件:{file_path},请检查路径或重新输入!")
```
替换后保存,同样运行即可,免费版按每分钟4次的速率自动检测,避免触发限制。