Perlで素早くMastodon(OStatus)インスタンス風のものを立てる(1)

|

突然流行りだしたMastodon。既存のインスタンスを使ってもいいのだけど、やはり醍醐味は個人インスタンスっぽい。

とは言えMastodon自体は結構フットプリント大きい感じで個人インスタンスを立てるにはオーバースペックっぽいし、他に簡単に立てられそうなアプリもない感じなので、Perlでささっとでっち上げられないかなあ、という試みその1。まずはフォローしたユーザーの更新通知を受けるところから。

何を目指すのか

既存のインスタンスに接続して読み書きする、というだけなら MastodonのAPIドキュメント があるし、Perl用のライブラリMastodon::Clientもあるようなのでここでは扱わない。あくまでも個人用のインスタンスを目指す。

情報収集

まずはOStatusの仕様をかいつまんで適当に和訳するよ - hito_asaの日記を読んでベースの技術をざっと見てみる(ちなみに"OStatus 1.0 Draft 2"は https://www.w3.org/community/ostatus/wiki/images/9/93/OStatus_1.0_Draft_2.pdf に移動している)。更新通知を受けるには昔懐かしいPubSubHubbubサーバがいるらしい。

とは言えこの資料は概念的なもので細かい仕様とか何も載ってない。これは一度Mastodonインスタンス立ててパケット覗かないといけないかなあ、と思っていたらMastodon OStatus API の叩き方という素晴らしい資料が。これでユーザーフィードがAtomそのものであることや、Mastodon側のAPIエンドポイントが分かった。

PubSubHubbub自体の情報に関しては、日本では気象庁が情報をPubSubHubbubを使って提供しているので、それ絡みが多い。その中でも気象庁XML利活用セミナー気象庁XMLを入手しよう(PDF)がなかなか分かりやすくて理解に役立った。Google Pubsubhubbub Hubの使い方とかもこれで理解した。

PubSubHubbub一般の話とMastodon(OStatus)での話がいまいちフィットしていなかったのだけど:

  • Mastodon自身がPublisherとHubの両方の機能を持っている
  • Publisherとしては自身のHubにのみ更新通知を送るので、購読したいユーザーが参加しているMastodonに対して購読要求を送る必要がある

ということのようだ。

Perlモジュール探索

ということでCPANとかGithubとかで今回使えそうなPerlモジュールを探してみる。

Sojolicious

"OStatus for Perl - A social toolbox for Mojolicious"と銘打っているだけあってOStatus実装に必要な機能が一通りセットになっているもの。

ただこれですぐにサーバが動くというものでもないようだし、これを使いこなすには知識が足りていないので保留。いずれ使いたい。

Mojolicious::Plugin::PubSubHubbub - search.cpan.org

SojoliciousのうちPubSubHubbub部分を切り出したもの。だいぶシンプルになったけどPublish部分は要らないし、テストにはもう少し見通しいい方がいいかなあ、ということでこれも保留。

Plack::App::PubSubHubbub::Subscriber - search.cpan.org

ということで採用したのはこれ。Subscribe部分だけでコードも短いので理解しやすい。

書いてみた

gistにテスト用ファイルを置いた。自分のAtomフィード、Hubサーバ、これを設置するホストの部分を変更して:

cpanm Plack::App::PubSubHubbub::Subscriber
plackup

とすればサーバが立ち上がって、http://(ホスト名):5000/subscribe にアクセスするとMastodonに購読要求が飛ぶ。その状態で該当のMastodonに発言すれば更新通知が飛んでくるのが標準出力に観測できるはず。通知には発言情報全体が含まれているわけではないので、ちゃんと処理するには通知の中のリンクから改めて情報を取得する。

購読先1件固定でソースに埋め込んであるのでこのままではもちろん実用にはならないけど、ここまでくればちゃんとしたものにするのは難しくないはず。

今後

一応これでフォローした相手の発言をほぼリアルタイムで読むための手段は分かったので、次はやっぱり自分で発言する方かなあ…。Salmonプロトコルを調べないといけないので大変そうだ。後はこれをMojolicious::Plugin::PubSubHubbubに書き換えるのもどこかでやっておきたい。