DiscordのAPIをちょっと触ってみる

🎄🎄この記事は、[2021年CAMPFIRE Advent Calendar](https://qiita.com/advent-calendar/2021/campfire) 19日目の記事です🎄🎄

こんにちは、CAMPFIREコミュニティのエンジニアのmoriです。
今回はDiscordのAPIを少し触って見ようと思います！

## 実行環境
cURL

## 今回の目標

- botでサーバーを作成する
- メンバーを参加／退会させる


## とりあえずアプリケーションとBotの作成

Discordアカウントでログイン後
https://discord.com/developers/applications
こちらにアクセスして、「New Application」からアプリケーションを作ります。
![スクリーンショット 2021-12-19 21.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15563/b8aa8145-d8ca-e658-5e81-da63d62cccf1.png)



次にBotを「Bot」メニューから作成していきます。
![スクリーンショット 2021-12-19 21.22.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15563/d1dbd122-ce22-086e-7374-55ec3af44ed6.png)
`USERNAME`はDiscordサーバーに追加されるユーザー名になるので、Botとわかる名前にしていたら親切かなと思いました。
![スクリーンショット 2021-12-19 21.26.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15563/8be7a7c8-8d9f-137e-77df-24ee2eeeee3d.png)

こちらの画面で、Botの`TOKEN`を「Copy」ボタンからコピーして控えておきます。
以後この値は`${BOT_TOKEN}`と表記します。

## Botでサーバーの作成
今回公式ドキュメントを読むにあたって最初に戸惑ったのが、RESOURCESの中にServerがいないというところでした。
読み進めていくと、Guildが表でのServerにあたるようです。
ドキュメントはこちら↓

https://discord.com/developers/docs/resources/guild


```
 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}`)

## メンバーを参加／退会させる
とりあえずドキュメントから見ていきます。

https://discord.com/developers/docs/resources/guild#add-guild-member
>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」を開きます。
![スクリーンショット 2021-12-19 22.11.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15563/30c73cf4-893d-4d9e-6c56-5c4ff02cdf7a.png)
こちらの画面から「CLIENT ID」（以下`${CLIENT_ID}`)、「CLIENT SECRET
」（以下`${CLIENT_SECRET}`）をコピーして控えておきます。

その後、「Add Redirect」からRedirectURLを追加します。
![スクリーンショット 2021-12-19 22.15.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15563/d04d0235-3560-0744-c126-4f5f680e8169.png)

今回は特にWebアプリケーションを作るわけではないので、ローカルの適当なURLに飛ばすことにします。
こちらのURLも必要になるため、控えておきましょう（以下`${REDIRECT_URL}`)


次は「URL Generator」を開きます。

以下のSCOPESを選択します。

```
identify
connections
guilds.join
```

SELECT REDIRECT URLは先程追加したURLを選択します。

選択が完了するとGENERATED URLにURLが作成されるので、コピーしてブラウザでアクセスします。

![スクリーンショット 2021-12-19 22.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15563/4beb3cc1-438e-9466-fd07-94804ced23c5.png)

認証を押すと先程の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に戻ってユーザーを追加・削除してみます。

https://discord.com/developers/docs/resources/guild#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}'
```

https://discord.com/developers/docs/resources/guild#remove-guild-member

メンバー退会

```
curl -i -X DELETE \
   -H "Authorization:Bot ${BOT_TOKEN}" \
 'https://discordapp.com/api/guilds/${GUILD_ID}/members/${USER_ID}'
```

## 感想

まとめ終わらなかったのですが、他にもチャンネル追加やスケジュールイベントなども触ってみました。
サーバー作成については1Botにつき10個までなので、実際にサービスで活用する際には設計で考慮しておかないと厳しい制限ですね。
でも想像以上にできることが多く、さすがDiscordだなと思いました。


今回はお試しでしたが、CAMPFIREコミュニティではDiscordでコミュニティ運営されているオーナー様も多いため、なにかサービスとつなげていけたらなと思っています。


以上、明日のアドベントカレンダーも楽しみにされていてください！