Slackからの脱出とDiscordへの移動

長々と。

TweetDeckが機能しなくなってから、TwitterやらRSS、更新通知などはSlackに投げるようにして
それらを快適に使っていたのだけれど、1万件制限のあるSlackフリープランでは消えるのが早く
特に、1日に何度もデータを流してくるようなRSSに食い尽くされるようになってきていた。

そこで、これらの「比較的すぐに消えていい通知」をDiscordに流すように変えてみようと思う。
Slackへ投げる方法はIFTTTを使用しており、通知の送信先を変更するだけなので簡単にできる。

しかし、現時点ではIFTTTからアカウント連携でDiscordへ投げるという手段はとれず
少々面倒な、Makerチャンネルを使用しなければならない。
つまり、生のWebhookをDiscord投げるという方法を取らなければならない。

通常のレシピ作成と同様、「if」の部分はRSSやTwitterなどのソースを選択できる。
問題は「that」であり、ここはMakerチャンネルを使用する。

本当に重要

Make a web requestでは、DiscordのWebhookURLを入力する。
WebhookURLの作成についてはDiscordのIntro to Webhooksで解説されている。

https://support.discordapp.com/hc/en-us/articles/228383668-Intro-to-Webhooks

注意するのは、DiscordのWebhookAPIでは、データの受け取れる方法が決まっていることだ。
正確には、仕様に従えば相当自由にできるが、簡略化するために便利な方法が用意されている。
これは、とても重要なことで2回どころではく、5回も言うよマジでマジでとわざわざ書かれるほど。

To make the webhook display messages properly, it’s really really really REALLY really important that you append ‘/github’ at the end of it. Yes, like five-reallys important.

GitHub形式のWebhookを受け取るためには「/github」をWebhookURLに付け加えること。
それだけが重要なことである。

Webhook Objectの記述を簡略化するために、URLに「/github」を追加するだけで
GitHub形式のWebhookはこちらで解釈しますよ、という親切な設計である。
ただし、WebhookURLに「/github」のないものは、Discord形式のWebhookとして扱われ
Discordが定義しているWebhook Objectでないなら捨てられるのだが。

Slack形式のWebhook

GitHubからのWebhookの受け取り方に話がそれたが、これにはSlack形式も用意されていて
こちらは「/slack」をWebhookURLに付け加えること、とされている。
Make a web requestにはこのURLを使用する。

Methodは「POST」、Content-Typeには「application/json」を選択する。
Bodyの中身についてはSlackのAPIと同様なので、詳しいことはSlackAPIのヘルプを参照しろ
とのことである。

https://discordapp.com/developers/docs/resources/webhook#execute-slackcompatible-webhook
https://api.slack.com/incoming-webhooks

ちなみに、Slack形式のWebhookの中身はというと、以下のとても単純なもの。

{ "text":"This is a line of text.\nAnd this is another one." }

これを応用して、RSSのタイトルとURLをDiscordへ投げるということであれば、こうなる。

{ "text": "{{EntryTitle}}\n{{EntryUrl}}" }

結局、RSSのタイトルとURLを受け取るには

項目 内容
Make a web request https://discordapp.com/api/webhooks/xxx/xxx_xxx-xxx_xxx/slack
Method POST
Content-Type application/json
Body { “text”: “{{EntryTitle}}\n{{EntryUrl}}” }

IFTTTを使用する場合、ソース(if)によってBodyに選択できる情報に差異ができてしまうので
ソースによって別々のBody定義が必要になるのが難点。

You may also like...