Parsing respon VirusTotal API menggunakan Python memerlukan pemahaman terhadap struktur data JSON yang dikembalikan oleh endpoint v3, khususnya untuk analisis file, URL, atau domain. Format respon standar VirusTotal menggunakan pembungkus data dengan atribut spesifik seperti attributes dan last_analysis_stats.
Untuk mengekstrak data seperti jumlah deteksi mesin antivirus (malicious, harmless, suspicious), Anda harus mengakses dictionary bersarang dengan aman menggunakan metode .get() guna menghindari error KeyError saat menghadapi respon tidak lengkap.
Contoh Kode Parser Respon VirusTotal v3
Berikut adalah implementasi skrip Python menggunakan pustaka requests untuk mengambil data laporan file hash (SHA-256) dan memparsing hasil statistiknya:
import requests
def parse_virustotal_report(file_hash, api_key):
url = f"https://www.virustotal.com/api/v3/files/{file_hash}"
headers = {
"accept": "application/json",
"x-apikey": api_key
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
attributes = data.get("data", {}).get("attributes", {})
stats = attributes.get("last_analysis_stats", {})
file_info = {
"sha256": attributes.get("sha256"),
"harmless": stats.get("harmless", 0),
"malicious": stats.get("malicious", 0),
"suspicious": stats.get("suspicious", 0),
"undetected": stats.get("undetected", 0),
"type_description": attributes.get("type_description")
}
return file_info
elif response.status_code == 404:
return {"error": "Hash tidak ditemukan di database VirusTotal."}
else:
return {"error": f"Gagal mengambil data, status code: {response.status_code}"}
# Contoh Penggunaan
# api_key = "API_KEY_ANDA"
# hasil = parse_virustotal_report("4e292d3521d102e1de0f9b3cf2dd61fc37c762514de13a3a41b2c4c8d5573429", api_key)
# print(hasil)
Struktur Data Respon VirusTotal API v3
Memahami hierarki JSON sangat penting sebelum membuat fungsi parser lanjutan. Tabel berikut merinci jalur kunci (key path) utama dalam objek JSON VirusTotal.
| Key Path JSON | Tipe Data | Deskripsi Keterangan |
|---|---|---|
data.id | String | Hash unik file (SHA-256 / MD5) atau ID objek URL. |
data.type | String | Jenis entitas yang dianalisis (contoh: file, url). |
data.attributes.last_analysis_stats | Dictionary | Ringkasan hasil deteksi dari seluruh vendor antivirus. |
data.attributes.last_analysis_results | Dictionary | Detail hasil deteksi per vendor (Vendor A: clean, Vendor B: malicious). |
data.attributes.meaningful_name | String | Nama file yang paling sering dilaporkan atau terdeteksi. |
Langkah-Langkah Penanganan Error (Troubleshooting)
- Rate Limiting (HTTP 429): Akun VirusTotal gratis dibatasi hingga 4 permintaan per menit. Tambahkan fungsi
time.sleep(15)di antara iterasi pemanggilan API jika melakukan pemindaian massal. - KeyError pada Respon Kosong: Selalu gunakan fungsi
dict.get()alih-alih akses langsung menggunakan kurung siku ([]) untuk mencegah kegagalan skrip saat kunci tertentu tidak ada dalam payload. - Validasi Hash: Pastikan string hash yang dikirimkan memiliki panjang yang valid (MD5: 32 karakter, SHA-1: 40 karakter, SHA-256: 64 karakter).