メインコンテンツへスキップ

ActivityPub とフェデレーテッドプロトコル

このページは、Owncast内のActivityPub実装をプロトコルレベルで文書化しています。サーバーが送信するアクティビティ、受信するアクティビティ、自身をどのように識別するか、リクエストの署名と検証をどのように行うかを説明しています。 これは、Owncastと相互運用するフェデレーテッドアプリケーションを構築したい開発者を対象としています。つまり、他のプラットフォームからOwncastサーバーをフォローしたり、リアルタイム通知を受信したり、Owncastのカスタム拡張を理解するツールを構築することを意味します。

Owncastオペレーターで、単にフェデレーションをオンにしたい場合は、Fediverseソーシャル機能の有効化 を参照してください。 このページは、ActivityPub、ActivityStreams 2.0、JSON-LD、HTTP署名に精通していることを前提としています。

メンタルモデル

Owncastサーバーは、Serviceタイプの単一アクターとして連合します。 サーバーごとに1つのアカウント(デフォルトのユーザー名はlive)があり、それは人物ではなく、ストリーム自体を表しています。 一般的なソーシャルサーバーと比較して、このモデルは意図的に狭く設定されています:

  • アクターはフォロワーに投稿を送信します(最も重要なのは「ライブ開始」通知)および定期的なストリーム「ping」です。
  • The actor receives follows, likes, boosts (announces), replies and mentions, quote requests, and a handful of server-to-server activities. Inbound posts are only surfaced to the operator and plugins: they are never added to a timeline and never re-federated.
  • ユーザーはちょうど1人で、オープン登録はなく、followingコレクションは常に空です。

すべての連合エンドポイントは、連合が無効になっている場合、405 メソッドは許可されていないを返すので、サーバーが到達不可能に見える場合は、まずそれを確認してください。

発見

リモートアプリケーションは、標準のウェルノウン発見メカニズムを通じてOwncastアクターを位置付け、記述します。

ウェブフィンガー

GET /.well-known/webfinger?resource=acct:{username}@{host}

resourceは、サーバーの設定されたホストと一致するacct: URIでなければならず(そうでない場合、リクエストは501/400で拒否されます)。 レスポンスはapplication/jrd+jsonとして提供されます:

{
"subject": "acct:live@owncast.example.com",
"aliases": ["https://owncast.example.com/federation/user/live"],
"links": [
{
"rel": "self",
"type": "application/activity+json",
"href": "https://owncast.example.com/federation/user/live"
},
{
"rel": "http://webfinger.net/rel/profile-page",
"type": "text/html",
"href": "https://owncast.example.com/federation/user/live"
},
{
"rel": "http://webfinger.net/rel/avatar",
"type": "image/png",
"href": "https://owncast.example.com/logo/external"
},
{
"rel": "alternate",
"type": "application/x-mpegURL",
"href": "https://owncast.example.com/hls/stream.m3u8"
}
]
}

selfリンクは、カノニカルアクターIRIです。 Owncast特有のalternateリンクのタイプはapplication/x-mpegURLで、ストリームのHLSプレイリストに直接指し示しており、クライアントがウェブUIをスクレイピングすることなくライブビデオを見つけることを可能にします。

ホストメタ

GET /.well-known/host-meta

XRDドキュメントが返され、ウェブフィンガーエンドポイントを指しています。これは、ホストメタからブートストラップするクライアント用です。

<?xml version="1.0" encoding="UTF-8"?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
<Link rel="lrdd" type="application/json"
template="https://owncast.example.com/.well-known/webfinger?resource={uri}"/>
</XRD>

ノード情報

Owncastは、NodeInfoを通じてサーバーレベルのメタデータを公開しており、フェデレーテッドクローラーやディレクトリ、統計サイトがインスタンスを記述できます。

ノード情報の発見GET /.well-known/nodeinfo

{
"links": [
{
"rel": "http://nodeinfo.diaspora.software/ns/schema/2.0",
"href": "https://owncast.example.com/nodeinfo/2.0"
}
]
}

ノード情報2.0GET /nodeinfo/2.0

{
"version": "2.0",
"software": {
"name": "owncast",
"version": "0.2.x"
},
"protocols": ["activitypub"],
"services": {
"inbound": [],
"outbound": []
},
"usage": {
"users": {
"total": 1,
"activeMonth": 1,
"activeHalfyear": 1
},
"localPosts": 42
},
"openRegistrations": false,
"metadata": {
"chat_enabled": true,
"federation": {
"username": "live",
"featured_streams": 1
}
}
}

この多くは標準のノード情報であり、いくつかのOwncast特有の信号を呼び出す価値があります。

  • **software.name**は常にowncastです。 これは、Owncastサーバーと通信していることを検出する最も信頼できる方法です。
  • **usage.users.totalは常に1で、openRegistrations**は常にfalseです – Owncastインスタンスは単一アクターサーバーであり、マルチユーザーコミュニティではありません。
  • **usage.localPosts**は、サーバーが送信したアクティビティの数(ライブ通知やその他の公共メッセージ)であり、ストリームがどれほど活動しているかの有用なプロキシです。
  • **metadata.chat_enabled**は、Owncastの内蔵チャットが有効かどうかを反映します。
  • **metadata.federation**は、Owncast特有のブロックです:
    • **username**はアクターの推奨ユーザー名(デフォルトはlive)です。 ホストと組み合わせることで、別のWebFingerのラウンドトリップなしにacct:ハンドルを取得できます。
    • **featured_streams**は、フィーチャーストリーム/ミニディレクトリフローへの参加を示します(以下のStream pingsを参照)。 1の値は、サーバーがフォロワーに対して定期的なOfferアクティビティを介してライブ状態を広告することを意味します。

x-nodeinfo2GET /.well-known/x-nodeinfo2は、いくつかのディレクトリで使用される代替のx-nodeinfo2形式で同じ情報を提供します。organizationブロック(namecontact)とactiveWeekユーザー数が含まれます。 ここで、services.inbound/services.outboundは両方とも["activitypub"]です。

マストドンインスタンスAPIGET /api/v1/instanceは、マストドン互換のインスタンス記述(urititleshort_descriptiondescriptionversionthumbnailstats、および登録フラグ)を返し、マストドン対応のツールがよく知られたインスタンスカードをレンダリングできるようにします。 stats.user_count1stats.status_countはローカル投稿数であり、登録/承認/招待はすべて無効です。

アクター

GET /federation/user/{username}
Accept: application/activity+json

アクターIRIをActivityStreamsのAcceptヘッダーでリクエストすると、アクタードキュメントが返されます。 Owncastは、ActivityStreamsの**Service**として自分自身を表します(Personではありません)。 形状は次の通りです:

{
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1"
],
"type": "Service",
"id": "https://owncast.example.com/federation/user/live",
"preferredUsername": "live",
"name": "My Owncast Server",
"summary": "Server description / bio",
"url": "https://owncast.example.com/federation/user/live",
"published": "2023-01-01T00:00:00Z",
"manuallyApprovesFollowers": false,
"discoverable": true,
"inbox": "https://owncast.example.com/federation/user/live/inbox",
"outbox": "https://owncast.example.com/federation/user/live/outbox",
"followers": "https://owncast.example.com/federation/user/live/followers",
"icon": {
"type": "Image",
"mediaType": "image/png",
"url": "https://owncast.example.com/logo/external?uc=..."
},
"image": {
"type": "Image",
"url": "https://owncast.example.com/logo/external?uc=..."
},
"tag": [
{
"type": "Hashtag",
"name": "#owncast",
"href": "https://owncast.directory/tags/owncast"
}
],
"attachment": [
{
"type": "PropertyValue",
"name": "Website",
"value": "<a href=\"...\">...</a>"
}
],
"publicKey": {
"id": "https://owncast.example.com/federation/user/live#main-key",
"owner": "https://owncast.example.com/federation/user/live",
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
}
}

相互運用する実装のための重要なポイント:

  • アクターIRIレイアウト{server}/federation/user/{username}であり、コレクションがここにぶら下がります:{actor}/inbox{actor}/outbox{actor}/followers
  • **following**は{actor}/followingで取得されるようリクエストされますが、常に404が返されます—Owncastはフォロワーリストを公開しません。
  • **manuallyApprovesFollowers**は、サーバーが_プライベート_連合モードにあるかどうかを反映します。 trueの場合、フォローは自動的に受け入れられません。
  • **discoverable**は常にtrueです(toot:名前空間セマンティクスを使用)。
  • 公開鍵{actor}#main-keyに存在し、PEM(PKIX)形式のRSA-2048鍵です。これは、サーバーのHTTP署名を検証するために使用します。

HTTP署名

Owncastは、アウトバウンドリクエストに署名し、インバウンドリクエストを検証する際に「Signature」HTTPヘッダー方式を使用しています(draft-cavage HTTP signaturesを使用し、フェデレーテッド全体で使用されています)。

自身に送信されたリクエストの検証

Owncastがアクティビティを受信ボックスにPOSTする際は、次のものを含みます:

  • SignatureヘッダーにkeyId="{actor}#main-key"algorithm="rsa-sha256"、および署名されたheadersリスト。
  • 署名されたヘッダーは(request-target)hostdate、およびdigestをカバーします。
  • リクエストボディのSHA-256ダイジェストを含むDigestヘッダー。
  • Content-Type: application/activity+json及びUser-Agent{version}; https://owncast.onlineの形式です。

検証するには:keyIdでアクターを取得し、publicKey.publicKeyPemを読み取り、署名とボディダイジェストの両方を検証します。

Owncastに送るリクエストの署名

Owncastは、受信ボックスに配信されるすべてのアクティビティの署名を検証します:

  1. keyIdalgorithmをあなたのSignatureヘッダーから解析します。 keyIdは**https://** URLでなければなりません。
  2. アクターを解決し、あなたの公開鍵を取得します。
  3. あなたの鍵の所有ドメインが、インスタンスのブロックドメインリストにないことを確認し、アクター自体がブロックされていないことを確認します。
  4. 署名を検証し、指定されたアルゴリズムを試し、次にrsa-sha256およびrsa-sha512にフォールバックします。
  5. Digestヘッダーをリクエストボディと照合して検証します。
  6. If your request carries a parseable Date header, it must be close to the server's clock: a date more than 1 hour in the past or more than 1 hour in the future is rejected. This bounds replay of captured, validly-signed requests. A missing or unparseable Date skips the check.

実際には、次のことを意味します:(request-target) host date digestをRSA鍵で署名し、その鍵をアクターのpublicKeyフィールドに公開し、SHA-256のDigestを含め、アクターをHTTPSで提供します。

Owncastが送信するアクティビティ(アウトバウンド)

すべてのアウトバウンドアクティビティはサーバーアクターから発信され、フォロワーの受信ボックスに配信されます(フォロワーがsharedInboxを宣言した場合はそれを優先します)。 公共のアクティビティは、tohttps://www.w3.org/ns/activitystreams#Publicにアドレスされ、フォロワーコレクションがccになります;プライベートモードでは、フォロワーコレクションにのみアドレスされます。

アクティビティオブジェクトいつ送信先
作成ノートストリームがライブになる(「ライブ開始」メッセージ)。他の公共投稿フォロワー(+ 公共)
更新サービスサーバープロフィール(名前、アバター、要約など) 変更フォロワー
フォローアクターIRIオペレーターが別のOwncastサーバーをフォローします(フィーチャーストリームフロー)ターゲットサーバー
オファーサーバーURLライブ中に、ストリーム「ping」として定期的に送信されます。ディレクトリフォロワー
承認インバウンドFollow受信したFollowに応答してフォロワー
拒否inbound Followオペレーターがこのサーバーをリストしていたディレクトリを削除する場合。そのディレクトリ
離れるserver URLThe stream ends (the offline counterpart to Offer)Directory followers
UndoフォローAn operator unfeatures an Owncast server they previously followedThe target server
Accept / Rejectinbound QuoteRequestIn response to a received QuoteRequestThe requester

作成/ノート — ライブになる

最も重要なアクティビティです。 ストリームがライブになると、OwncastはCreateNoteでラッピングして送信します。 NoteにはHTMLのcontent(設定可能なライブ開始メッセージ、ストリームタイトル、ハッシュタグリンク、サーバーへのリンク)が含まれ、Hashtagタグ、場合によってはストリームプレビューを含むImage添付ファイル(preview.gifまたはthumbnail.jpg)が含まれます。 サーバーがNSFWとしてマークされている場合、ノートはsensitive: trueを含みます。 ハッシュタグはhttps://owncast.directory/tags/{tag}にリンクされ、常に#owncastハッシュタグが追加されます。

これは最も消費者が気にするアクティビティです:アクターをフォローすることで購読し、ストリームが開始されるときにCreate/Noteアクティビティを受信ボックスで監視します。

Offer / stream ping(アウトバウンド)

これは、フィーチャーストリーム/ミニディレクトリ機能をサポートするOwncast拡張です。 ライブ中、サーバーは定期的にOfferアクティビティを送信し、そのobjectはサーバーURLであり、Owncastカスタムメタデータ(ストリームの状態、タイトル、説明、サーバー名、ロゴ、タグ)を持っています。 受信ディレクトリがライブストリームのリストを新鮮に保つことができます。 The matching offline signal is the Leave activity, sent when the stream ends. Owncast sends Offer and Leave only to followers that identified themselves as a directory (see the custom namespace), never to ordinary fan followers.

更新、フォロー、受け入れる

  • **Update**は、サーバーのプロフィールメタデータが変更されたときにフォロワーに送信され、リモートキャッシュが更新されるようにします。
  • **Follow**は、オペレーターが別のOwncastサーバーをフォローしたときに送信されます。 サーバーは次に、Accept(またはReject)を期待します。
  • Accept は、サーバーが公開(自動承認)モードにあるときに、受信した Follow に自動的に応答して送信されます。

Owncast が受信するアクティビティ(受信)

これらは、アクターの inbox に署名付きアクティビティを POST することで配信します。 The inbox returns 202 Accepted immediately and processes the activity asynchronously, so a 202 only means the activity was queued, not that it was acted on. Owncast signature-verifies and dispatches each one from that queue.

アクティビティ処理中
Followフォロワーを格納し、公開モードでは自動承認を行い、Accept を返します(プライベートモードでは承認待ち)。 ns#directory マーカーを持つフォローは、モードに関係なく常に手動承認のために保持され、フォローイベントを発信しません。 そうでない場合は、FediverseEngagementFollow イベントを発信します。
元に戻すフォローフォロワーを削除します。
いいねローカルオブジェクトに対してエンゲージメントを記録します。 FediverseEngagementLike を発信します。
発表ローカルオブジェクトのブースト/再投稿。 エンゲージメントを記録し、FediverseEngagementRepost を発信します。
承認フォロー私たちがフォローしたリモート Owncast サーバーを、受け入れたものとしてマークします(featured-streams フロー)。
拒否フォローリモートサーバーのフォローを拒否したとしてマークします。
オファー別の Owncast サーバーからのストリームピング。 streamStatus: "live" を持つ場合、Owncast はそのサーバーをフェデレーテッドサーバーテーブルでオンラインとマークし、ストリーミングメタデータを格納します。
LeaveOffer のオフラインの対応物:リモートの Owncast サーバーのストリームをオフラインとしてマークします。
UpdatePerson既存のフォロワーのストレージメタデータ(表示名、受信ボックス、共有受信ボックス、アバター)を更新します。 Updates with any other object type are ignored.
CreateNoteAccepted when the object is a single Note attributed to the signing actor and the note is either a reply to a post this server published or addressed to the actor (a mention). Raised as an event for the operator and plugins, not added to any timeline. See inbound posts.
QuoteRequestA FEP-044f request to quote one of the server's posts. Accepted only for locally authored posts while federation is public and quotes are enabled. Answered with Accept or Reject. See quote requests.

二つの重要なガード:

  • エンゲージメント年齢制限。 LikeAnnounce アクティビティは、参照されるオブジェクトが36時間を超えて古い場合は記録されません。 古いエンゲージメントは無視されます。 これにより、エンゲージメント通知が最近のストリームに結びつきます。
  • ブロッキングと SSRF。 ブロックされたドメイン/アクターからの受信アクティビティは、署名確認中に拒否されます。 外向きの配信は、非 HTTPS および内部/ループバック受信ボックス URL を拒否します。

Inbound posts (Create)

Inbound fediverse posts require Owncast v0.3.0

Earlier releases rejected every inbound Create. Owncast 0.3.0 accepts the narrow cases described here.

Owncast accepts a Create whose object is exactly one Note attributed to the same actor that sent it. It keeps two kinds of notes: replies to a post the server itself published, and notes that address the actor directly (mentions). Everything else is ignored. An accepted post is raised as a reply or mention event for the operator's integrations and plugins. It is not added to a timeline, is not shown to viewers, and is never re-federated, so there is still no public conversation surface on an Owncast server.

Quote requests (FEP-044f)

Quote requests require Owncast v0.3.0

QuoteRequest handling is new in Owncast 0.3.0.

A remote user asking permission to quote one of the server's posts sends a FEP-044f QuoteRequest whose object is the post being quoted and whose instrument is the quote post itself. Owncast accepts the request only when the quoted object is a post this server authored, federation is in public mode, and the operator has quoting enabled. On accept it stores a QuoteAuthorization stamp as a dereferenceable object and replies with an Accept whose result is the stamp's IRI, so any server can fetch the stamp to verify the quote was approved. Every other case gets a Reject, which clears the pending quote on the remote end.

サーバー間アクティビティ

OfferLeaveAccept、および Reject は、Owncast から Owncast への「featured streams」プロトコルを形成します。 ディレクトリまたはアグリゲーターを構築して参加する場合のパターンは次のとおりです:

  1. ns#directory マーカーを設定する Follow を送信します(カスタム名前空間を参照)を、Owncast サーバーのアクターに送信します。 オペレーターが手動で承認します。その後、Accept を期待します。
  2. サーバーがライブの間、定期的に (Owncast メタデータを持つ) Offer アクティビティを受け取ります。
  3. ストリームが終了すると、Leave を受け取ります。

リアルタイムの生存スピードが不要な場合は、標準の Create / Note のゴーライブポストのみを消費できます。

Owncast カスタム名前空間

Owncast は、名前空間 https://owncast.online/ns# の下に、小さなカスタム JSON-LD プロパティのセットを追加します。 ストリームメタデータプロパティは、Offer(および関連するサーバー間)アクティビティの追加のトップレベルフィールドとして表示され、受信者が単一のアクティビティからディレクトリエントリをポップアップできるようにします。 ns#directory マーカーは、Follow に表示され、送信者をディレクトリとして識別します。 すべてはオプションで、標準の ActivityPub にのみ関心がある場合は無視しても安全です。

プロパティタイプ意味
https://owncast.online/ns#streamStatus文字列"live" または "offline"。 サーバー間アクティビティに常に存在します。
https://owncast.online/ns#streamTitle文字列現在のストリームタイトル、設定されている場合。
https://owncast.online/ns#streamDescription文字列サーバーの要約/説明。
https://owncast.online/ns#serverName文字列人間が読めるサーバー名。
https://owncast.online/ns#logoUrl文字列サーバーロゴの絶対 URL。
https://owncast.online/ns#thumbnailUrl文字列現在のストリームサムネイルの絶対 URL。
https://owncast.online/ns#streamTags文字列の配列サーバーメタデータタグ。
https://owncast.online/ns#directoryブール値Follow の上で true に設定され、送信者をディレクトリとして識別します。

ディレクトリは、ns#directorytrue に設定することで、送信する Follow が自身を識別します。 そのマーカー、そしてそのマーカーのみが、Owncast にそのフォローをディレクトリリストとして扱わせます:それはフォローをオペレーターの承認のために保持し、承認後に、OfferLeave のストリームピングをそのフォロワーに配信します。 上記のストリームメタデータフィールドは説明的なだけであり、それ自体はディレクトリを識別しません。

Owncast ストリームのディレクトリを構築する

Owncast の独自の featured streams 機能に力を与えるサーバー間アクティビティは、あなたが消費するためにオープンです。 Owncast サーバーのライブ状況を追跡するディレクトリまたはアグリゲーターを運用したい場合は、Fediverse アクターのように各サーバーをフォローし、送信される生存信号に反応します。

完全で実行可能な例のリファレンスとして、owncast-directory-example リポジトリを参照してください。 これは、このセクションのすべてを実装する小さな Python アプリケーションです:公開されたアクター、ns#directory フォロー、Offer / Leave / Reject の処理、およびライブサーバーのリストを表示するウェブページ。 生産サービスではなく、出発点として扱ってください。

公開されたアクターと署名されたリクエストが必要です。これは、他のどのフォロワーと同じです(HTTP Signaturesを参照)。 そこから:

  1. 各サーバーのアクターに対して、https://owncast.online/ns#directorytrue に設定する署名付き Follow を送信します(カスタム名前空間を参照)。 そのマーカーは、あなたをディレクトリとして識別します。これにより、サーバーはストリームピングをあなたに送信し、リストにするのがオプトインになります:Owncast サーバーは必ずオペレーターが手動で承認するためにディレクトリフォローを保持します。サーバーのフェデレーションプライバシーがどのように設定されていても。 オペレーターが承認するまで、いかなるステータスも受け取ることがなく、各項目がオプトインするまで保留されることを期待してください。 マーカーのない Follow は、通常のファンフォローとして扱われます:自動的に受け入れられることもありますが、Offer / Leave のピングを受け取ることは決してありません。
  2. サーバーがライブの間、約5分ごとに オファー を受信して、Owncast カスタムメタデータ(ストリームステータス、タイトル、説明、サーバー名、ロゴ、サムネイル、タグ)を持って投稿します。 これらのフィールドから、サーバーのディレクトリエントリを作成または更新してください。
  3. ストリームが正常に終了すると、サーバーは Leave を投稿します。 エントリをオフラインとしてマークします。
  4. サーバーのオペレーターがあなたのディレクトリをその側から削除すると、サーバーは元の FollowReject を投稿します。 エントリを削除します:そのサーバーをリストにする権限がなくなり、ピングを送信するのを停止します。

Owncast サーバーがあなたのディレクトリでスポットをリクエストするための組み込みのフローは存在しないため、リストを構築するのはあなたの仕事です。 オペレーターが自分のサーバーの URL を入力する提出フォームをあなたのディレクトリに置くことで、オペレーターがオプトインできる簡単な方法です。 あなたとあなたのディレクトリは、どの提出をリストにするか、どれを拒否するかを決定します。 一つを受け入れると、上記と同じ方法でそのサーバーをフォローします。 オペレーターはフォローを承認します。これは、提出者が期待していることです。フォロー、受け入れ、ピングフローは、彼らのストリームをリストします。

ピングをハートビートとして扱います。 サーバーが Leave なしで Offer アクティビティの送信を停止した場合、クラッシュしたり、接続を失ったり、ファイアウォールでブロックされた場合、何もアクティブにあなたにそれがダウンしたことを知らせることはありません。 あなたがピング間隔の数秒間に聞いたことがないエントリは、期限切れにします。 Owncast のディレクトリは、2 回のミスしたピングの後にピアをオフラインとしてマークし、毎分その陳腐性チェックを実行します。

正しくするべきいくつかのこと:

  • メタデータフィールドはリモートサーバーから取得されるため、それを信頼できない入力として扱います。 長さを制限し、レンダリングする前に URL が http または https であることを確認してください。 あなたが信頼できる値は、フォローすることに決めたサーバーの URL であり、サーバーが送信する表示名ではありません。
  • サムネイルとロゴの URL は安定しているため、ブラウザはそれらをキャッシュします。 エントリを更新する際に、常に変更されるキャッシュバスティングクエリを追加すると、プレビューが最新の状態に保たれます。
  • ピングをまったく使用する必要はありません。 サーバーがライブになったことを知る必要がある場合は、他の Fediverse 消費者と同様に、アクターをフォローし、標準の Create / Note ゴーライブ投稿を監視します。

あなたのサービスがディレクトリとして認識されるようにするには、送信する Followhttps://owncast.online/ns#directorytrue に設定します。 それを見たサーバーがフォローをオペレーターのために保持し、承認後にそれをストリームピングします。

エンドポイントリファレンス

すべてのパスはサーバーのベース URL に対して相対的です。 フェデレーションが無効になっている場合、すべてのエンドポイントは 405 を返します。

パスメソッド目的
/.well-known/webfingerGETacct: → アクター IRI を解決する
/.well-known/host-metaGETWebFinger への XRD ポインタ
/.well-known/nodeinfoGETNodeInfo 発見ドキュメント
/nodeinfo/2.0GETNodeInfo 2.0 サーバーメタデータ
/.well-known/x-nodeinfo2GETx-nodeinfo2 サーバーメタデータ
/api/v1/instanceGETMastodon 対応のインスタンス説明
/federation/user/{username}GETService アクタードキュメント
/federation/user/{username}/inboxPOSTサーバーにアクティビティを配信します
/federation/user/{username}/outboxGETサーバーが送信したアクティビティのコレクション
/federation/user/{username}/followersGETページネーションされたフォロワーコレクション
/federation/user/{username}/followingGET常に 404(フォロリングリストなし)
/federation/{object-id}GET単一の保存された ActivityPub オブジェクトを取得する

互換性のあるアプリケーションを構築する — チェックリスト

自分のアプリケーションから Owncast ストリームをフォローして消費するには:

  1. WebFinger でハンドルを解決しますacct:live@host)アクター IRI を取得するには、それからアクターを取得します:Accept: application/activity+json
  2. HTTPS経由で配信され、到達可能なinboxを持つpublicKeyを用いて、自身のアクターを公開します。
  3. アクターのinboxに署名された**フォローを送信**します。 RSAで(request-target) host date digestに署名し、SHA-256のDigestを含めます。
  4. Owncastがあなたのinbox(公開モード)に戻す**Acceptを処理**します — または手動承認を待ちます(プライベートモード)。
  5. 公開開始の投稿をリスンします: Create/Noteアクティビティがあなたのinboxに届き、ストリームが開始されたことを伝えます; alternate/application/x-mpegURL WebFingerリンクが再生するためのHLS URLを提供します。
  6. オプションでディレクトリとして機能します: Followhttps://owncast.online/ns#directorytrueに設定し、オペレーターの承認を得てから、Offer/Leaveのピンを消費し、リアルタイムのライブ性とよりリッチなディレクトリエントリのためにhttps://owncast.online/ns#*メタデータを使用します。
  7. Owncastから送信されるすべてのデータの署名をアクターの#main-keyに対して検証します。

Owncast accepts replies and mentions only as notifications for the operator and plugins: they are never threaded, displayed, or re-federated, and the server exposes no following list. Design your integration around following + notifications + likes/boosts rather than two-way conversation.


Improve this page

See something missing or incorrect? Edit this page and improve the documentation for everyone.

Contributors to this documentation