互操作指南:ActivityPub、WebFinger、NodeInfo 与 Featured Streams 协议全解析)
Owncast 联邦Federation互操作指南ActivityPub、WebFinger、NodeInfo 与 Featured Streams 协议全解析【免费下载链接】owncastTake control over your live stream video by running it yourself. Streaming chat out of the box.项目地址: https://gitcode.com/GitHub_Trending/ow/owncastOwncast 是一款自托管的直播服务器其联邦子系统让每个实例以单个 ActivityPub Actor 的身份接入 Fediverse对外广播开播通知与图文帖同时通过轻量级 Featured Streams特色直播目录协议相互罗列彼此的直播状态。本文基于仓库根目录的 FEDERATION.md 为主干结合services/activitypub源码与持久化实现系统讲解 Owncast 支持的标准协议、Actor 模型、活动类型矩阵、流状态信令Offer/Leave、引文帖FEP-044f、HTTP 签名与隐私模式帮助 Fediverse 软件运营者和开发者理解并实现与 Owncast 的互操作。Owncast 联邦的设计哲学Owncast 的联邦遵循 FEP-67ffFEDERATION.md 规范其核心定位是每个实例以单个Service类型 Actor而非Person代表自身及其直播广播开播go-live公告和图文帖给粉丝followers不呈现社交时间线也不关注单个联邦账户服务器之间可以通过 Featured Streams 协议相互罗列彼此的直播状态。这种设计使 Owncast 在 Fediverse 中更像一个广播节点而非社交节点。从代码结构看联邦子系统在 services/activitypub/activitypub.go 中作为组合根composition root装配串联了persistence、workerpool投递队列、outbox出站、inbox入站、jobs与controllers六个子服务并向流/管理端暴露SendLive、SendPublicFederatedMessage、GetFollowerCount等小型 API。支持的协议与 FEP 标准Owncast 联邦层支持四类基础标准标准用途ActivityPubServer-to-Server活动的发送与接收WebFingerActor 发现acct:形式的资源标识HTTP Signatures出站请求签名与入站验签NodeInfo实例元信息描述同时实现了三个 Fediverse Enhancement ProposalsFEP-67ff本仓库根目录的 FEDERATION.md 本身即是该 FEP 描述的规范形态FEP-f1d5NodeInfo 在 Fediverse 软件中的应用FEP-044f尊重用户同意的引文帖quote posts。Actor 模型以 Service 类型暴露直播实例每个 Owncast 实例对外呈现为一个ServiceActor。其 profile 构成见 apmodels/actor.go 中MakeServiceForAccount的实现包括icon服务器 Logo / 头像imageprofile 横幅图当前与icon为同一资源summary服务器描述按配置原样输出来自GetServerSummary()attachment由PropertyValue对象组成的数组承载社交链接与元数据源码中通过addMetadataLinkToProfile追加Stream链接与各社交平台句柄若社交链接恰好只有一条还会额外补一条Owncast链接以规避单元素 attachment 序列化不成数组的问题tag描述服务器内容的标签Hashtag来自GetServerMetadataTags()manuallyApprovesFollowers私密模式下为true取自GetFederationIsPrivate()discoverable恒为true。Owncast不暴露following集合该端点返回404它不关注单个联邦账户但会以目录方式关注其他服务器以构建 Featured Streams详见下文。活动类型矩阵Send / Receive 全景FEDERATION.md 给出了完整的活动矩阵逐项解读如下ActivityObjectSendReceive说明CreateNote是是开播时与手动联邦发帖时发送入站 Note 仅在有提及/回复时产生插件事件UpdateService是否服务器 profile 变更时发送UpdatePerson否是更新缓存的粉丝 profile 信息Follow-是是粉丝关注私密模式排队待审目录关注Featured Streams也走 FollowAcceptFollow是是接受入站关注或收到对方接受我们的目录关注RejectFollow是是拒绝/移除粉丝或收到对方拒绝目录关注UndoFollow是是入站取消关注出站取消罗列某服务器LikeNote否是可选展示在直播聊天中AnnounceNote否是可选展示在直播聊天中Offer-是是Featured Streams 直播中信号Leave-是是Featured Streams 离线信号QuoteRequestNote否是远程用户请求引用我们的帖子FEP-044fAcceptQuoteRequest是否帖子存在且允许引用时发送result携带QuoteAuthorization印章 IRIRejectQuoteRequest是否未知帖子、私密模式或引用被禁用时发送关键限制Owncast不会把入站Create(Note)作为社交时间线展示也不会向外转发符合条件的提及与回复只投递给服务器插件。入站活动的处理入口在 inbox 包内每个活动类型对应一个 handlercreate.go、follow.go、like.go、announce.go、quote.go、offer.go、leave.go、update.go、undo.go、accept.go、reject.go等通过 inbox/service.go 分发给 worker。Featured StreamsOwncast 直播状态目录协议这是 Owncast 联邦中最具特色的部分允许服务器以轻量目录方式罗列彼此的直播。协议基于标准 ActivityPub 活动外加https://owncast.online/ns#命名空间下的一小组 JSON-LD 扩展属性。关注罗列一台服务器目录向目标服务器发送Follow要求actor为目录自身object为目标服务器的 Actor携带扩展属性https://owncast.online/ns#directory: true用于区分目录罗列与普通个人关注。目录关注始终需要运营者审批即便在公开实例上。目标服务器审批后回复Accept(Follow)拒绝则回复Reject(Follow)后续目标服务器可再发Reject(Follow)撤销罗列目录方也可发送Undo(Follow)停止罗列。从源码看Owncast 作为目录方向外发出 Follow 时通过 owncast_metadata.go 中的SetBasicOwncastMetadata写入ns#directory标记而作为被罗列方收到携带该标记的 Follow 时会在 apmodels/actor.go 的ActivityPubActor.IsDirectory字段中记录并进入运营者审批队列。直播中 / 离线信号一旦关注被接受Owncast 服务器只向其目录粉丝而非普通个人粉丝投递流状态活动Offer直播开始时发送之后由定时器周期性重发StartStreamPingTicker/SendStreamPing见 activitypub.go保证目录状态新鲜Leave直播结束时发送SendStreamGoingOffline使目录立即将该服务器从直播中列表移除无需等待过期清扫staleness sweep。两者的object均使用发送服务器的基 URLscheme://host流元数据以 JSON-LD 扩展属性附加。这些扩展属性的键定义在 config/constants.go属性https://owncast.online/ns#含义streamStatuslive或offlinestreamTitle当前直播标题streamDescription直播或服务器描述serverName服务器显示名logoUrl服务器 Logo URLthumbnailUrl直播预览缩略图 URL仅直播中存在streamTags流标签数组出站侧SetOwncastMetadata在开播时自动附加thumbnailUrl{serverURL}/thumbnail.jpg与streamStatus: live入站侧inbox/offer.go 的handleOfferInboxRequest会先校验该活动确为streamStatus live的合法 Offer、再确认该服务器处于正在被我们关注的状态未关注或pending/rejected的服务器直接忽略随后调用UpdateServerStatus写入数据库。元数据截断防护远程元数据被视作不可信输入存储前会做长度与数量钳制见 inbox/offer.go流标题上限 300 字符流描述上限 2000 字符服务器名上限 200 字符URL 上限 2048 字符标签最多 20 个、每个最长 100 字符且按 runeUTF-8 安全截断。对应测试见 metadata_clamp_test.go。持久化侧联邦服务器记录按scheme://host基 URL 作为主键存储于federated_servers表仓库 persistence/federatedserversrepository 包含UpdateServerStatus等操作并记录最后在线时间与最后状态更新时间可对照 server-federation-2.md 的设计要求。与其他软件的互操作该协议是开放的但两个方向目前能力不同入站第三方作为目录罗列 OwncastOwncast 接受任何携带ns#directory标记的目录 Follow并向其投递Offer/Leave因此任何第三方 ActivityPub 实现都可以充当罗列 Owncast 直播的目录出站Owncast 作为目录罗列他人目前仅限 Owncast 自身——在关注某台服务器以便罗列其直播前Owncast 会先校验对方 NodeInfo 报告的software.name owncast且metadata.federation.featuredStreams 1见 utils/nodeinfo.go 中的校验逻辑因此不会罗列非 Owncast 服务器。Note 对象结构与开播公告Owncast 发出的帖子为Note对象包含content带链接标签的 HTML 格式文本attachment直播预览的Image对象开播帖存在预览图时附带源码在SendLive中优先选用preview.gif其次thumbnail.jpgtagHashtag与Mention对象的数组sensitive直播标记为 NSFW 时开播帖为true对应GetNSFW()配置interactionPolicy公开帖默认声明任何人都可引用canQuote的automaticApproval指向公共集合除非引用被禁用或服务器处于私密模式。开播公告直播开始时发送Create(Note)内容包含配置的开播消息默认Ive gone live!、服务器配置的标签、观看链接以及可用的直播预览图。若运营者清空了开播消息则不发送公告SendLive中textContent 时直接返回见 outbox.go。标签使用Hashtag类型Mastodon/toot词表链接指向https://owncast.directory/tags/{tag}以便跨实例发现此外代码还会自动补充#owncast标签确保出现在 Owncast 搜索结果中。引文帖Quote Posts与 FEP-044fOwncast 实现了 FEP-044f 的被引用侧quoted-server side为远程用户引用 Owncast 帖子提供同意流程公开帖携带interactionPolicy声明自动批准任何人引用收到针对本服务器所创作帖子的入站QuoteRequest时以Accept应答其result为已存储的QuoteAuthorization印章的 IRI该印章可在该 IRI 上被解引用供第三方服务器验证引用已获批准见 inbox/quote.go印章通过apmodels.MakeQuoteAuthorization构建并存储然后经requests.SendQuoteRequestAccept投递对未知对象的QuoteRequest、私密模式下或引用被禁用时的任何请求均回复Reject引用默认启用运营者可关闭配置项GetFederationEnableQuotes()Owncast不主动创作引文帖也不撤销已签发的印章。寻址Addressing公开帖的寻址结构为{ to: [https://www.w3.org/ns/activitystreams#Public], cc: [{actor}/followers] }Owncast 还可向特定 Actor 发送私信用于回复互动此时收件人放入to并附带对应的Mention标签以兼容 Mastodon实现见SendDirectMessageToAccount先经 WebFinger 解析账户、解析 Actor再将活动与 Note 改为直邮寻址。HTTP Signatures出站签名与入站验签出站所有POST请求使用RSA-SHA256签名被签名头为(request-target)、host、date、digest每次投递尝试都会生成全新签名。对应实现位于 crypto/sign.gohttpsig.RSA_SHA256算法、DigestSha256摘要headersToSign按需追加digest。出站侧在 outbox.go 的sendToInboxes中为每个收件箱构建workerpool.Delivery签名在每次持久化投递尝试前即时生成。入站活动以HTTP 202 Accepted接收见 controllers/inbox.go随后异步验签。仅携带有效 HTTP 签名的活动会被处理未签名或签名无效的活动被丢弃、不执行任何动作。对 actor、outbox、followers 端点的GET 请求不需要签名。私密模式Private Mode私密模式下Actor 的manuallyApprovesFollowers为true关注请求进入运营者审批队列GetPendingFollowRequests可查询待审列表仅在人工批准后发送AcceptRespondToFollow中原子地记录审批结果并将 Accept/Reject 入队投递见 activitypub.go。屏蔽BlockingOwncast 支持域名级与单个 Actor 级两种屏蔽。来自被屏蔽域名或被禁用 Actor 的入站活动会被直接丢弃而不处理被拒绝或屏蔽的粉丝会从未来的出站投递中移除。管理端移除粉丝时RemoveFollower若该粉丝是目录还会尽力投递一个Reject(Follow)通知其撤销罗列见 activitypub.go。WebFingerActor 与直播流发现Actor 发现通过/.well-known/webfinger?resourceacct:{username}{domain}进行。处理器在 controllers/webfinger.go 中联邦未启用时返回405主机无法规范化返回404resource参数畸形返回400请求的主机与实例主机不一致返回501。响应中的 links构建逻辑见 apmodels/webfinger.go包括RelType指向selfapplication/activityjsonActor 文档http://webfinger.net/rel/profile-pagetext/htmlWeb 资料页http://webfinger.net/rel/avatar图片类型Profile 头像alternateapplication/x-mpegURLHLS 流 URL其中alternate链接是 Owncast 的特色客户端可直接从 WebFinger 发现直播流HLS地址而不必先加载 Actor 文档。NodeInfo实例元信息NodeInfo 发现入口为/.well-known/nodeinfoNodeInfo 2.0 版本在/nodeinfo/2.0提供见 controllers/nodeinfo.gov2.Path nodeinfo/2.0link rel 为http://nodeinfo.diaspora.software/ns/schema/2.0。相关端点还有/.well-known/x-nodeinfo2扩展格式/api/v1/instanceMastodon 兼容的实例信息/.well-known/host-metaWebFinger 发现。在 Featured Streams 出站校验中NodeInfo 是判断对方是否为 Owncast 实例software.name及其是否支持特色直播metadata.federation.featuredStreams 1的依据同时metadata.federation.username还用于提取联邦用户名utils/nodeinfo.go 的ExtractFederationUsername。互操作注意事项速查Owncast 使用ServiceActor 类型而非PersonOwncast 不关注个人联邦账户也不暴露following集合但服务器之间通过 Follow 构建 Featured Streams 目录入站Create(Note)不作为时间线帖子展示、也不向外转发符合条件的提及/回复只投递给插件Like、Announce互动可在启用后展示在直播聊天中由 chat 的入站处理与聊天事件系统协作完成sensitive标记表示整个流为 NSFW 内容。相关文档与实现索引协议总纲FEDERATION.mdFEP-67ff 的实现描述联邦子系统组合根与公开 APIservices/activitypub/activitypub.go入站活动处理Offer/Leave/Quote/Follow 等services/activitypub/inbox出站消息生产services/activitypub/outbox/outbox.go扩展元数据解析与写入services/activitypub/apmodels/owncast_metadata.go命名空间常量定义config/constants.go联邦服务器持久化persistence/federatedserversrepository设计历史与演进docs/features/server-federation-2.md、docs/features/server-federation-4.md、docs/features/server-federation-security.md入站活动持久化模型models/federatedActivity.go、models/federatedserver.go【免费下载链接】owncastTake control over your live stream video by running it yourself. Streaming chat out of the box.项目地址: https://gitcode.com/GitHub_Trending/ow/owncast创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考