Discord APIを"生"で触る:スレッド作成編
概要
Discordのbotを構築する際、Discord.pyやDiscord.jsなどのAPIラッパーを用いることが多いと思います。しかし、用途によってはこれらを用いず、いわゆるREST APIを使用した方が簡素で楽な場合もあります。
実際、DocumentationのGatewayの項には、以下のように書かれています。
In most cases, performing REST operations on Discord resources can be done using the HTTP API rather than the Gateway API.
Gateway APIはWebsocketですが、わざわざWebsocketに繋ぐ必要がないユースケースも色々あるかと思います。
諸注意
APIラッパーを使用しているときはあまり気にかけない注意点です。
認証
認証には、基本的にDiscord.py等を利用するときと同じトークンを用意します。
トークンはヘッダに含めて送信します。具体的には以下の通りです。
authorization: Bot {token}
content-type: application/json
Bot
から1文字スペースを空けてトークンを記述します。
APIのバージョン
リファレンスのAPI Versioningにもある通り、DiscordのAPIには2022/12/16時点でv10までが存在します。
そのうちv1~v5はもはや存在しておらず、v6~v8もDeprecated扱いになっています。
特段の事情がなければv9もしくはv10を利用するのが良いでしょう。
エンドポイントURL
全てのエンドポイントは以下のURLで始まります。ここで、{Version number}
はバージョン番号です。
https://discord.com/api/v{Version number}
v10を利用する場合は以下のようになります。
https://discord.com/api/v10
後述するCreate Messageのエンドポイントは/channels/{channel.id}/messages
なので、URL全体としては以下のようになります。ここで、{channel.id}
はチャンネルのIDです。
https://discord.com/api/v10/channels/{channel.id}/messages
実際何に使えるのか
ここでは具体的なユースケースを1つ提示します。
定期的な実行
決まった時間/一定時間ごとに何らかの動作をするというのには、Gatewayは必要ないでしょう。
例えば、私のいるサーバーでは平日の朝9時頃に日付の名前のスレッドを立て、その日の予定をスレッドに投稿するという作業をしているのですが、これは自動化が容易です。
使うエンドポイントはStart Thread without Message
とCreate Messageの2つです。
事前にスレッドを作成したいチャンネルのIDを控えておきます。
リファレンスに沿ってStart Thread without Messageのエンドポイントに以下のJSONを送信します。
{
"name": "スレッド名",
"type": 11,
"auto_archive_duration": 60
}
-
type
はチャンネルのタイプを設定します。値は10
(Announcement Thread)、11
(Public Thread)、12
(Private Thread)のいずれかで良いかと思います。ここではPublic Threadを作っています。 -
auto_archive_duration
はスレッドがinactiveになってからスリープするまでの時間(分
)です。値は60
(1時間)、1440
(1日間)、4320
(3日間)、10080
(7日間)のいずれかを設定します。
リクエストが成功すると以下のようなJSONが返却されます。
ID等は伏せています。
{
"id": "**********",
"guild_id": "**********",
"parent_id": "**********",
"owner_id": "**********",
"type": 11,
"name": "スレッド名",
"last_message_id": null,
"thread_metadata": {
"archived": false,
"archive_timestamp": "2022-12-01T04:05:51.228000+00:00",
"auto_archive_duration": 60,
"locked": false,
"create_timestamp": "2022-12-01T04:05:51.228000+00:00"
},
"message_count": 0,
"member_count": 1,
"rate_limit_per_user": 0,
"flags": 0,
"total_message_sent": 0
}
ここでid
がそのままチャンネルIDとして扱えます。
あとはCreate Messageのエンドポイントに、チャンネルIDとして先程取得したid
を使ってPOSTします。
ちなみに投稿だけであれば以下の記事が示すようにWebhookのみで可能です。認証も不要です。
Discord APIはそんなに怖くない
Discord APIは何もAPIラッパーがないと扱えない難しいものではありません。もちろんGatewayは難しいですが、REST APIもたくさん用意されています。
Discussion