🧵

Discord APIを"生"で触る:スレッド作成編

2024/01/23に公開

概要

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のみで可能です。認証も不要です。
https://qiita.com/Eai/items/1165d08dce9f183eac74

Discord APIはそんなに怖くない

Discord APIは何もAPIラッパーがないと扱えない難しいものではありません。もちろんGatewayは難しいですが、REST APIもたくさん用意されています。

Discussion