Webhook的に ActivityPub に投稿する実装を作った

Twitterの仕様変更などの影響でここ最近で分散SNSが再び注目されつつある。 分散SNSの利点は脱・中央集権な点にある、という文脈で語られることも多いが、 オープンな仕様・実装が多いというのもまた利点といえる。 そうしたオープンな分散SNSの仕様として有名なのが ActivityPub だ。

ActivityPub と難しさ

オープンな実装の利点はプログラムからのアクセスが容易なことだ。 たとえばX(Twitter)はAPIの制約が厳しく、開発者が気軽にAPIを触ることが難しくなってしまったが、ActivityPub であればそのような制約はない。

そういう流れで、ActivityPub をベースにBOTアカウント的なものを作ってみたいと思い立った。 単一のユーザーとして投稿を発信するだけ、それくらいならサクッと実装できそうだと考えた。

しかし、そう上手くもいかなかった。 ActivityPub は日本語の資料がまだ少なく、勉強が難しい。 W3Cの資料は網羅的だが英語かつ巨大すぎてなかなか読む気力が出ない。 すでにある実装のコードを読んだほうが早いかもしれないとも思ったが、いきなりMastodonやMisskeyなどの大規模なプロジェクトのコードを読むのも骨が折れる。 よって、単一ユーザーで投稿を発信するだけの最小限のActivityPub実装ですら「サクッと実装」とはいかず、停滞した状況がしばらく続いた。

希望が見えてくる

そんなときに、id:Windymelt が開設したActivityPubについての情報共有wikiがあることを id:yu_suke1994 から教えてもらった。

blog.3qe.us

これはまさに求めていたもので、「最小限のActivityPub実装」という欲しかった情報がそのまままとまったページまである。 また、同じ課題(日本語でのわかりやすい資料が少ない)を感じている人が他にもいると知れたのも嬉しかった。 これこそインターネットのあるべき姿か…とひとり感動していた。

BOT的なシンプルなアカウントをActivityPub用に開発する以下の記事もあり大変参考になった。

blog.3qe.us

さらに、@yusukebe によるCloudflare Workers を利用した最小限のActivityPub実装: Minidon を見つけたことも大きかった。単一ユーザーとしての最小限実装のサンプルとしてこちらも参考にさせてもらった。

APubHook の開発

BOT的なアカウントの運用方法として理想的なものは何かと考えたところ、SlackのIncoming Webhookが思い浮かんだ。 発行された秘密のURLに対して {"text": "hello"} のようなJSONをHTTP POSTすると投稿ができる、というものだ。

ActivityPubのアカウントに対してもIncoming Webhookのような入口があれば、ActivityPubの仕様を知らなくても容易にBOTアカウントの運用ができて面白いのではないかと考えた。そうして生まれたのが APubHook である。

github.com

APubHookは以下の機能を持つ。

  • Cloudflare Workers + Cloudflare D1 で動作
  • 任意個数のBOT用アカウントを管理可能
  • BOT用アカウントは @name@apubhook.xxx.workers.dev としてMastodonやMisskeyからフォロー可能
  • BOTアカウントごとに秘密のURLを持ち、そこに対して curl -X POST -d '{"text": "hello"}' ... のように投稿できる
  • 投稿は対象BOTアカウントのフォロワー全員に発信される

ActivityPubは最小限の実装でも意外と必要な要素が多いのだが、 上で登場したActivityPubまとめwikiの情報とMinidonのコードのおかげで短期間で実装することができた。 また、Cloudflare Workersで動作するためインフラコストが低いのも魅力だ。

課題と今後の展望

短期間で実装できたと書いたが、課題もあった。 まとめwikiの動作確認 ページにもあるように、ソーシャルな機能(フォロー処理など)が正しく実装されているかテストするのが大変。 今回のAPubHook開発ではMastodonからフォローやフォロー解除を繰り返す温かみのある手動テストを行ったが、もう少しいい感じに自動化できたらいいのになとは思った。

とはいえ、オープンな仕様 ActivityPub の力を借りて自前実装で他の実装とつながれる体験は心躍るものがあり、テキストを発信するだけのBOTを動かすだけでも動いたときは感動を覚えたし、楽しい開発だった。

せっかくのオープンな仕様かつMIT Licenseでの公開なのでここからさらに誰かがAPubHookを発展させた何かを作ってくれたり、Fediverseの実装に興味を持つきっかけになったら嬉しい。