vtdiscord-bot/vtdiscordbot.py

109 lines
3.2 KiB
Python
Raw Permalink Normal View History

2021-07-20 15:29:14 +03:00
import os
import requests
import asyncio
import discord
from discord.ext import commands
# Add the bot:
# https://discord.com/api/oauth2/authorize?client_id=861966798664761374&permissions=2147601408&scope=bot
# Setting Up
token = '*** YOUR TOKEN ***'
vt_token = '147eac96e8a588d37164c584cdbc9f28d2138558ce7965ffc357dcf29215d963'
bot = commands.Bot(command_prefix='/')
@bot.command()
async def vtscan(ctx, *args):
if ctx.message.attachments:
isfile = True
await ctx.send(':dvd: **Downloading file...**')
file = ctx.message.attachments[0]
await file.save(file.filename)
await ctx.send(':outbox_tray: **Sending to VT...**')
localfile = open(file.filename, 'rb')
scanid = requests.post(
'https://www.virustotal.com/api/v3/files',
headers={'x-apikey': vt_token},
files={'file': (file.filename, localfile)}
).json()['data']['id']
localfile.close()
await ctx.send(':recycle: **Deleting file from server...**')
os.remove(file.filename)
else:
isfile = False
await ctx.send(':outbox_tray: **Sending to VT...**')
scanid = requests.post(
'https://www.virustotal.com/api/v3/urls',
headers={'x-apikey': vt_token},
data={'url': str(args[0])}
).json()['data']['id']
await ctx.send(':mag_right: **Scanning...**')
scanresult = requests.get(
f'https://www.virustotal.com/api/v3/analyses/{scanid}',
headers={'x-apikey': vt_token}
).json()['data']['attributes']
while scanresult['status'] != 'completed':
scanresult = requests.get(
f'https://www.virustotal.com/api/v3/analyses/{scanid}',
headers={'x-apikey': vt_token}
).json()['data']['attributes']
await asyncio.sleep(0.1)
await ctx.send(':card_box: **Fetching scan results...**')
stats = scanresult['stats']
engines = int(stats['malicious']) + int(stats['undetected']) + int(stats['harmless'])
scans = scanresult['results']
ismalw = ':warning: marked as malicious'
color = 0xf58f14
trusted_engines_detect = False
try:
trusted_engines_detect = (
(scans['Dr.Web']['result'] != 'clean' and scans['Dr.Web']['result'] != None) or \
(scans['DrWeb']['result'] != 'clean' and scans['DrWeb']['result'] != None) or \
(scans['BitDefender']['result'] != 'clean' and scans['BitDefender']['result'] != None)
)
except KeyError:
pass
if (stats['malicious'] > 3) or trusted_engines_detect:
ismalw = ':x: Malware!'
color = 0xd13434
else:
ismalw = ':white_check_mark: Clean'
color = 0x36b338
resultstr = ''
i = 0
show_engines = []
if (len(args) > 1) and (not isfile):
show_engines = str(args[1]).split(',')
elif (len(args) > 0) and (isfile):
show_engines = str(args[0]).split(',')
for engine in scans:
if (not show_engines) and (i < 10):
resultstr += f'**{engine}** - `{scans[engine]["result"]}`\n'
i += 1
elif (show_engines):
for reqengine in show_engines:
if reqengine == engine:
resultstr += f'**{engine}** - `{scans[engine]["result"]}`\n'
else:
break
scantype = 'file' if isfile else 'URL'
resultmsg = discord.Embed(color=color, title=f'The {scantype} is {ismalw} ({stats["malicious"]}/{engines})', description=resultstr)
await ctx.send(embed=resultmsg)
# Starting
bot.run(token)