今回はConnpassイベントを通知するDiscordbotを作成してみました。
Discordbotの作り方と簡単なコマンドを紹介しているので、bot作ってみたいという方は是非見てください。
なぜこのbotを作ろうと思ったのか
近年コロナ渦ということもあり、ソフトウェアテスト関連のオンラインイベントが増えてきました。
そのため、いろんなイベントに参加して情報収集を行いたいのですが、
毎度Connpassを開いて検索する行為がめんどくさくなってきました。
そんな時に、イベント通知botを作っている記事を見かけました。
この記事ではslackとawsを使って、イベントを通知しています。
私はslackbotの作り方もawsの使い方も詳しくなかったですが、
2021年の9月に開催したXP祭りにて、discordbotを作った経験があったので、
今回はそちらで作成しようと思いました。
Discordbot作成の準備
Discordbotを作るには以下の準備が必要です。
- Discordのbotを新規作成する
- 任意のサーバーに1で作ったbotを追加する
- botを作成するためのライブラリをインストールする
Discordのbotを新規作成する
Discordbotを作るための準備を紹介します。
無料でbotを作成することができます。
Discordbotを作るときは、Discordのアカウントが必要です。
-
Discord Developer Portalにアクセスする
-
自分のDiscordアカウントでログインする
任意のサーバーにbotを追加する
上記で登録したbotを導入したいサーバーに招待します。
- OAuthを開き、「URLGenerator」のタブに遷移
- 「Bot」を選択して下に出てくる「BOT PERMISSIONS」で招待リンクからのBot導入時に付与される権限を設定
- 権限が設定出来たら下の「GENERATED URL」に招待URLをコピー
- ブラウザにコピーしたURLを貼る
- Botを招待するサーバを選んで、参加させる
botを作成するためのライブラリをインストールする
botを作るためのライブラリをインストールします。
今回は、Discord.jsを使います。
環境 | Version |
---|---|
node.js | 16.14.0 |
discord.js | 12.5.3 |
dotenv | 16.0.0 |
Jest | 27.5.1 |
node.jsのインストール方法はこちらの記事が詳しく書いています。
- 作成するフォルダを作る
- cmdで作成するフォルダまで移動し、以下のコマンドを実施する。
- npm init
- npm discord.js
- npm install dotenv
- npm install --save-dev Jest
- .envを作成し、そこにDiscordBotトークンを入力する
DISCORD_TOKEN="bot TOKEN"(実際に入力する時、""はいらない) - index.jsを作成する
これで、Discordbotを作る準備が整いました。
コードを書いてみる
ここから、ConnpassのイベントをDisocordに通知するコードを書いていきます。
ConnpassのAPIを叩いて、JSONデータを取得する
今回は、fetch関数を使用します。
使用したAPIは以下です。
async function callApi(){
let url='https://connpass.com/api/v1/event/?keyword=テスト自動化&Count=10&ym='+今月+'&ym='+来月 //ConnpassAPIに基づいて設定
let encodeUrl = encodeURI(url); //URLに日本語が含まれるため、エンコードする
const res = await fetch(encodeUrl); //fetch関数を使って、JSONデータを取得
const jData = await res.json();
//以下、省略
Disocordに通知する
取得したJSONから通知したい情報を選び、Discordに通知します。
【通知する情報】
- イベントタイトル
- 開催日時
- イベントURL
// 省略
let max = 0;
if(jData.results_available > 10){ //取得件数が10件未満の場合は、実際に取得した数を代入する
max = 10;
}else{
max = jData.results_available
}
console.log(max);
for (let i=0; i<max; i++){ //取得した件数もしくは10回繰り返し処理を行う
let eventStart=jData.events[i].started_at;
let eventStartDate = (eventStart.slice(0,10)).replace(/-/g,"");
if(Number(eventStartDate)>Number(today)){ // イベント開催日付けが今日よりも前の場合は通知しない
client.channels.cache.find(ch => ch.name === '一般').send("\n-----"); //通知するチャンネルを指定し、メッセージを送信
client.channels.cache.find(ch => ch.name === '一般').send(jData.events[i].title); //イベントタイトル
client.channels.cache.find(ch => ch.name === '一般').send(jData.events[i].started_at); //イベント開始日時
client.channels.cache.find(ch => ch.name === '一般').send(jData.events[i].event_url); //イベントURL
}
}
}
Disocordbotが起動するタイミングで、通知処理を実行させる
Discordbotには、処理を実行するタイミングがいろいろあります。
今回は、botが起動したタイミングで通知処理を実施します。
require('dotenv').config();
global.fetch = require('node-fetch');
const { Client, Intents } = require('discord.js');
const client = new Client({ intents: [Intents.FLAGS.GUILDS] });
client.on('ready', () => { //起動が正常に行えたら、{}の処理を実施する
console.log(`Logged in as ${client.user.tag}!`);
client.channels.cache.find(ch => ch.name === '一般').send("オンラインになりました。\nテスト自動化に関するイベントを通知します。");
callApi(); //api取得&メッセージ通知を行う
});
client.login(process.env.DISCORD_TOKEN) //botトークンを指定
bot起動
以下のコマンドで、起動します
node index.js
実行結果
サンプルコードはGitHubに置いておきます。
今後やりたいこと
- JSON取得と通知が同じ関数に入っているので、分けたい
- 今は「テスト自動化」というキーワードだけで検索しているので、Discord側から検索ワードを変えるようにしたい
- Discord側からも検索が行えるようにしたい
- 今回は作ることしか専念してなかったため、Jestを使ってテストしてみたい
- glitch、herokuやawsを使って、定期的に通知するbotにしたい
所感
今まで開発経験がなかったため、このようなbot作りは良い勉強になったと思います。
web開発と比べるとハードルは低いということとDiscord.js Japan User Groupで使い方がまとめられているので、始めやすいかなと思います。fizzbuzzbotからでも良いので試していただければと思います。意外と楽しいですよ^-^