MisskeyのWebhookを使ってDiscordに通報通知を送る

MisskeyのWebhook機能を使って、通報が発生したらDiscordに通知を送る。

Misskeyサーバーの運営をしていると、通報の対応をする必要が出てきます。
デフォルトでは管理者のメールアドレスにメールが送られるのですが、v2024.7.0からはWebhookも使えるようになりました。
そこで通報を受け取ったらDiscordに通知を送るようにしてみました。
ついでに、サーバーに新規ユーザー登録があった時と、管理者アカウントにリプライやメンションがあったら通知するようにします。

MisskeyのWebhookを使ってみよう - Memo.kabomkがとても参考になりました。ありがとうございます。
このブログを読む前に、上記の記事に目を通しておくことをおすすめします。

必要なもの

  • Misskey v2024.7.0
  • Discordのwebhook url
  • Cloudflare Workersが使えること

やること

  1. このgistをCloudflare Workersに設定します。
  2. Workersの環境変数に以下の値を設定します。(暗号化すること)
    • DISCORD … DiscordのWebhook URLです。
    • SECRET … 適当な文字列を設定します。
  3. アカウントの設定を開き、webhookを作成します。トリガーは「返信されたとき」と「メンションされたとき」にします。シークレットは2のSECRETと同じ値にしてください。
  4. コントロールパネルのwebhookを開き作成します。トリガーは「ユーザーから通報があったとき」「ユーザーが作成されたとき」にします。シークレットは2のSECRETと同じ値にしてください。
  5. コントロールパネルの通報を開き、通知設定から4で作ったwebhookを指定します。

以上です。

これ以降の記事は、デバッグがしんどかった旨をつらつら書いてあるだけなので、興味のある方だけお読みください。

デバッグの記録

Misskeyで通報の通知と新規ユーザー登録の通知がWebhook経由で送れるようになり、これはぜひともDiscordなりで通知を受け取れるようにしたいと思いました。
毎日コントロールパネルを開いてスパムがいないかを確認したり、管理者アカウントを開いて管理者宛のメッセージが来ていないか確認するのは地味に手間がかかるためです。

v2024.7.0がリリースされた後に、「さあDiscordのWebhook URLを指定して終わりじゃい」と思ったんです。
しかしMisskeyのWebhook設定画面にはURLの他にシークレットが必要で、「なんですかそれは」状態になりました。

困った時は公式ドキュメントを見ればいいなと思いWebhook | Misskey Hubを開きましたが、よくわからん。
しかし冒頭の記事に救われました。

記事を読み、どうやらMisskeyとDiscordの間に、通知を仲介する機構のようなものが必要なことがわかりました。
幸いなことに私はCloudflareのアカウントを持っているため、Workersを使うことができました。記事のスクリプトを貼り付けて色々試したところ、Discordには [object Object] と送られてきました。

そうです。私はJavaScriptなんもわからないので、どこをいじればいいのかさっぱりでした。おまけにWorkersのデバッグの仕方もわかりません。
仕方ないので、 console.log(body) と書き、Workersのログ機能を有効化して、Misskeyがどんなリクエストを送っているかを観察することにしました。

観察の結果、ユースケースによってbody.typeが以下のようになることがわかりました。

  • 新規ユーザー作成の場合はuserCreated
  • 通報の場合はabuseReport
  • メンションの場合はmention
  • リプライの場合はreply

あとはbodyに含まれている情報はうまい感じに抜き取って、Discordに送ってあげれば動きました。
出来上がったコードがこちら。めでたしめでたし。

https://gist.github.com/nakkaa/b304e9319bf1b60d2af574f32b40bc1a

ということが今日の午前3時頃の出来事でした。(2時間溶かした。)

あとがき

JavaScriptもworkersもなんもわからん。僕は雰囲気で触っている。誰か教えてくれ。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。