はじめに
この記事はなんとなくDiscord Bot Advent Calendar 2020の14日目を埋めるという動機で書かれました。
なので、クオリティはお察しです(20分で書いたのでと23時40分に書きました。あと20分で書き上がるのか?)。
さて、discord/discord-api-docsを眺めていたらおもしろいものを見つけたので紹介しておきます。(discord/discord-api-docsを眺めるのは割と楽しいですよ。おすすめです。)
ほんとはSlash Commandsのことをやりたかったんですがまだリリースされていないのでどこかでやります。(Gatewayの方はどうせすぐ開発者が飛びつくのでOutgoing WebhookとCloud Functionsとこの記事で紹介するWebhookで遊ぶ。みたいなやつをやりたいと思います。)
discord/discord-api-docs
Discord APIのドキュメント(Discord Developer Portal — Documentation)はGitHubのdiscord/discord-api-docsというRepositoryで管理されています。
このRepositoryのCommitやPRを眺めることで新しく実装される機能やAPIの変更点などをドキュメントのChange Logを見るよりも早く、正確に知ることができます。
また、PRではAPIやDiscordの方針についての議論がされていることもあります。
新しいWebhookエンドポイント
これがCommitです。どうやら、EditとDeleteが可能になったようです。まだドキュメントには反映されていないように見えますが叩いてみましょう。
あまりにも時間に余裕がないので以下に示すブラウザ拡張のREST Clientを使うことにします。
(私だってほんとはかっこよくcurlとかInvoke-WebRequestとか使いたいんです)
RESTClient, a debugger for RESTful web services.
セキュリティ上の警告
使用中のWebhook URLをむやみにこの記事のように公開することは避けてください。
(私はこの記事を書き終わったあとWebhook URLを削除するつもりです)
Webhookを作成する
メッセージを作成する
新機能でもなんでもないので説明はしませんといきたいのですがメッセージIDが今後必要なので説明してしまいます。
メッセージIDを取得するためにwaitパラメータを指定します。
URLは以下のようになります。
https://discord.com/api/webhooks/788055101943185408/o3JsFvBMZNaxUqitnRYKWqIrB-iM6YGbgldh_cAuP4GIT-mcsw6yLcnE1VyZ28QnRkIq?wait=true
メソッドをPOSTにし、ヘッダーにContent-Type: application/json
を指定し実行します。
また、次のようなレスポンスが返却されます。
{
"id":"788056956375007262",
"type":0,
"content":"あと5分とか無理ゲーでしょ",
"channel_id":"788055071027101716",
"author":{
"bot":true,
"id":"788055101943185408",
"username":"edit hook",
"avatar":null,
"discriminator":"0000"
},
"attachments":[
],
"embeds":[
],
"mentions":[
],
"mention_roles":[
],
"pinned":false,
"mention_everyone":false,
"tts":false,
"timestamp":"2020-12-14T14:56:59.790000+00:00",
"edited_timestamp":null,
"flags":0,
"webhook_id":"788055101943185408"
}
ここで0時になりました。(やはり間に合いませんでした)
メッセージの編集
URLはCommitに従い、レスポンスで得られたMessage Idを${Webhook token}/messages/
の後ろにつけて次のようになります。(waitパラメータなしでも結果が帰ってくるようです)
https://discord.com/api/webhooks/788055101943185408/o3JsFvBMZNaxUqitnRYKWqIrB-iM6YGbgldh_cAuP4GIT-mcsw6yLcnE1VyZ28QnRkIq/messages/788056956375007262
画像のようにメソッドをPATCHに変更しリクエストをなげます。
Discordクライアントで確認すると更新されています。
また、ステータスコード200で次のようなレスポンスが返却されました。
{
"id": "788056956375007262",
"type": 0,
"content": "もう0時まわりましたけど?",
"channel_id": "788055071027101716",
"author": {
"bot": true,
"id": "788055101943185408",
"username": "edit hook",
"avatar": null,
"discriminator": "0000"
},
"attachments": [],
"embeds": [],
"mentions": [],
"mention_roles": [],
"pinned": false,
"mention_everyone": false,
"tts": false,
"timestamp": "2020-12-14T14:56:59.790000+00:00",
"edited_timestamp": "2020-12-14T15:10:27.056358+00:00",
"flags": 0,
"webhook_id": "788055101943185408"
}
メッセージの削除
編集と同じURLへDELETEを発行するだけです。
メッセージが存在する場合は204が、削除済みの場合は404が返却されます。
感想
どんなに頑張っても1時間はかかってしまいますね。
以下に示すやらかしがなくても間に合いませんでした。
Slash CommandsとOutgoing WebhookとCloud FunctionsとWebhookで遊ぶ記事は面白そうなので書きたいと思います。
やらかし
messagesをつけ忘れて記事の成立が危うくなった人の図を示しておきます。
URLはCommitに従い、レスポンスで得られたMessage IdをWebhook tokenの後ろにつけて次のようになります。
https://discord.com/api/webhooks/788055101943185408/o3JsFvBMZNaxUqitnRYKWqIrB-iM6YGbgldh_cAuP4GIT-mcsw6yLcnE1VyZ28QnRkIq/788056956375007262?wait=true
画像のようにメソッドをPATCHに変更し…405 Method Not Allowed…あ、まだリリースされてなかったみたいですね。