ストリーミングAPIの利用方法

目次

MisskeyのWebSocket通信によるストリーミングAPIでは、リアルタイムなイベントの受信や通常のAPI操作が行える。

WebSocket通信のテストには、Google Chrome拡張機能のBrowser WebSocket Clientが便利である。

https://misskey.io/docs/stream

ストリームに接続する

WebSocket通信のエンドポイントは、misskey.ioなら次のとおりである。

iは自分のものに置き換えること。iの取得方法についてはこちらを参照

wss://misskey.io/streaming?i=1248aBCDeFGH1632

認証情報が必要ない操作のみ行う場合は、認証情報は不要だ。

wss://misskey.io/streaming

APIリクエスト

まずは、ストリーミングAPIでノートの投稿をしてみよう。

{
    "type": "api",
    "body": {
        "id": "hoge",
        "endpoint": "notes/create",
        "data": {
            "text": "yee haw!"
        }
    }
}
  • type"api"とする。
  • body.idは、応答を区別できるようにするためのものだ。適当な文字列で構わない。
  • body.endpointでアクセスしたいエンドポイントを指定する。
  • dataに送信するデータを指定する。

上のJSONを送信し、投稿に成功すると、サーバーは以下のように返答してくる。

{
  "type": "api:hoge",
  "body": {
    "res": {
      ... // 作成されたノートの情報
    }
  }
}
  • typeapi:(送信時に指定したid)となる。
  • body.resに返り値が含まれる。

チャンネル

チャンネルに接続することで、通知やタイムラインの更新を受け取ることができる。

チャンネルに接続する

グローバルTLチャンネルに接続してみよう。

{
  "type": "connect",
  "body": {
    "channel": "globalTimeline",
    "id": "global"
  }
}
  • type"connect"とする。
  • body.channelに接続したいチャンネルを指定する。
    チャンネルは以下の5つを指定できる。
    • main(自分の通知)
    • homeTimeline(ホームTL)
    • localTimeline(ローカルTL)
    • hybridTimeline(ソーシャルTL)
      ハイブリッドTLとはソーシャルTLの旧称である。
    • globalTimeline(グローバルTL)
  • body.idにはAPIリクエストと同じように適当な文字列を指定する。

イベントの受信

チャンネルに接続すると、イベントを受信するようになる。

{
  "type": "channel",
  "body": {
    "id": "global",
    "type": "note",
    "body": {
      ... // グローバルTLに流れてきたノートの情報
    }
  }
}
  • type"channel"である。
  • body.idは接続時に指定したidである。
  • body.typeはイベントの種類で、タイムラインチャンネルならばnoteである。 mainチャンネルでは、以下のタイプが流れてくる。
    • renote(リノート)
    • mention(メンション)
    • readAllNotifications(通知が全て既読になったことを示す)
    • meUpdated(自分の情報が更新された)
    • follow(フォローした)
    • unfollow(フォロー解除された)
    • followed(フォローされた)
    • messagingMessage(チャットにメッセージが来た)
  • body.bodyが内容である。上の例の場合はノートの内容である。

チャンネルから切断する

{
  "type": "disconnect",
  "body": {
    "id": "foobar"
  }
}
  • typedisconnectとする。
  • body.idは接続時に指定したidとする。

投稿のキャプチャ

投稿のリアクションや投票の状況、そして投稿が削除されたことをリアルタイムに取得できるよう、Misskeyでは投稿のキャプチャと呼ばれる仕組みを提供している。

キャプチャする

{
    "type": "subNote",
    "body": {
        "id": "800......."
    }
}
  • type"subNote"とする。
  • body.idはキャプチャしたい投稿のidとする。

イベントの受信

いづれのイベントも、

  • type"noteUpdated"である。
  • body.idはイベントが発生した投稿のidである。
  • body.typeが発生したイベントのタイプである。

reacted(リアクションされた)

{
    "type": "noteUpdated",
    "body": {
        "id": "800.......",
        "type": "reacted",
        "body": {
            "reaction": "like",
            "userId": "801......."
        }
    }
}
  • body.body.reactionはリアクションの種類である。
  • body.body.userIdはリアクションを付けたユーザーのidである。

unreacted(リアクションが外された)

内容としてはreactedとほぼ同じであるので割愛。

deleted(削除された)

{
    "type": "noteUpdated",
    "body": {
        "id": "800.......",
        "type": "deleted",
        "body": {
            "deletedAt": "2018-10-22T02:17:09.703Z"
        }
    }
}
  • body.body.deletedAtとして削除された日時が含まれる。

pollVoted(投票に票が入った)

{
    "type": "noteUpdated",
    "body": {
        "id": "800.......",
        "type": "deleted",
        "body": {
            "choice": 2,
            "userId": "801......."
        }
    }
}
  • body.body.choiceは票が追加された選択肢の番号である。
  • body.body.userIdは票を追加したユーザーのidである。

キャプチャを解除する

{
    "type": "unsubNote",
    "body": {
        "id": "800......."
    }
}
  • type"unsubNote"とする。
  • body.idはキャプチャを解除したい投稿のidとする。