はじめに
こんにちは、なりかくんです。
今回は、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/
以上です、最後までお読みいただきありがとうございました。