header source
my icon
esplo.net
ぷるぷるした直方体
Cover Image for multipostter - 手間のないマルチポストツール

multipostter - 手間のないマルチポストツール

だいたい7分で読めます

背景

世はSNS戦国時代。テキスト主体のマイクロブログSNS界は混沌としています。

かつてはTwitterだけ見れば多くの情報が手に入っていましたが、使いやすいクライアントがなくなり、情報取得が難しくなりました。また、発信側としてはTwitterにだけ流せば十分広まった情報が、ユーザーの分散によりリーチが難しくなっています。

分断されたネットワーク

一部のSNSでは共通プロトコルを使用し、他ネットワークにアクセスすることができます。有名な例では、ActivityPubで繋がるmastodonサーバーとMisskeyサーバーで、お互いの投稿を閲覧したりリプライすることができます。他にもATProtocolのBlueskyのように、オープンなプロトコルをベースとしているため連携が容易なものが出てきています。

一方で、プロトコルが異なればシームレスな連携は難しく、またそれぞれのSNSでの対応具合もまちまちです。Threadsのfediverse対応も長い時間がかかっています。

理想的には全てのネットワークが繋がり、好きなSNSに入り浸りつつ他所も簡単に覗ける、言わば「一つの窓から全て覗ける」状態が良さそうです。しかし現実的には難しいです。

対策

このような現状で取り得る対策は何でしょうか?簡単な解決方法は、各ネットワークに同じ投稿を流すマルチポストです。

例として、Blueskyを使いこなす魔法を駆使するフリーレンを見てみると、旧Twitterの投稿の一部がBlueskyに流されていることが分かります。全てでない理由は不明ですが、重要なお知らせだけ流れているのかもしれません。このように、異なるネットワークへのマルチポストにより、Blueskyのクライアントを使っている人は簡単に情報にアクセスできます。

では、具体的なマルチポストの手法を見てゆきましょう。単にマルチポストと言っても、大別して二種類の方法があります。

マルチポスト - push型

一つは、投稿する際に複数のネットワークに同時に投げる手法です。これをpush型とします。比較的よく見かける形です。

こちらはサーバーが不要で、リアルタイムで反映させられ、かつ投稿先により細かなカスタマイズができます。各種SNSの機能を十分に使いたい場合に選択肢に上がります。

一方で、大きなデメリットとして、投稿に特殊なクライアントが必要な点が挙げられます。使い慣れたクライアントが使えず、リーダーと分離していることも多々あるため、めんどくさくなって使うのを辞めてしまう可能性があります。企業で投稿を全てコントロールしたい場合は良いかもしれませんが、一般人が使うにはなかなか難しいと考えられます。

push型
push型

マルチポスト - pull型

もう一つの方法は、投稿を検知して複数のネットワークにミラーする手法です。これをpull型とします。

この方法では主となるネットワークを1つ決め、そこに投稿されたものを検出して他のネットワークに流します。サーバーが必要、遅延が発生すること、SNSごとの独自機能を活かせないといったデメリットはありますが、何より手間無くマルチポストを実現できます。

pull型
pull型

今回作成したツールでは、pull型でマルチポストをしたいと思います。

技術的な話

制約とデザイン

現在の環境に合わせ、主のネットワークをMisskey.ioとし、ミラー対象にBluesky旧Twitterを指定しました。これは変更可能ですが、Twitter APIは現在書き込みのみ無料なので、主ネットワークとしては使えません。

次に、これらのSNSに共通する汎用的な投稿フォーマットを定めます。主ネットワークから投稿を拾い、このフォーマットに変換して他のネットワークに流します。
投稿文字列、添付された画像や動画、投稿時刻という一般的な内容で構成しますが、SNSにより添付ファイルに制限があります。Misskey.ioは一番制約が緩く意識しないで良いのですが、Blueskyでは各ファイル1MB、旧Twitterでは4つまでなので、これを意識して実装を進めます。

misskeyの投稿を拾う

Misskey.io API Docを見ながら、HTTPリクエストを発行すると拾えます[1]。リプライやリノートを含めないこともできるため、簡単に他ネットワークへ流すための投稿一覧を取得できます。

Blueskyのサイズ上限と戦う

前述した通り、Blueskyの添付ファイルサイズ制限は非常に厳しく、1つ1MBまでです。そのため、本ツールではMisskey.ioから拾った投稿に付属する画像は、sharpを使って画像を縮め、ファイルサイズが十分小さくなるような処理をしています。

手間とコストの無いサーバー

本ツールはフルサーバーレスな構成、かつIaCなので管理が簡単です。

投稿を拾って流す部分はAWS Lambdaに載せ[2]、10分に一度実行するようにしています。10分程度の遅延であれば許容できるのではないでしょうか。どこまで投稿したかの管理はDynamoDBに1レコードを書き込むだけです。

この構成は管理が簡単なだけでなく、無料枠で収まるため、費用ゼロ[3]で実現できます。

また、IaCはAWS CDKを使って、1コマンドでデプロイできるようにしています。壊れても修復が簡単です。

使い方

Githubにソースを上げています。利用にはAWSやSNSのAPIに対する知識が必要なので、誰でも使えるわけではないですが、興味のある方は動かしてみてください。

https://github.com/esplo/multipostter

まとめ

APIが使えないSNSはおしまい!

脚注
  1. JavaScriptのクライアントもありましたが、アーカイブされました https://github.com/misskey-dev/misskey.js/ ↩︎

  2. sharpをLambdaに乗せるのはやや大変です ↩︎

  3. 少し掛かってるかもしれませんが、普通に使えば$1も掛からないはず ↩︎

Share