twitter-cardプラグイン

TL;DR

というプラグインを書いたけど、Twitter側はまだいいとして、Worldonと組み合わせてしまうとあまり使い物にはならないね、というだけの話です。

以下、主にプラグイン開発者向けの話。

mikutterにおける引用

↑でも少し触れましたが、mikutter 3.7では引用の処理の仕方が変わったのです。

3.6までは、カスタムModelquoting_messagesというメソッドを定義して、カスタムModelのArrayを返してやれば、それを引用として表示する、というものでした。

この仕様では、自分が書いたプラグインにいろいろ対応させることはできます。実際、WorldonではtweetのURLには特別に対応し、tootの中にtweetのURLが引用されていれば、それを返すようにしていました。そのため、tweetのURLがmastodonで流れてきていれば、それを引用として表示することができていました。

ところが、「自分が書いたプラグインのモデルを、他のプラグインに引用させる」ことはできないのです*1TwitterプラグインのカスタムModelであるPlugin::Twitter::Messageというモデルはquoting_messagesメソッドを実装していましたが、Worldonや、そのカスタムModelであるPlugin::Worldon::Statusというモデルのことは知らないので、Plugin::Twitter::Message#quoting_messagesPlugin::Worldon::Statusを返すことは無いわけです。

西端の放送局、brsywe--mikutterの薄い本制作委員会から参照できる「mikutterの薄い本vol.11」には、intentという機能が紹介されていますが、p.21にhandleというものについて触れられています。これを使うと、URLとカスタムModelを結びつけることができます。

mikutter 3.7では、このhandleで定義されるURLとカスタムModelの紐づけを通じて、引用対象を取得するようになりました。 Plugin::Twitter::Messageには、最初からhandleが定義されていますから、Toot内のTweetは(URLだけ正しくScoreに入れておけば)自動的に引用されるわけです。

Plugin::Worldon::Statusについては、handleを追加する更新を行いました。これにより、Tweet内のTootについても、引用表示されるようになっています。イタコ芸が捗りますね!

これは単にTwitter-Mastodon間の話ではなく、他のあらゆるカスタムModelで、handleを定義して、timeline: trueにしておけば、引用・被引用が自在になるのです。

そういうわけで

被引用だけがされるモデルを作るなら簡単だろう、という目論見で作ったのが冒頭で紹介したtwitter-cardプラグインです。これは、あらゆるURLに反応し、もしそのURLがOpenGraphProtocolやTwitterCardといったメタ情報の提供規格に沿っていれば、それを引用できるようにカスタムModelとして返す、というものです。

TwitterMastodonに限らず、(マイクロ)ブログサービスでURLを貼り付けるのは日常茶飯事です。こういったものが多少詳しめに表示されれば、TwitterCardと同様の恩恵を得ることができます。

だが、幸せは長くは続かなかった……

ところでmastodonもOGPに対応しています。つまり、mastodonのユーザーページや単独Tootのページ、ハッシュタグ検索用のURLなどからHTMLを取得すると、OGPの情報が取得できるので、つまりtwitter-cardプラグインのモデルが取得され、それが引用されます。

これが本当に鬱陶しく、特に、リプライ時にいちいち相手のアカウント情報が出たり、ハッシュタグを複数並べるような場合(特にpawooで絵を上げる場合などによくある)、それぞれのハッシュタグごとにコレが出てしまうわけです。しかも大した情報があるわけでもない。これは厳しい。

Twitter側と同様に、timeline: falseなHashTagのようなモデルを作って返せばいい、はずなのですが、別の問題(https://dev.mikutter.hachune.net/issues/1226)があり、一筋縄ではいかないようです。

*1:もちろんモンキーパッチすればできましたが、Worldonではそれはやりませんでした。