ActivityPubでoutboxの実装

2023/7/18 [10:11:56] (火) 天気

ActivityPubを通じて、Fediverse連合空間にユーザーアカウントとして認識してもらえるようになった。


次はウチのつぶやきというか投稿を拾ってもらえる、たとえばMastodonでtokorotenのコンテンツを表示してもらえるのが目標。


そのためには適切なoutboxを用意する必要がある。

よくわかってないけど、outboxてのは、これまでの行動、投稿のログ、という理解で大丈夫かな。outboxのtypeはOrderedCollectionがMUSTとされていて、たぶん順番も見られるんだろう。


あ。今さらだけど、わたしはど素人なので、見様見真似。間違った情報を垂れ流すことが多くてすみません。先に謝っておきます。


/actor/outbox

へのアクセスに対してこれまで投稿履歴を返す。

create(投稿)したnote(発言)とそれらを取得するためのurlなどの情報が羅列されたjson。

image

こんな感じだろうと思われる(大雑把)

「投稿」を「投稿しました」で包んで、そいつを順番に並べたものがoutboxという箱になる。


実際に配置したのが以下のoutbox。

といっても、お約束、決まり事通りに並べて作ってるだけなので、手数はともかく、それほど難しいものではない。


{"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://tokoroten.doncha.net/t2aki/outbox",
"summary": "outbox of t2aki@tokoroten.doncha.net",
"type": "OrderedCollection",
"totalItems": 2,
"orderedItems": [{
  "type": "Create",
  "id": "https://tokoroten.doncha.net/t2aki/activity/00054-20230717",
  "url": "https://tokoroten.doncha.net/t2aki/activity/00054-20230717",
  "published": "2023-07-17T12:45:08Z",
  "actor": "https://tokoroten.doncha.net/t2aki",
  "to": ["https://www.w3.org/ns/activitystreams#Public", "https://tokoroten.doncha.net/t2aki/followers"],
  "object": {
    "type": "Note",
    "id": "https://tokoroten.doncha.net/t2aki/items/00054-20230717",
    "url": "https://tokoroten.doncha.net/t2aki/items/00054-20230717",
    "published": "2023-07-17T12:45:08Z",
    "to": ["https://www.w3.org/ns/activitystreams#Public", "htps://tokoroten.doncha.net/t2aki/followers"],
    "attributedTo": "https://tokoroten.doncha.net/t2aki",
    "content": "[2023/07/17 12:45]\u003cbr /\u003elog取得のサブルーチンはpostとgetでちょっといじらないとダメやな。帰ったら仕込む"
    }
  }, {
  "type": "Create",
  "id": "https://tokoroten.doncha.net/t2aki/activity/00053-20230717",
  "url": "https://tokoroten.doncha.net/t2aki/activity/00053-20230717",
  "published": "2023-07-17T11:37:47Z",
  "actor": "https://tokoroten.doncha.net/t2aki",
  "to": ["https://www.w3.org/ns/activitystreams#Public", "https://tokoroten.doncha.net/t2aki/followers"],
  "object": {
    "type": "Note",
    "id": "https://tokoroten.doncha.net/t2aki/items/00053-20230717",
    "url": "https://tokoroten.doncha.net/t2aki/items/00053-20230717",
    "published": "2023-07-17T11:37:47Z",
    "to": ["https://www.w3.org/ns/activitystreams#Public", "https://tokoroten.doncha.net/t2aki/followers"],
    "attributedTo": "https://tokoroten.doncha.net/t2aki",
    "content": "[2023/07/17 11:37]\u003cbr /\u003e他のアカウントのoutboxをみて、そこにあるnoteのURLを叩くとHTMLページが開くんだけど、なんでや。jsonが返ってくるんじゃなかったっけ。HTTPのヘッダを覗いてもjsonじゃなくてフツーのHTMLを返してるぞ。こちらのリクエストに応じてjsonをHTMLに変換してたりするのかな。謎だらけ。"
    }
}]}

typeがNoteとなっているブロックが投稿内容で、このNoteが基本となっている。

idとurlは投稿内容へのリンク。このNoteのjsonを返す。

publishedは日付。JSTだから+9とか必要かもしれないけど、とりあえず。

attributedToは投稿者。

toはお約束事。


typeがCreateのブロックがNoteのブロックをobjectに包んでいる。

idとurlのリンクはこのCreateのjsonを返す。今日時点、返すのがこのブロックでいいのか謎。とりあえず。

各要素はNoteと同じなので以下略。


そのCreateブロックを順番に並べてoutboxの完成。


前回設定したwebfingerとactor.jsonで、マストドンで「t2aki@tokoroten.doncha.net」を検索するとユーザーアカウントとして認識される。

image

「他のサーバーの以前の投稿は表示されません」と記載されている状態。


今回outboxを設定したので、個々のNoteのリンクをマストドンで検索するとtokorotenの投稿がマストドンで表示される。

image


検索して一度表示されると、ユーザーアカウント表示の下にも表示されるようになった。

image

たぶん、検索して結果が返ってきたことで、このマストドンサーバーにキャッシュされたのかな。


ただ、やはり謎は深くて。


謎その1)

ユーザーアカウント画面の下の「リモートで表示」というリンクを開くと、わたしのactor.jsonが表示される。ほかのひとの「リモートで表示」を開くとマストドンで開いたり、やっぱりactor.jsonが返ってきたりいろいろ。

リモートで表示とは、マストドンの別サーバーだったら意図通りに開くけど、マストドンじゃないサーバーだったらjsonをそのまま開くということになってるんだろか。


謎その2)

mastodonやmisskeyのoutboxはNoteを包んだCreateブロックを持たずにfirstやlastといったリンクを返すだけだったりするんだけど、これはありなのか。


ActivityPub w3c.org

↑ここがActivityPubの本家本元(?)

頑張って読むしかないんだろうけど、爺さんにはつらいぞ、英語。


そして、やはりRSAで署名したPOSTをどこかに投げないことには始まらない。

これについてはレンタルサーバーにモジュールがないのでほぼ諦め。ローカルで作ってスクリプトで投げる、ぐらいしか思いつかないしなあ。


とはいえ、ごそごそスクリプトを考えるのは爺さんのボケ防止にちょうどいいパズルゲームでもあるなあ。


ちなみに。元ネタの「ところてんx10」はほぼ毎日たわごと並べてるので、RSSリーダーにでも登録していただけると更新をお届けできます。



すげー今さらのRSSとか!


[07/19 11:17:32]

謎その1は解決。

HTTP_ACCEPTを見て判別。jsonを要求されてたらjson、そうじゃなければHTMLを返してた。さっそくウチも導入。やっぱ生のjsonが返ってくるとびっくりするからなあ。


https://gihyo.jp/dev/serial/01/perl-hackers-hub/005902

AS2以外の形式の情報を返すこと(コンテントネゴシエーション)も認められています。これを利用して、同じURLでも、ActivityPubの情報を要求された場合はAS2形式の情報を、それ以外の場合はHTML形式での情報を返すようにしています。


[08/04 10:40:12]

publishedの日付問題。

飛んでくるPOSTというかjsonを見ると、JSTだけど+900やJSTという表記がなくて標準時になってる。

localtimeじゃなくてgmtimeを使えば良かった

<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】