🎄🎄この記事は、2021年CAMPFIRE Advent Calendar 19日目の記事です🎄🎄
こんにちは、CAMPFIREコミュニティのエンジニアのmoriです。
今回はDiscordのAPIを少し触って見ようと思います!
実行環境
cURL
今回の目標
- botでサーバーを作成する
- メンバーを参加/退会させる
とりあえずアプリケーションとBotの作成
Discordアカウントでログイン後
https://discord.com/developers/applications
こちらにアクセスして、「New Application」からアプリケーションを作ります。
次にBotを「Bot」メニューから作成していきます。
USERNAME
はDiscordサーバーに追加されるユーザー名になるので、Botとわかる名前にしていたら親切かなと思いました。
こちらの画面で、BotのTOKEN
を「Copy」ボタンからコピーして控えておきます。
以後この値は${BOT_TOKEN}
と表記します。
Botでサーバーの作成
今回公式ドキュメントを読むにあたって最初に戸惑ったのが、RESOURCESの中にServerがいないというところでした。
読み進めていくと、Guildが表でのServerにあたるようです。
ドキュメントはこちら↓
curl -i -X POST \
-H "Authorization:Bot ${BOT_TOKEN}" \
-H "Content-Type:application/json" \
-d \
'{
"name": "テストサーバー",
"type": 0
}' \
'https://discordapp.com/api/guilds'
※ Authorization: Bot ~ は引っかかりました。(Not Bearer)
{"id": "********", "name": "\u30c6\u30b9\u30c8\u30b5\u30fc\u30d0\u30fc", "icon": null, ....
実行結果のJsonのidが作成されたGuild IDです。こちらもコピーして控えておきます。(以下${GUILD_ID}
)
メンバーを参加/退会させる
とりあえずドキュメントから見ていきます。
Adds a user to the guild, provided you have a valid oauth2 access token for the user with the guilds.join scope.
guilds.joinのScopeのあるoauth2のアクセストークンが必要とのことなのでoauth2の準備をします。
Application画面のOAuth2メニューから「General」を開きます。
こちらの画面から「CLIENT ID」(以下${CLIENT_ID}
)、「CLIENT SECRET
」(以下${CLIENT_SECRET}
)をコピーして控えておきます。
その後、「Add Redirect」からRedirectURLを追加します。
今回は特にWebアプリケーションを作るわけではないので、ローカルの適当なURLに飛ばすことにします。
こちらのURLも必要になるため、控えておきましょう(以下${REDIRECT_URL}
)
次は「URL Generator」を開きます。
以下のSCOPESを選択します。
identify
connections
guilds.join
SELECT REDIRECT URLは先程追加したURLを選択します。
選択が完了するとGENERATED URLにURLが作成されるので、コピーしてブラウザでアクセスします。
認証を押すと先程のREDIRECT_URLに遷移するのでURLからcodeのパラメーターの値を控えます。(以下${CODE}
)
※CODEの有効期限は短いので注意
http://localhost/callback?code=************
ここまでに用意したものを組み合わせてAccessTokenを取得します
curl -i -X POST \
-H "Content-Type:application/x-www-form-urlencoded" \
-d "client_id=${CLIENT_ID}" \
-d "client_secret=${CLIENT_SECRET}" \
-d "grant_type=authorization_code" \
-d "code=${CODE}" \
-d "redirect_uri=${REDIRECT_URL}" \
'https://discordapp.com/api/oauth2/token'
結果
{"access_token": "********", "expires_in": 604800, "refresh_token": ""********",", "scope": "identify connections guilds.join", "token_type": "Bearer"}
AccessTokenも控えます(以下${ACCESS_TOKEN})
次はAccessTokenを使ってユーザーIDを取得します。
https://discord.com/developers/docs/resources/user#get-user
curl -i -X GET \
-H "Authorization:Bearer ${ACCESS_TOKEN}" \
'https://discordapp.com/api/users/@me'
結果
{"id": "*********", "username": "***", "avatar": "***********", "discriminator": "9484", "public_flags": 0, "flags": 0, "banner": null, "banner_color": null, "accent_color": null, "locale": "ja", "mfa_enabled": false}
idをUSER IDとして控えます(以下${USER_ID}
)
必要なものは揃ったので、Add Guild Memberに戻ってユーザーを追加・削除してみます。
メンバー参加
curl -i -X PUT \
-H "Authorization:Bot ${BOT_TOKEN}" \
-H "Content-Type:application/json" \
-d \
'{"access_token": "${ACCESS_TOKEN}"}' \
'https://discordapp.com/api/guilds/${GUILD_ID}/members/${USER_ID}'
メンバー退会
curl -i -X DELETE \
-H "Authorization:Bot ${BOT_TOKEN}" \
'https://discordapp.com/api/guilds/${GUILD_ID}/members/${USER_ID}'
感想
まとめ終わらなかったのですが、他にもチャンネル追加やスケジュールイベントなども触ってみました。
サーバー作成については1Botにつき10個までなので、実際にサービスで活用する際には設計で考慮しておかないと厳しい制限ですね。
でも想像以上にできることが多く、さすがDiscordだなと思いました。
今回はお試しでしたが、CAMPFIREコミュニティではDiscordでコミュニティ運営されているオーナー様も多いため、なにかサービスとつなげていけたらなと思っています。
以上、明日のアドベントカレンダーも楽しみにされていてください!