鯖缶向けActivityPub情報 @1.6.0

以下の内容は2017年9月に Mastodon v1.6.0 周辺に向けて書いた情報です。めっちゃ古いよ。


疑問点やバグ報告等あれば、お近くのコントリビューターまで。英語が書ける人は GitHub(バグ報告とかの技術的な話)や Discourse(その他の質問・意見)に直接どうぞ。 書いた人は @unarist@mstdn.maud.io です。

なお1.5へのダウングレードについては、する側もされる側もあまり考慮されておらず、投稿が重複して届く、配信されない、削除等が反映されない、といったことが考えられるので、極力避けることをおすすめします。

OStatusとの違い

  • OStatusではWebSubというプロトコルで「購読」したインスタンスに対して配信を行っていましたが、ActivityPubに購読の概念はなく、フォロワー全員に配信されます。
    • Mastodonはアカウントごとにどのプロトコルで配信するかという情報を持っており、それがActivityPubになっているフォロワーに対してActivityPubでの配信が行なわれます。
    • ActivityPubでの配信とWebSubでの配信は独立しているため、ActivityPubで配信を受けているアカウントがWebSubでも購読していた場合、二重に配信されることになります。この場合、重複する配信は受信側で無視されます。
    • とはいえ無駄なので、ActivityPubでの配信を確認すると自動的に解除します。
  • OStatusとActivityPubでは投稿を識別するIDやURLが異なります。
    rc2以降はOStatus側がActivityPub側に合わせる形になりました。タイムスタンプのリンク先は(1.6同士であれば)常に https://example.com/@foo/5678 といった形になります。
    • OStatusで受信した投稿も、ActivityPub版が存在すればそれを取得しなおすということをしています。そのため、投稿のURLがActivityPub形式だからといってActivityPubで配信されたとは限りません。
    • IDが異なる関係で、重複検知や返信・ブースト等、既存のトゥートを参照する処理が少しややこしくなっています。 どうしようもなかったので統一されました。
    • 1.5以下ではまた違うURLになっていたりしますが、もちろんOStatusです。
  • ActivityPubでは、鍵をかけていないアカウントのフォローが(内部的には)フォローリクエストと自動承認という形を取るようになっています。
    • 画面上の表示としては、これまで通りフォローボタンを押した直後にフォロー済みアイコンに変化しますが、もし自動承認が完了しないうちに再読み込みすると砂時計になります。
      • 厳密には砂時計アイコンになるのが正しいですが、自動承認されてもページを読み込むまでアイコンが変化しないこともあり、OStatusの挙動に似せてこのような仕様になりました。
      • 一部クライアントはこの修正をあえて回避し、ただちに承認待ちマークを表示するかもしれません。
    • 自動的に承認されはするものの、何らかの理由で「承認」メッセージが受け取れない場合に承認待ち状態が続く可能性があります。承認待ちマーク(砂時計)のクリックでリクエストをキャンセルできるようになっているので、もし上手く承認できない場合はキャンセルしてやりなおしてみてください。
  • ActivityPubによる配信では、いくつかの機能が追加されています
    • Aさんが返信を受けると、その返信をAさんのフォロワーのインスタンスにも転送します。こうすることで、それらのインスタンスでも返信が見れることになります。
      • トゥートに対する返信であって、@userによるメンションとは別です
    • これまでトゥートの削除は直接のフォロワーまでしか配信されていませんでしたが、ActivityPubではブーストした人やメンション先、またブーストした人のフォロワーなど、可能な限り削除通知を転送するようになりました。

自動移行の流れ

基本的には、様々な場面で発生するアカウント情報更新のタイミングで、そのアカウントがActivityPubに対応しているかどうかをチェックし、対応しているようであればそれ以降APを使って送信されることになります。

この情報は24時間キャッシュされるため、多くの場合は1.6への更新後一日前後から徐々に更新されることになります。

ただし効率化のために、いくつかショートカットが用意されています。

  • あるアカウントがActivityPub対応と判定されると、同じインスタンスの全アカウントのキャッシュを失効させます。
  • OS判定のアカウントからActivityPubでの配信を受けると、配信元アカウントのキャッシュを失効させ、即座にアカウント情報の更新を行います。通常はこれでActivityPub対応として判定されることになります。

※前述のとおり、あるアカウントがAPに対応しているかどうか、という情報はインスタンスごとに持っています。そのため一方がAP対応と認識してAP配信を始めたとしても、相手はそう認識していない可能性があります。ショートカット2はこれを考慮したものです。

その後APでの配信を受け取ると自動的にWebSubの購読を解除し、移行が完了します。

こういった仕組みなので、次のような注意点が挙げられます。

  • 当該アカウントが全く活動していない場合、いくら待ってもActivityPub対応と判定されない可能性があります。
  • 何らかの理由で、こちらはWebSubの購読を解除したのに相手はこちらのことをActivityPub対応と認識していない、という状況になると、相手からの投稿が配信されないことがあります。

管理ページのアカウント一覧で、そのアカウントへの配信がOStatus(WebSub)とActivityPubのどちらで行なわれるかを確認することができます。ActivityPubになっているべきアカウントがOStatusになっていた場合、投稿欄上の検索ボックスでそのアカウントのURL http://example.com/@foo を検索することで、アカウント情報の更新を手動で行なうことができます。

v1.6とv2.0

OStatusでは公開範囲を独自拡張でしか表現することができず、例えばGNU Socialで受けとった非公開投稿は誰でも読め、ブーストできてしまう、といった問題がありました。受信者を明示できるActivityPubに移行すれば、このような問題を回避することができます。

そこでv2.0では非公開(private・direct)な投稿がOStatusで送信されなくなり、v1.6よりも古いMastodonや、OStatusしかサポートしない他実装(GNUSocialなど)で受けとれなくなる予定です。 公開(public・unlisted)投稿はv2.0以降もActivityPub・OStatusの両方で配信されます。

古いMastodonに非公開投稿が配信されなくなる、という意味で互換性がない変更になるので、移行期間としてv1.6を設けた形です。

もちろん長期的な目標としてはOStatusの廃止もあるようですが、連合でつながっている他の実装のActivityPubサポートの様子を見ながら、ということになるでしょう。

参考 https://mastodon.social/@Gargron/16910940

過去のバグ

masterブランチやrcでは過去に以下のような独特なバグが発生していました。もしこのような現象を見かけたら、関係するインスタンスが1.6.0以降まで更新されているか確認してみてください。

(例えば相手の /about/more にはv1.5.1と表示されているのに、流れてきた投稿のタイムスタンプのリンク先は /@user/123 形式になっている、とかだと怪しいです)

  • ブーストが、ブーストしたユーザーによる通常投稿として表示される
  • 返信を送ると返信したユーザーまたは返信先のユーザー名義でTLにもうひとつ現われる
  • private・directな投稿が届かない
  • 他インスタンスからの投稿が二重に届く
  • 旧バージョンやその他OStatus実装でフォローユーザー同士の会話が見れない
    (これはrc2で修正されたので、rc1の頃の会話は今でも見れないことがあります)

更新履歴

9/11

  • v1.6.0リリースに伴い諸々加筆修正
  • OStatus鯖から会話が見れない問題は直りました

9/6

  • フォロー時の挙動をOStatusに似せるPRがマージされたので反映
  • 1.5以下から見たURLがまちまちな件を追記
  • OStatus鯖から会話が見れない可能性について追記