📝

Fediverse3年目にしてクロスポストに落ち着く

に公開

これはFediverse Advent Calendar 2025 9日目の記事です。

はじめに

みなさんこんにちは、Misskeyサーバー Polestarの鯖缶をしているSoliです。
毎年Fediverse Advent Calendarはその年のPolestarを振り返っていましたが、今年は振り返るほど大きな変化もなく、安定した1年でした。

とはいえ何もしていなかったわけではなく、自分がMisskeyを使うのに使いやすいようなツールを作ったり、Summalyと呼ばれるURLプレビューのプロキシサーバーを別建てしたりなど、周辺コンポーネントはちょくちょく手を入れていました。

その中でも特に気に入っているのが、note-tweet-connectorというMisskeyとTwitterのクロスポストWebhookサーバーです。

K8sデプロイにはHelm Chartもあります。

昨今TwitterとMisskeyのクロスポストツールは多くあります。しかし、自分が欲しいものはどれにも当てはまりません。

今回はなぜ自作したのか、どのように実現しているのかを紹介します。

作った理由

note-tweet-connectorは以下の要件をベースに作っています。

  • MisskeyのノートがTwitterに転送される
  • ツイートがMisskeyに転送される
  • Misskeyの標準クライアントを含むいかなるクライアントで投稿しても挙動は変わらない
  • PC/スマホを問わない
  • 画像付きノートは、そのまま画像付きツイートとして転送される
  • Misskeyのパブリックなノートのみ転送される
  • RT/RNも同様に扱われる

言ってしまえば、最初にセットアップさえすればあとはもう何も考えずに同じ投稿がMisskey・Twitterでなされるものが実現したかったのです。

例えば、クライアントを使う手法であると、個人的に気に入ってるMisskeyの標準Webクライアントではクロスポストができません。また、Chrome拡張機能を使った手法だと、スマートフォンではできないことになります。

本当に、どの環境からでも遜色なくクロスポストを実現するには、自分で作るしかありませんでした

アーキテクチャを考える

では、サーバーのアーキテクチャを見ていきます。

Misskeyとの接続を考える

まず、Misskey側を考えます。

Misskeyの場合もちろんAPIやWebhookがフルに使えます。
ノート投稿用のAPI、ノート投稿時のWebhook、RN時のWebhookなど、今回必要そうなものはすべて揃っています。

そうです、Misskeyのことは正直なところ何も考える必要がありません。
APIドキュメントもサーバー自体に内包されていますし、あとは仲良くなるだけです。

Twitterとの接続を考える

問題はTwitterです。

Twitterの場合APIをまともに使うには月200ドルなどというあり得ない料金を課されます。

そこで、IFTTTを使います。
IFTTTなら年間4,200円でTwitterに対する投稿ができます。発火はもちろんWebhookです。

IFTTTなら「特定のアカウントが投稿したとき」という発火条件もあるので、このイベントをconnectorに送ってやればよいです。

とはいえ、画像投稿についてはTwitter APIの無料プランを使います。
頻繁に画像投稿をするわけでもないですし、画像投稿の場合否が応でもTwitter APIを叩く必要があります。
この部分の実装は、以下の記事を参考にしました。

重複を防ぐ

これでデータフローは完成しました。
しかし、このまま使うとノートとツイートがループしてしまいます。

そこで、connectorを通過した投稿は内容をハッシュ化して記録し、同じハッシュを検知した場合はループを防ぐために破棄する仕組みを入れています

一見簡単そうにみえますが、MisskeyからTwitterに投げ、それがconnectorに戻ってきた場合、リンクが含まれていると短縮リンクになっているので、厳密には一致しません。

また、記号の類いがURLエンコードされたままになっていたりなど、かなり気を遣う必要があります。(正直実装仕切れておらず、たまに重複していることがあります)

また、このハッシュの保持は現状インメモリで行っています。将来的にはRedis/Valkeyなどを使いたいなあと思っています。(まあ、個人ユースですしシングルユーザーのことしか考えていないので特に問題ありません)

その他細かいところ

Misskey側では公開範囲が柔軟に設定できます。connectorは公開範囲が公開(連合有無は無視)を転送します。

RTはIFTTTが送ってくる形式をそのままMisskeyに投稿します。
逆にRNはIFTTTが送ってくるような形式に合わせてTwitterに転送します。

まとめ

これらが、note-tweet-connectorのアーキテクチャです。
図にすると以下のようになります。

architecture
note-tweet-connector アーキテクチャ

おわりに

この3年ほとんどMisskeyに張り付いているので、マイクロブログとしての何気ない投稿はMisskeyだけになりました。

Fediverseに投稿を行うということは実質的に、つながっているサーバーすべてに自分のアカウントがあって、すべてに投稿しているようなものです。
このconnectorはその仕組みにTwitterを組み込むようなものだと考えています。

Misskeyの自分も、Twitterの自分も同じで、それぞれに固有の繋がりがあるわけですし、同じような状態にしたいというのはFediverseにいるからこその自然な発想なのかもしれないなと感じました。

これからも、自分にとって自然で心地よいかたちで、MisskeyとTwitter、そしてFediverseとの付き合い方を探っていけたらと思います。
そしてあわよくば、note-tweet-connectorが誰かの役に立てたら幸いです。

Discussion