2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【目指せ完走賞】なりかくんのDiscordAdvent Calendar 2022

Day 25

【25日目】Discordに危険なURLが送られたら自動で削除

Last updated at Posted at 2022-12-24

はじめに

こんにちは、なりかくんです。
今回は、discord.jsを使って危険なURLが送られた場合に自動で削除するBotを作ってみようと思います。

危険なURLの判断

今回、危険なURLの判断はGoogleのSafe Browsing Lookup APIを利用します。このAPIにURLを投げてあげると危険かどうかを判断してくれるという優れものです。
詳しくはドキュメントをお読みください。
https://developers.google.com/safe-browsing/v4/lookup-api

実際に作ってみる

では実際に作ったプログラムはこちらになります。

googlesafebrowsing.js
const request = require("request");
const { Client, GatewayIntentBits, IntentsBitField } = require('discord.js');
const { token } = require('./config.json');

const client = new Client({ intents: [GatewayIntentBits.Guilds, IntentsBitField.Flags.GuildMessages, IntentsBitField.Flags.MessageContent] });

client.on('ready', () => {
	console.log(`${client.user.tag}でログインしました。`);
});

client.login(token);

client.on('messageCreate', async message => {
	try {
        if (message.author.bot) return;
        let urls = String(message.content).match(/https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#\u3000-\u30FE\u4E00-\u9FA0\uFF01-\uFFE3]+/g);
        if (urls) {
            let safeResult = await getSafe(urls);
            if (safeResult.matches) {
                message.delete();
            }
        }
	} catch (error) {
		console.error(error);
	}
});

function getSafe(urls) {
    return new Promise((resolve, reject) => {
        request({
            url: `https://safebrowsing.googleapis.com/v4/threatMatches:find?key=<API Key>`,
            json:  {
                "client": {
                    "clientId":      "<clientId>",
                    "clientVersion": "1.5.2"
                },
                "threatInfo": {
                    "threatTypes":      ["MALWARE", "SOCIAL_ENGINEERING"],
                    "platformTypes":    ["WINDOWS"],
                    "threatEntryTypes": ["URL"],
                    "threatEntries": urls.map(f => {
                        return { "url": f }
                    })
                }
            },
            method: "POST"
        }, function (error, response, body) {
            if (error) {
                reject(error);
            } else {
                resolve(body);
            }
        });
    });
}

まあ、投げるデータはドキュメントを読んでもらえればわかりますが、URLを複数個検知した時用に

urls.map(f => {
    return { "url": f }
}

で配列にしてから投げるようにしています。

また含まれていれば、matchesという配列が現れるのでそれを確認して、検出しています。

検知時

{
  matches: [
    {
      threatType: 'SOCIAL_ENGINEERING',
      platformType: 'WINDOWS',
      threat: [Object],
      cacheDuration: '300s',
      threatEntryType: 'URL'
    }
  ]
}

無検知時

{}

なお、危険なURLで試したい場合は以下のページが便利です。
https://testsafebrowsing.appspot.com/

以上です、最後までお読みいただきありがとうございました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?