Perl Hackers Hub

第59回Fediverse入門―非中央集権型SNSサーバを作ろう!(3)

(1)こちら⁠2)こちらから。

ソーシャルネットワークで使われるそのほかの機能の実現方法

ここまででFediverseに参加するために必要な最小限の機能は実装できていますが、Actubでは未実装なもののMastodonなどのフル機能のActivityPubサーバで実装されている、ソーシャルネットワークでよく使われる機能がいくつかあります。本節ではそれらの実装方法ついて概略を説明します。

ブースト(リツイート)

通常の短文投稿ではCreateオブジェクトを作成しますが、Mastodonで言うブースト(Twitterにおけるリツイート)を行う場合はAnnounceオブジェクトを作成します。

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "id": "https://actub.ub32.org/argrath/456/activity",
  "type": "Announce",
  "actor": "https://actub.ub32.org/argrath",
  "published": "2018-03-03T09:54:50Z",
  "to": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "cc": [
    "https://actub.ub32.org/argrath/followers"
  ],
  "object": "https://example.com/users/foobar/123"
}

object属性にはブーストする短文のIDを設定します。そのあと通常の投稿と同様にこのオブジェクトをフォロワーに通知します。

お気に入り(いいね)

お気に入りに指定する場合、次のようなLikeオブジェクトを作成し、短文を作成したアクターに通知します。

{
  "@context": "https://www.w3.org/ns/activitystreams",
  "id": "https://example.com/users/foobar#likes/1",
  "type": "Like",
  "actor": "https://example.com/users/foobar",
  "object": "https://actub.ub32.org/argrath/123"
}

ここでもobject属性にはお気に入りに指定する短文のIDを設定します。

ハッシュタグ

ハッシュタグに関する詳細は、ActivityPub仕様では定義されていません。そのため、Fediverseで慣習的に用いられている方法を実装します。以下に、ハッシュタグを含む短文のNoteオブジェクトを示します。

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "Hashtag": "as:Hashtag"
    }
  ],
  "id": "https://actub.ub32.org/argrath/123",
  "type": "Note",
  "url": "https://actub.ub32.org/argrath/123",
  "published": "2018-03-03T09:54:50Z",
  "content": "はいさーい #test",
  "attributedTo": "https://actub.ub32.org/argrath",
  "tag": [
    {
      "type": "Hashtag",
      "name": "#test",
      "href": "https://actub.ub32.org/tags/test"
    }
  ],
  "to": [
      "https://www.w3.org/ns/activitystreams#Public"
  ],
  "cc": [
      "https://actub.ub32.org/argrath/followers"
  ]
}

まずActivityPubに含まれていない属性を使うために、@context属性にHashtagクラスに関する定義を追加します。そして、tag属性としてtype属性に固定文字列Hashtagname属性にタグ文字列、href属性にこのタグを含む短文の一覧が表示されるHTMLへのリンクを指定します。content属性の短文にハッシュタグを含めただけではハッシュタグとは認識されず、サーバが短文をパースしてハッシュタグの内容をtag属性に設定する必要があることに注意してください。

画像の添付

画像を添付するには、Noteオブジェクトを作成するときに次のようなattachment属性を追加します。

"attachment": [
  {
    "type": "Document",
    "mediaType": "image/png",
    "url": "https://example.com/media/1234.png"
  }
]

プロフィール情報

アクターの表示名、プロフィール、アイコンは、アクターオブジェクトに次のような形で追加します。

"name": "表示名",
"summary": "プロフィールです",
"icon": {
  "type": "Image",
  "mediaType": "image/png",
  "url": "https://example.com/media/1234.png"
}

name属性に表示名、summary属性にプロフィール、icon属性にアイコンの情報を指定します。

まとめ

ActivityPub自体の仕様は大きいので、Mastodonのようなフル機能のサーバを作るのは大変です。ただ、機能を絞れば比較的少ないコード量でFediverseに参加するサーバを作成できます。みなさんもぜひ挑戦してください。

さて、次回の執筆者は楠田来安さんで、テーマは「動的なモジュールロードとの付き合い方」です。お楽しみに。

おすすめ記事

記事・ニュース一覧