トップに戻る

MisskeyのWebhookを使ってみよう

これはMisskey Advent Calendar 2022 14日目の記事です

はじめに

みなさんこんにちは、Bot専門家のかぼです

今回もMisskeyのBotに関係することですが、コードが書けない人でも(多分)使えるような記事です

Webhook

MisskeyにはWebhook機能があるのを知っていますか?

簡単に言うとMisskeyから別のサービスに投稿や通知とかを転送できるような機能です

v12.109.0から使えます

これを使えばDiscordに投稿や通知を転送したり、サーバーを動かすことなくMisskeyのBotを作ることができます

実際にこのWebhook機能を使って、SortBotを作りました

どうやって使うの?

設定を開き、下の方に行くとWebhookの項目があります

Create Webhookを押すと作ることができます

名前とかURLとかシークレットキーを入れて、どのイベントを飛ばすか選んだら作成してMisskeyの準備はOK

使ってみよう

試しにCloudflare Workersを使ってMisskeyに来たメンションをDiscordに飛ばすようなものを作ってみよう

Misskeyから来るデータとDiscordに送るデータの規格が異なり、直接転送できないのでWorkersを通します

WorkersじゃなくてもAWS LambdaとかFaaSと呼ばれるものだったら多分何でもできるはず

Workers以外でやったことないので知りません

Cloudflareのアカウントの作り方とかは省きます

1. Discordの受け取るWebhook URLを作る

転送したいチャンネルの設定の連携サービスからWebhookを作り、URLをコピーしておきます

discord1

discord2

2. Cloudflare Workersのサービスを作る

CloudflareからWorkersのサービスを作ります

名前とかは適当に

スターターも後でコードをコピペするのでなんでもいいです

workers1

サービスができたら右上にあるクイック編集を押してエディタを開きます

開いたら下にあるコードをそのまま上書きコピペしてください

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
export default {
  async fetch(request, env) {
    if (request.headers.get('X-Misskey-Hook-Secret') !== env.SECRET) {
      console.log('wrong secret');
      return new Response('wrong secret');
    }

    const reqBody = await request.text();
    if (!reqBody) {
      console.log('no body');
      return new Response('no body');
    }

    const body = JSON.parse(reqBody);

    if (body.type !== 'mention') {
      console.log('not mention');
      return new Response('not mention');
    }

    const note = body.body.note;
    const user = note.user;
    const username = user.host ? `${user.username}@${user.host}` : user.username;

    const ok = await fetch(env.DISCORD, {
      body: JSON.stringify({
        content: `User: ${username}\nText: ${note.text}`,
      }),
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
    }).then((res) => res.ok);

    return new Response(ok ? 'ok' : 'error');
  },
};

コピペしたら下にある「保存してデプロイする」ボタンを押して使えるようにします

workers2

デプロイできたら左上にあるサービス名をクリックして前の画面に戻ります

タブが並んでいるところから設定を開き、環境変数を設定します

設定する変数はSECRETDISCORDの2つです

SECRETにはMisskeyから来るWebhookが正しいかどうか、パスワードみたいなものを設定します

これを設定しておくと、WorkersのURLが漏れたとしてもSECRETが漏れなければいたずらされにくくなります

次にDISCORDにはさっき作ったDiscordのWebhook URLを入れます

2つとも入力したら必ず暗号化ボタンを押して暗号化します

そうすると、安全なのでしておきましょう

workers3

これでWorkersの設定は終わりです

3. MisskeyのWebhookを作る

上に書いた方法でMisskeyのWebhookを作ります

名前はなんでも、URLにはWorkersのURLを入れます

サービスのダッシュボードにそれっぽいのが書いてあるのでそれをコピペ

Secretにはさっき決めたSECRETと同じ値を入れます

EventsはMentionのみ

misskey1

作成したらこれで完成です🎉

ね、簡単でしょう?

メンションされるとこんな感じでDiscordに来ます

discord3

注意

今のところ(v12.119.2)、作ったWebhookの編集や削除がクライアントからできません

APIはあるので直接叩けば編集できます

そのうち誰かが直してくれるはず

いかがでしたか?

こんな感じで簡単にMisskeyからWorkersを通して他のサービスに転送できるようになります

自分はサーバーレスBotとしてSortBotを作りましたが、他にもいろいろ使い道あるはずなのでみんなも色々遊んでみてね

SortBotのリポジトリはこちらです

参考になるかは知りません

ちなみに、この例で作ったWebhookですがもう消してるのでみんなは使えません

残念