48 lines
1.4 KiB
Ruby
48 lines
1.4 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require 'net/http'
|
||
|
require 'uri'
|
||
|
require 'json'
|
||
|
require 'yaml'
|
||
|
|
||
|
# main class for communication with the VirusTotal API v3
|
||
|
class VirusTotalClient
|
||
|
API_KEY = YAML.load_file(File.join(__dir__, '../../config/api_keys.yml'))['virus_total']
|
||
|
BASE_URL = 'https://www.virustotal.com/api/v3/'
|
||
|
|
||
|
# Method to scan URLs
|
||
|
def self.scan_url(url)
|
||
|
uri = URI("#{BASE_URL}urls")
|
||
|
request = Net::HTTP::Post.new(uri)
|
||
|
request['x-apikey'] = API_KEY
|
||
|
request['Content-Type'] = 'application/json'
|
||
|
request.body = { url: }.to_json
|
||
|
|
||
|
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
|
||
|
http.request(request)
|
||
|
end
|
||
|
|
||
|
# TODO: Implement proper response handling
|
||
|
JSON.parse(response.body)
|
||
|
end
|
||
|
|
||
|
# method to upload files to scan
|
||
|
def self.scan_file(file_path)
|
||
|
uri = URI("#{BASE_URL}files")
|
||
|
request = Net::HTTP::Post.new(uri)
|
||
|
request['x-apikey'] = API_KEY
|
||
|
request['accept'] = 'application/json'
|
||
|
request['Content-Type'] = 'multipart/form-data'
|
||
|
|
||
|
form_data = [['file', File.open(file_path)]]
|
||
|
request.set_form form_data, 'multipart/form-data'
|
||
|
|
||
|
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
|
||
|
http.request(request)
|
||
|
end
|
||
|
|
||
|
# TODO: Implement proper response handling
|
||
|
JSON.parse(response.body) # Simplified example; adjust based on actual needs
|
||
|
end
|
||
|
end
|