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.0 — GET /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-nodeinfo2 — GET /.well-known/x-nodeinfo2は、いくつかのディレクトリで使用される代替のx-nodeinfo2形式で同じ情報を提供します。organizationブロック(name、contact)とactiveWeekユーザー数が含まれます。 ここで、services.inbound/services.outboundは両方とも["activitypub"]です。
マストドンインスタンスAPI — GET /api/v1/instanceは、マストドン互換のインスタンス記述(uri、title、short_description、description、version、thumbnail、stats、および登録フラグ)を返し、マストドン対応のツールがよく知られたインスタンスカードをレンダリングできるようにします。 stats.user_countは1、stats.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)、host、date、およびdigestをカバーします。 - リクエストボディのSHA-256ダイジェストを含む
Digestヘッダー。 Content-Type: application/activity+json及びUser-Agentは{version}; https://owncast.onlineの形式です。
検証するには:keyIdでアクターを取得し、publicKey.publicKeyPemを読み取り、署名とボディダイジェストの両方を検証します。
Owncastに送るリクエストの署名
Owncastは、受信ボックスに配信されるすべてのアクティビティの署名を検証します:
keyIdとalgorithmをあなたのSignatureヘッダーから解析します。keyIdは**https://** URLでなければなりません。- アクターを解決し、あなたの公開鍵を取得します。
- あなたの鍵の所有ドメインが、インスタンスのブロックドメインリストにないことを確認し、アクター自体がブロックされていないことを確認します。
- 署名を検証し、指定されたアルゴリズムを試し、次に
rsa-sha256およびrsa-sha512にフォールバックします。 Digestヘッダーをリクエストボディと照合して検証します。- If your request carries a parseable
Dateheader, 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 unparseableDateskips the check.
実際には、次のことを意味します:(request-target) host date digestをRSA鍵で署名し、その鍵をアクターのpublicKeyフィールドに公開し、SHA-256のDigestを含め、アクターをHTTPSで提供します。
Owncastが送信するアクティビティ(アウトバウンド)
すべてのアウトバウンドアクティビティはサーバーアクターから発信され、フォロワーの受信ボックスに配信されます(フォロワーがsharedInboxを宣言した場合はそれを優先します)。 公共のアクティビティは、toでhttps://www.w3.org/ns/activitystreams#Publicにアドレスされ、フォロワーコレクションがccになります;プライベートモードでは、フォロワーコレクションにのみアドレスされます。
| アクティビティ | オブジェクト | いつ | 送信先 |
|---|---|---|---|
作成 | ノート | ストリームがライブになる(「ライブ開始」メッセージ)。他の公共投稿 | フォロワー(+ 公共) |
更新 | サービス | サーバープロフィール(名前、アバター、要約など) 変更 | フォロワー |
フォロー | アクターIRI | オペレーターが別のOwncastサーバーをフォローします(フィーチャーストリームフロー) | ターゲットサーバー |
オファー | サーバーURL | ライブ中に、ストリーム「ping」として定期的に送信されます。 | ディレクトリフォロワー |
承認 | インバウンドFollow | 受信したFollowに応答して | フォロワー |
拒否 | inbound Follow | オペレーターがこのサーバーをリストしていたディレクトリを削除する場合。 | そのディレクトリ |
離れる | server URL | The stream ends (the offline counterpart to Offer) | Directory followers |
Undo | フォロー | An operator unfeatures an Owncast server they previously followed | The target server |
Accept / Reject | inbound QuoteRequest | In response to a received QuoteRequest | The requester |
作成/ノート — ライブになる
最も重要なアクティビティです。 ストリームがライブになると、OwncastはCreateをNoteでラッピングして送信します。 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 はそのサーバーをフェデレーテッドサーバーテーブルでオンラインとマークし、ストリーミングメタデータを格納します。 |
Leave | Offer のオフラインの対応物:リモートの Owncast サーバーのストリームをオフラインとしてマークします。 |
Update → Person | 既存のフォロワーのストレージメタデータ(表示名、受信ボックス、共有受信ボックス、アバター)を更新します。 Updates with any other object type are ignored. |
Create → Note | Accepted 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. |
QuoteRequest | A 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. |
二つの重要なガード:
- エンゲージメント年齢制限。
LikeとAnnounceアクティビティは、参照されるオブジェクトが36時間を超えて古い場合は記録されません。 古いエンゲージメントは無視されます。 これにより、エンゲージメント通知が最近のストリームに結びつきます。 - ブロッキングと SSRF。 ブロックされたドメイン/アクターからの受信アクティビティは、署名確認中に拒否されます。 外向きの配信は、非 HTTPS および内部/ループバック受信ボックス URL を拒否します。
Inbound posts (Create)
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)
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.
サーバー間アクティビティ
Offer、Leave、Accept、および Reject は、Owncast から Owncast への「featured streams」プロトコルを形成します。 ディレクトリまたはアグリゲーターを構築して参加する場合のパターンは次のとおりです:
ns#directoryマーカーを設定するFollowを送信します(カスタム名前空間を参照)を、Owncast サーバーのアクターに送信します。 オペレーターが手動で承認します。その後、Acceptを期待します。- サーバーがライブの間、定期的に (Owncast メタデータを持つ)
Offerアクティビティを受け取ります。 - ストリームが終了すると、
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#directory を true に設定することで、送信する Follow が自身を識別します。 そのマーカー、そしてそのマーカーのみが、Owncast にそのフォローをディレクトリリストとして扱わせます:それはフォローをオペレーターの承認のために保持し、承認後に、Offer と Leave のストリームピングをそのフォロワーに配信します。 上記のストリームメタデータフィールドは説明的なだけであり、それ自体はディレクトリを識別しません。
Owncast ストリームのディレクトリを構築する
Owncast の独自の featured streams 機能に力を与えるサーバー間アクティビティは、あなたが消費するためにオープンです。 Owncast サーバーのライブ状況を追跡するディレクトリまたはアグリゲーターを運用したい場合は、Fediverse アクターのように各サーバーをフォローし、送信される生存信号に反応します。
完全で実行可能な例のリファレンスとして、owncast-directory-example リポジトリを参照してください。 これは、このセクションのすべてを実装する小さな Python アプリケーションです:公開されたアクター、ns#directory フォロー、Offer / Leave / Reject の処理、およびライブサーバーのリストを表示するウェブページ。 生産サービスではなく、出発点として扱ってください。
公開されたアクターと署名されたリクエストが必要です。これは、他のどのフォロワーと同じです(HTTP Signaturesを参照)。 そこから:
- 各サーバーのアクターに対して、
https://owncast.online/ns#directoryをtrueに設定する署名付きFollowを送信します(カスタム名前空間を参照)。 そのマーカーは、あなたをディレクトリとして識別します。これにより、サーバーはストリームピングをあなたに送信し、リストにするのがオプトインになります:Owncast サーバーは必ずオペレーターが手動で承認するためにディレクトリフォローを保持します。サーバーのフェデレーションプライバシーがどのように設定されていても。 オペレーターが承認するまで、いかなるステータスも受け取ることがなく、各項目がオプトインするまで保留されることを期待してください。 マーカーのないFollowは、通常のファンフォローとして扱われます:自動的に受け入れられることもありますが、Offer/Leaveのピングを受け取ることは決してありません。 - サーバーがライブの間、約5分ごとに
オファーを受信して、Owncast カスタムメタデータ(ストリームステータス、タイトル、説明、サーバー名、ロゴ、サムネイル、タグ)を持って投稿します。 これらのフィールドから、サーバーのディレクトリエントリを作成または更新してください。 - ストリームが正常に終了すると、サーバーは
Leaveを投稿します。 エントリをオフラインとしてマークします。 - サーバーのオペレーターがあなたのディレクトリをその側から削除すると、サーバーは元の
FollowのRejectを投稿します。 エントリを削除します:そのサーバーをリストにする権限がなくなり、ピングを送信するのを停止します。
Owncast サーバーがあなたのディレクトリでスポットをリクエストするための組み込みのフローは存在しないため、リストを構築するのはあなたの仕事です。 オペレーターが自分のサーバーの URL を入力する提出フォームをあなたのディレクトリに置くことで、オペレーターがオプトインできる簡単な方法です。 あなたとあなたのディレクトリは、どの提出をリストにするか、どれを拒否するかを決定します。 一つを受け入れると、上記と同じ方法でそのサーバーをフォローします。 オペレーターはフォローを承認します。これは、提出者が期待していることです。フォロー、受け入れ、ピングフローは、彼らのストリームをリストします。
ピングをハートビートとして扱います。 サーバーが Leave なしで Offer アクティビティの送信を停止した場合、クラッシュしたり、接続を失ったり、ファイアウォールでブロックされた場合、何もアクティブにあなたにそれがダウンしたことを知らせることはありません。 あなたがピング間隔の数秒間に聞いたことがないエントリは、期限切れにします。 Owncast のディレクトリは、2 回のミスしたピングの後にピアをオフラインとしてマークし、毎分その陳腐性チェックを実行します。
正しくするべきいくつかのこと:
- メタデータフィールドはリモートサーバーから取得されるため、それを信頼できない入力として扱います。 長さを制限し、レンダリングする前に URL が
httpまたはhttpsであることを確認してください。 あなたが信頼できる値は、フォローすることに決めたサーバーの URL であり、サーバーが送信する表示名ではありません。 - サムネイルとロゴの URL は安定しているため、ブラウザはそれらをキャッシュします。 エントリを更新する際に、常に変更されるキャッシュバスティングクエリを追加すると、プレビューが最新の状態に保たれます。
- ピングをまったく使用する必要はありません。 サーバーがライブになったことを知る必要がある場合は、他の Fediverse 消費者と同様に、アクターをフォローし、標準の
Create/Noteゴーライブ投稿を監視します。
あなたのサービスがディレクトリとして認識されるようにするには、送信する Follow の https://owncast.online/ns#directory を true に設定します。 それを見たサーバーがフォローをオペレーターのために保持し、承認後にそれをストリームピングします。
エンドポイントリファレンス
すべてのパスはサーバーのベース URL に対して相対的です。 フェデレーションが無効になっている場合、すべてのエンドポイントは 405 を返します。
| パス | メソッド | 目的 |
|---|---|---|
/.well-known/webfinger | GET | acct: → アクター IRI を解決する |
/.well-known/host-meta | GET | WebFinger への XRD ポインタ |
/.well-known/nodeinfo | GET | NodeInfo 発見ドキュメント |
| /nodeinfo/2.0 | GET | NodeInfo 2.0 サーバーメタデータ |
/.well-known/x-nodeinfo2 | GET | x-nodeinfo2 サーバーメタデータ |
| /api/v1/instance | GET | Mastodon 対応のインスタンス説明 |
/federation/user/{username} | GET | Service アクタードキュメント |
/federation/user/{username}/inbox | POST | サーバーにアクティビティを配信します |
/federation/user/{username}/outbox | GET | サーバーが送信したアクティビティのコレクション |
/federation/user/{username}/followers | GET | ページネーションされたフォロワーコレクション |
/federation/user/{username}/following | GET | 常に 404(フォロリングリストなし) |
/federation/{object-id} | GET | 単一の保存された ActivityPub オブジェクトを取得する |
互換性のあるアプリケーションを構築する — チェックリスト
自分のアプリケーションから Owncast ストリームをフォローして消費するには:
- WebFinger でハンドルを解決します(
acct:live@host)アクター IRI を取得するには、それからアクターを取得します:Accept: application/activity+json。 - HTTPS経由で配信され、到達可能な
inboxを持つpublicKeyを用いて、自身のアクターを公開します。 - アクターの
inboxに署名された**フォローを送信**します。 RSAで(request-target) host date digestに署名し、SHA-256のDigestを含めます。 - Owncastがあなたの
inbox(公開モード)に戻す**Acceptを処理**します — または手動承認を待ちます(プライベートモード)。 - 公開開始の投稿をリスンします:
Create/Noteアクティビティがあなたのinboxに届き、ストリームが開始されたことを伝えます;alternate/application/x-mpegURLWebFingerリンクが再生するためのHLS URLを提供します。 - オプションでディレクトリとして機能します:
Followでhttps://owncast.online/ns#directoryをtrueに設定し、オペレーターの承認を得てから、Offer/Leaveのピンを消費し、リアルタイムのライブ性とよりリッチなディレクトリエントリのためにhttps://owncast.online/ns#*メタデータを使用します。 - 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.
