twitter-cardプラグイン
TL;DR
というプラグインを書いたけど、Twitter側はまだいいとして、Worldonと組み合わせてしまうとあまり使い物にはならないね、というだけの話です。
以下、主にプラグイン開発者向けの話。
mikutterにおける引用
↑でも少し触れましたが、mikutter 3.7では引用の処理の仕方が変わったのです。
3.6までは、カスタムModelがquoting_messages
というメソッドを定義して、カスタムModelのArrayを返してやれば、それを引用として表示する、というものでした。
この仕様では、自分が書いたプラグインにいろいろ対応させることはできます。実際、WorldonではtweetのURLには特別に対応し、tootの中にtweetのURLが引用されていれば、それを返すようにしていました。そのため、tweetのURLがmastodonで流れてきていれば、それを引用として表示することができていました。
ところが、「自分が書いたプラグインのモデルを、他のプラグインに引用させる」ことはできないのです*1。TwitterプラグインのカスタムModelであるPlugin::Twitter::Message
というモデルはquoting_messages
メソッドを実装していましたが、Worldonや、そのカスタムModelであるPlugin::Worldon::Status
というモデルのことは知らないので、Plugin::Twitter::Message#quoting_messages
がPlugin::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として返す、というものです。
TwitterやMastodonに限らず、(マイクロ)ブログサービスで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ではそれはやりませんでした。