Python Script Scan File Virustotal: Panduan API V3

Memindai file atau hash secara otomatis menggunakan VirusTotal API v3 dalam bahasa pemrograman Python memerlukan pustaka requests dan kunci API resmi (API Key) dari akun VirusTotal Anda. Skrip ini dirancang untuk mengunggah file berukuran di bawah 32MB, memeriksa status pemindaian, dan menarik laporan analisis secara langsung ke terminal Anda.

Sebelum menjalankan kode di bawah ini, pastikan Anda telah menginstal pustaka yang dibutuhkan melalui terminal dengan perintah pip install requests serta menyiapkan variabel lingkungan untuk API key demi keamanan kredensial akun Anda.

Persiapan dan Kode Sumber Python

Berikut adalah skrip Python yang berfungsi untuk mengunggah file ke endpoint API v3 VirusTotal, mengambil ID analisis, dan menampilkan hasil deteksi dari berbagai mesin antivirus.

import os
import time
import requests

API_KEY = os.getenv('VT_API_KEY', 'MASUKKAN_API_KEY_ANDA_DISINI')
HEADERS = {
    'x-apikey': API_KEY
}

def scan_file(file_path):
    url = 'https://www.virustotal.com/api/v3/files'
    
    if not os.path.exists(file_path):
        print(f"File tidak ditemukan: {file_path}")
        return

    print(f"Mengunggah {file_path} ke VirusTotal...")
    with open(file_path, 'rb') as f:
        files = {'file': (os.path.basename(file_path), f)}
        response = requests.post(url, headers=HEADERS, files=files)

    if response.status_code == 200:
        result = response.json()
        analysis_id = result['data']['id']
        print(f"File berhasil diunggah. Analysis ID: {analysis_id}")
        get_analysis_report(analysis_id)
    else:
        print(f"Gagal mengunggah file. Status: {response.status_code}, Pesan: {response.text}")

def get_analysis_report(analysis_id):
    url = f'https://www.virustotal.com/api/v3/analyses/{analysis_id}'
    print("Menunggu hasil analisis...")
    
    while True:
        response = requests.get(url, headers=HEADERS)
        if response.status_code == 200:
            result = response.json()
            status = result['data']['attributes']['status']
            
            if status == 'completed':
                print("Analisis selesai!")
                stats = result['data']['attributes']['stats']
                print(f"Hasil Deteksi: {stats}")
                break
            else:
                print(f"Status saat ini: {status}. Menunggu 15 detik...")
                time.sleep(15)
        else:
            print(f"Gagal mengambil laporan. Status: {response.status_code}")
            break

if __name__ == '__main__':
    target_file = 'path/ke/file/target.exe'
    scan_file(target_file)

Parameter dan Batasan API v3 VirusTotal

VirusTotal menerapkan pembatasan akses (rate limit) terutama pada akun gratis (free tier). Memahami parameter ini penting agar skrip Anda tidak terkena blokir sementara akibat terlalu banyak permintaan dalam waktu singkat.

Parameter Free Tier (Publik) Premium Tier
Batas Permintaan 4 permintaan per menit Disesuaikan paket langganan
Ukuran Maksimal File 32 MB Hingga 650 MB
Metode Pencarian Hash Didukung (SHA-256, SHA-1, MD5) Didukung penuh
Otomasi Skrip Terbatas untuk pengujian/personal Optimal untuk integrasi SOC / SIEM

Langkah Eksekusi dan Troubleshooting

Untuk menjalankan skrip dengan lancar, ikuti tahapan operasional berikut di lingkungan lokal Anda:

  1. Dapatkan kunci API dari halaman profil akun VirusTotal Anda.
  2. Simpan kunci API sebagai variabel lingkungan dengan perintah export VT_API_KEY='kunci_anda' di Linux/macOS atau gunakan set VT_API_KEY='kunci_anda' di Command Prompt Windows.
  3. Ganti nilai target_file pada baris terakhir skrip dengan lokasi absolut atau relatif dari file yang ingin Anda uji.
  4. Jalankan skrip menggunakan terminal: python nama_skrip.py.

Jika Anda menemui error 429 Too Many Requests, artinya skrip Anda melebihi batas 4 permintaan per menit yang diizinkan oleh kunci API gratis. Tambahkan jeda waktu (time.sleep) yang lebih lama di dalam loop atau gunakan endpoint pencarian berdasarkan hash file (GET /api/v3/files/{id}) alih-alih mengunggah ulang file yang sama.