Ⓜ️

(Misskey)絵文字系のAPIを触る時はバージョンに気をつけよう

2023/12/21に公開

この記事はイウしキー Advent Calendar 2023 及び Misskey(2) Advent Calendarに参加しています。

https://adventar.org/calendars/8962
https://adventar.org/calendars/8755

はじめに

皆さんMisskey使ってますか?私は今年初めにMisskeyと出会ってからFediverseにハマり、色々なサーバーを行ったり来たり、コード書き男性の端くれとしてちょこちょこと関連アプリを開発したりしました。

Misskeyの各種APIを触っていく中で、カスタム絵文字関連のAPIの使い方が、Misskey及びMisskeyフォークのバージョン違いによって大きく異なっているのが結構大変だったので備忘としてまとめようと思います。

比較するバージョン

現行(v13~v2023.11.2)系

https://github.com/misskey-dev/misskey/releases/tag/2023.11.1

多分今一番使用されているMisskeyです。今回はAPIレスポンスの内容自体に変更が無いのでioフォークは詳しく紹介しませんが、独自にレートリミット等を設けていたりかなり改造が施されているので、Misskey.ioをターゲットにアプリ開発する場合気をつける必要があるでしょう。

v12系

https://github.com/taiyme/misskey

2023年初頭、Misskey本家がv12→v13にアップデートしたタイミングで破壊的変更が多く含まれた為、一部のサーバーではv12をForkして保守する動きがあります。(その現場に居合わせていなかったので間違った説明をしていたらごめんなさい)今回はtaiymeさんのForkを使用します。

Firefish(旧Calckey)系

https://joinfirefish.org/ja/

上記v12からForkされたMisskey派生系で最も有名なのがFirefish(旧Calckey)でしょう。精力的なアップデートにより最早別物と言えるほどの変化を遂げており、バックエンドはRustで書き直されているらしいです。

絵文字一覧の取得

現行系

emojisAPIエンドポイントを使用します。

{
  emojis: [
    {
      aliases: [
        'えもじ',
        'emozi',
	...
      ],
      name: 'emoji',
      category: 'emoji_category',
      url: '*******.png',
    },
    ...
  ]
}

emojis配列にサーバーに登録されている全ての絵文字情報が入っています。このエンドポイントだけではライセンスなど一部の情報が取得出来ない事に気を付けて下さい。絵文字に対して全ての情報を取得する場合はemojiエンドポイントを使用します。

v12系

サーバー情報を取得するmetaエンドポイントに含まれています。この事実に気付くまでめちゃくちゃ多くの時間を犠牲にしました。

{
  maintainerName: '***',
  maintainerEmail: '***',
  version: '12.119.2-taiyme-v1.2.0',
  name: '***',
  uri: '***',
  ...
  emojis: [
    {
      id: '***',
      aliases: [
        'えもじ',
        'emozi',
	...
      ],
      name: 'emoji',
      category: 'emoji_category',
      host: null,
      url: '*******.png',
    },
    ...
  ]
}

現行系と同じくemojis配列にサーバーに登録されている全ての絵文字情報が入っています。

Firefish系

v12系と同じくmetaエンドポイントから取得します。

{
  maintainerName: '***',
  maintainerEmail: '***',
  version: '1.0.5-rc',
  name: '***',
  uri: '***',
  ...
  emojis: [
    {
      id: '***',
      aliases: [
        'えもじ',
        'emozi',
        ...
      ],
      name: 'emoji',
      category: 'emoji_category',
      host: null,
      url: '*******.png',,
      license: 'ライセンス',
      width: 128,
      height: 128,
    },
  ...
  ]
}

v12系に追加してライセンス情報や画像の大きさ等の情報が追加されているのが特徴です。

ノート

notesnotes/timeline等のエンドポイントから取得できるノート・リアクションに含まれる絵文字の情報です。

現行系

{
  id: '***',
  createdAt: '***',
  userId: '***',
  user: {
    ...
    emojis: {
      remote_emoji: '***.png', // リモートの場合
    },
  },
  text: '***',
  ...
  reactions: {
    '🎉': 2,
    ':emoji@.:': 1,
    ':remote_emoji@remote.server:': 3,
  },
  reactionEmojis: {
    'remote_emoji@remote.server': '***.png', // リモートの絵文字URL
  },
  emojis: {},
  ...
}

ローカルの絵文字は***@.、リモートの絵文字は***@ドメインで表現されます。ローカルの詳細な絵文字情報は配信されない為別途emojisAPIを叩く必要があります。

v12系

{
  id: '***',
  createdAt: '***',
  userId: '***',
  user: {
    ...
    emojis: [
      {
        name: 'emoji',
        url: '***.png',
      },
    ],
  },
  text: '***',
  ...
  reactions: {
    ':emoji@.:': 1,
    ':remote_emoji@remote.server:': 1,
  },
  emojis: [
    {
      name: 'emoji',
      url: '***.png',
    },
    {
      name: 'remote_emoji@remote.server', // リモートの絵文字URL
      url: '***.png',
    },
    ...
  ],
  ...
},

似ているようでかなり違います。まずreactionEmojis要素が無くなっていること、絵文字の内容が連想配列で無くなっていること、ローカルの絵文字情報も配信されている事等が挙げられます。

Firefish系

{
  id: '***',
  createdAt: '***',
  userId: '***',
  user: {
    ...
    emojis: [
      {
        name: 'emoji',
        url: '***.png',
       width: 128,
       height: 128,
      },
    ],
  },
  text: '***',
  ...
  reactions: {
    ':emoji@.:': 1,
    ':remote_emoji@remote.server:': 1,
  },
  reactionEmojis: [
    {
      name: 'emoji',
      url: '***.png',
      width: 128,
      height: 128,
    },
    {
      name: 'remote_emoji@remote.server', // リモートの絵文字URL
      url: '***.png',
      width: 128,
      height: 128,
    },
    ...
  ],
  emojis: [
    {
      name: 'emoji',
      url: '***.png',
      width: 128,
      height: 128,
    },
    {
      name: 'remote_emoji@remote.server', // リモートの絵文字URL
      url: '***.png',
      width: 128,
      height: 128,
    },
    ...
  ],
  ...
},

v12系のレスポンスをベースに、互換性確保の為かreactionEmojis要素が復活し、emojisと同じ内容の配列が入っています。まあデータの型が現行Misskeyと違うのであんまり意味ないんですが

こちらも絵文字のサイズ情報が格納されています。サードパーティクライアント開発者には嬉しいですね。

まとめ

MisskeyのAPIを触る時は対象サーバーのバージョンを確認し、APIコンソールから使用したいエンドポイントのレスポンスを確認するのが吉でしょう。

だいぶあっさりした記事でしたがお役に立てれば幸いです。

Discussion