摘要
ActivityPub协议是一种分散的社交网络协议基于[ActivityStreams活动流]2.0数据格式。它提供了用于创建、更新和删除的客户端到服务器API内容,以及用于交付的联邦服务器到服务器API通知和内容。
1概述
ActivityPub提供两层:
-
服务器到服务器联合协议(这样分散的网站可以共享信息)
-
客户端到服务器协议(因此用户,包括真实用户、机器人程序和其他自动化流程,可以使用服务器上的帐户与ActivityPub通信,从手机、桌面或web应用程序或其他任何程序)
ActivityPub实现可以只实现其中一个,或者他们俩都是。然而,一旦实现了一个,就不需要太多步骤实现另一个,两者都有很多好处你的网站是去中心化社交网络的一部分,并且能够使用跨多种类型工作的客户端和客户端库社交网站)。
在ActivityPub中,用户由“演员"通过服务器上的用户帐户。不同服务器上的用户帐户对应于不同的参与者。每个演员都有:
- 安
收件箱
:他们如何获得来自世界的信息
- 安
发件箱
:他们如何向他人发送信息
这些是端点,或者实际上只是URL,它们列在ActivityPub演员的ActivityStreams描述。(稍后将详细介绍ActivityStreams)。
下面是我们的朋友Alyssa P.Hacker的记录示例:
示例1
{“@context”:"https://www.w3.org/ns/activitystreams网站",“类型”:“个人”,“id”:"https://social.example/alyssa/",“名称”:“Alyssa P.黑客”,“首选用户名”:“alyssa”,“摘要”:“麻省理工学院的Lisp爱好者欢呼”,“收件箱”:"https://social.example/alysis收件箱/",“发件箱”:"https://social.example/alyssa/outbox/",“关注者”:"https://social.example/alyssa/followers/",“关注”:"https://social.example/alysa/关注/",“喜欢”:"https://social.example/alyssa/点赞/"}
ActivityPub使用[ActivityStreams活动流]因为它的词汇。这非常棒,因为ActivityStreams包括所有常见的表示所有活动和内容流动所需的术语围绕社交网络。ActivityStreams可能已经包含了所有词汇表您需要,但即使不需要,ActivityStreams也可以扩展通过[JSON-LD格式].如果你知道什么是JSON-LD,你可以利用酷链接JSON-LD提供的数据方法。如果没有,不用担心,JSON-LD文档和ActivityStreams可以理解为普通的旧的简单JSON。(如果要添加扩展,那么JSON-LD真的能帮到你)。
所以,好吧。艾丽莎想和她的朋友聊天,她的朋友想和她聊天她!幸运的是,这些“收件箱”和“发件箱”可以帮助我们解决问题。对于GET和POST,它们的行为都不同。让我们看看它是如何工作的:
嘿,很好,所以简单回顾一下:
- 你可以将邮件发送到某人的收件箱,向他们发送消息(仅限服务器到服务器/联合…此是联盟!)
- 您可以从收件箱中阅读最新消息(客户端到服务器;这就像阅读您的社交网站网络流)
- 您可以通过POST发送到发件箱向世界发送消息(客户端到服务器)
- 你可以从某人的发件箱中查看他们有什么消息已发布(或至少是您有权查看的内容)。(客户端到服务器和/或服务器到服务器)
当然,如果最后一个(从某人的发件箱中取出)是查看人们发送内容的唯一方法是高效的联邦协议!事实上,联合通常是通过服务器发布由其他服务器收件箱上的actor到actor。
让我们看一个例子!比方说,阿丽莎想赶上她的朋友本·比蒂德尔。她最近借给他一本书,她想确保他还书给她。以下是她作为ActivityStreams对象编写的消息:
示例2
{“@context”:"https://www.w3.org/ns/activitystreams网站",“类型”:“备注”,“至”: ["https://chatty.example/ben网站/"],“归属于”:"https://social.example/alyssa/",“内容”:“喂,我借给你的那本书你看完了吗?”}
这是一张写给本的便条。她把它寄给了她的发件箱。
由于这是一个非活动对象,服务器会识别出这是一个新创建的对象,并礼貌地将其包装a创建活动。(ActivityPub中发送的活动通常遵循以下模式某个演员对某个对象进行的某些活动。在这种情况下,活动是一个Create of a Note对象,由人员)。
示例3
{“@context”:"https://www.w3.org/ns/activitystreams网站",“类型”:“创建”,“id”:"https://social.example/alysisa/posts/a29a6843-9feb-4c74-a7f7-081b9c9201d3",“至”: ["https://chatty.example/ben网站/"],“演员”:"https://social.example/alyssa/",“对象”: {“类型”:“备注”,“id”:"https://social.example/alyssa/posts/49e2d03d-b53a-4c4c4-a95c-94a6abf45a19社交网站",“归属于”:"https://social.example/alyssa/",“至”: ["https://chatty.example/ben网站/"],“内容”:“喂,我借给你的那本书你看完了吗?”}}
Alyssa的服务器查找Ben的ActivityStreams演员对象,找到他的收件箱端点,并将她的对象POST到他的收件箱。
从技术上讲,这是两个单独的步骤。。。一种是客户端到服务器通信,一个是服务器到服务器的通信(联邦)。但是,由于我们在本例中同时使用了它们,因此可以抽象地将此视为从发件箱到收件箱的简化提交:
酷!过了一会儿,艾丽莎检查她收到了什么新消息。她的手机通过GET和一系列猫咪视频查询她的收件箱她的朋友发来的照片和她姐姐发来的侄子的照片,她如下所示:
示例4
{“@context”:“https://www.w3.org/ns/activitystreams网站",“type”:“创建”,“id”:“https://chatty.example/ben/p/51086",“至”:[“https://social.example/alyssa/"],“演员”:“https://chatty.example/ben网站/",“object”:{“type”:“备注”,“id”:“https://chatty.example/ben/p/51085",“attributedTo”:“https://chatty.example/ben网站/",“至”:[“https://social.example/alyssa/"],“回复至”:“https://social.example/alyssa/posts/49e2d03d-b53a-4c4c4-a95c-94a6abf45a19社交网站",“content”:“啊,是的,对不起,我明天会还给你的</p><p>我正在复习关于登记机的部分,因为我已经有一段时间没有写了</p> “}}”
阿丽莎松了一口气,喜欢本的帖子:
示例5
{“@context”:"https://www.w3.org/ns/activitystreams网站",“类型”:“喜欢”,“id”:"https://social.example/alyssa/posts/5312e10e-5110-42e5-a09b-934882b3ecec(英语)",“至”: ["https://chatty.example/ben网站/"],“演员”:"https://social.example/alyssa/",“对象”:"https://chatty.example/ben/p/51086"}
她把这条信息发布到她的发件箱。(因为这是一个活动,她的服务器知道它不需要包装a创建对象)。
她对事情感到高兴,决定向她发布一条公开信息关注者。很快,以下消息就被发送给了她的所有成员followers集合,因为它有特殊的Public组地址,通常任何人都可以阅读。
示例6
{“@context”:"https://www.w3.org/ns/activitystreams网站",“类型”:“创建”,“id”:"https://social.example/alysisa/posts/9282e9cc-14d0-42b3-a758-d6aeca6c876b",“至”: ["https://social.example/alyssa/followers/","https://www.w3.org/ns/activitystreams#公开"],“演员”:"https://social.example/alyssa/",“对象”: {“类型”:“备注”,“id”:"https://social.example/alyssa/posts/d18c55d4-8a63-4181-9745-4e6cf7938fa1社交网站",“归属于”:"https://social.example/alyssa/",“至”: ["https://social.example/alyssa/followers/","https://www.w3.org/ns/activitystreams#公开"],“内容”:“把书借给朋友很好。把书拿回来更好!:)”}}
三。物体
对象是围绕这两个概念的核心概念[ActivityStreams活动流]和ActivityPub已构建。对象通常包装在Activities中,并包含在集合,它们本身是Objects的子类。请参阅[活动-词汇]文档,尤其是核心类;ActivityPub非常密切地遵循这个词汇表的映射。
ActivityPub定义了除ActivityStreams。这些条款在ActivityPub中提供JSON-LD上下文在https://www.w3.org/ns/activitystreams网站
.实施者应该将ActivityPub上下文包含在对象定义。实施者5月酌情包括其他上下文。
ActivityPub也有相同的功能ActivityStreams中的URI/IRI约定.
服务器应该验证他们收到的内容以避免内容欺骗攻击。(服务器应该做一些至少与检查对象在其原点处显示为接收状态,但机制例如,如果可用,检查签名会更好)。没有权威指定特定的验证机制这个文档,但请参阅安全注意事项以获取一些建议和良好实践。
3.1对象标识符
中的所有对象[ActivityStreams活动流]应该具有唯一的全局标识符。ActivityPub扩展了这一要求;由ActivityPub协议必须具有唯一的全局标识符,除非故意是暂时的(短期活动旨在能够被查找,例如某些类型的聊天消息或游戏通知)。这些标识符必须属于以下组之一:
- 公共可取消引用的URI,如HTTPS URI,及其属于其原始服务器的权限。(面向公众的内容应该使用HTTPS URI)。
- 明确指定为JSON的ID
无效的
对象,这意味着一个匿名对象(它的父上下文的一部分)
标识符必须为发布在服务器中的活动提供服务器通信,除非活动是有意暂时的。但是,对于客户端到服务器的通信,服务器接收对象发布到发件箱,但未指定身份证件
应该在参与者的命名空间中分配对象ID并将其附加到发布的对象。
所有对象都具有以下属性:
- 身份证件
- 对象的唯一全局标识符(除非对象是暂时的,在这种情况下
身份证件
5月省略)。
- 类型
- 对象的类型。
3.2检索对象
可以根据对象的身份证件
属性检索活动。服务器5月使用中定义的HTTP内容协商[RFC7231协议]至选择响应请求返回的数据类型,但是必须显示ActivityStreams对象表示作为对…的回应application/ld+json;profile=“https://www.w3.org/ns/activitystreams网站"
,和应该还显示了中的ActivityStreams表示对…的响应应用程序/活动+json
也。客户必须指定一个接受
带有application/ld+json;profile=“https://www.w3.org/ns/activitystreams网站"
媒体类型以检索活动。
服务器5月为不符合要求的请求实现其他行为符合上述要求。(例如,服务器可能实施其他遗留协议,或可以对HTML和ActivityStreams使用相同的URI表示资源)。
服务器5月需要中规定的授权B.1节 身份验证和授权,并可以另外实现其自己的授权规则。服务器应该未通过授权的请求失败使用适当的HTTP错误代码或403 Forbidden进行检查错误代码,其中对象的存在被认为是私有的。不希望披露存在私人目标5月而是使用状态代码进行响应404未找到。
3.3源属性
除了由[活动-词汇],ActivityPub扩展了对象
通过提供来源
属性。这个来源
属性旨在传递一些一种来源内容
标记作为起源的一种形式,或为了支持未来由客户编辑。通常,客户机从来源
到内容
而不是相反。
的价值来源
本身就是一个对象它使用自己的内容
和媒体类型
提供源信息的字段。
例8
{“@context”: ["https://www.w3.org/ns/activitystreams网站",{“@语言”:“恩”}],“类型”:“备注”,“id”:"http://postparty.example/p/2415",“内容”:“我非常喜欢草莓!”,“源”: {“内容”:“我真的很喜欢草莓!”,“媒体类型”:“文本/标记”}}
注释:当客户端无法有效处理mediaType时该怎么办?
一般来说,最好让用户编辑他们的原始帖子他们最初以相同的源格式编写它。但并非所有客户端都能可靠地为所有源类型,并且由于客户端需要执行转换自来源
到内容
,一些客户端可能使用另一个客户端使用的媒体类型不知道如何使用。虽然客户可以切实提供内容
要编辑的标记并忽略源,这意味着用户将失去更理想的原始格式来源
在将来的任何修订中。因此,这样做的客户应该提供一个最低限度的干扰性警告注意,原始源格式无法理解因此被忽视。
例如,Alyssa P.Hacker喜欢在她的ActivityPub上发帖通过她编写的Emacs客户端支持博客,利用组织模式.后来,她切换到手机客户端上进行编辑不知道是什么文本/x-org
是或如何渲染它转换为HTML,因此它提供了一个文本框来编辑原始内容
而不是。编辑区域上方会显示一条有用的警告:,“这最初是用另一种标记语言编写的,我们没有知道如何处理。如果你编辑,你会丢失你的原件来源!"艾莉莎觉得这个小小的拼写错误不值得失去她的美貌org-mode标记并决定在收到家。
4演员
ActivityPub演员通常是ActivityStreams参与者类型,但它们不一定是。例如简况对象可以用作参与者,也可以用作ActivityStreams扩展中的类型。演员是恢复像其他人一样ActivityPub中的对象。与其他ActivityStreams对象一样,参与者有一个身份证件
,它是一个URI。直接输入用户界面时(例如登录时形式),则希望支持简化的命名。为此,ID规范化应该执行如下:
- 如果输入的ID是有效的URI,则直接使用它。
- 如果用户似乎忽略了为URI添加一个方案否则将被视为有效,例如
example.org/alice/
,个客户端5月试图提供默认方案,最好https(https)
.
- 否则,输入的值应视为无效。
一旦确定了参与者的URI,就应该取消对它的引用。
注释
ActivityPub没有规定“用户”和参与者;有许多配置是可能的。可能有多个用户或组织控制参与者,或者类似地,一个人或组织可以控制多个演员。类似地,Actor可能代表一个软件,比如机器人或者自动化流程。更详细的“用户”建模,例如将参与者链接在一起由同一实体控制,或允许呈现一个参与者通过多个备选配置文件或方面,由您自行决定执行情况。
4.1演员物体
参与者对象必须除了3.1 对象标识符,以下属性:
- 收件箱
- 对[ActivityStreams活动流]
有序集合
由参与者收到的所有消息组成;看见5.2 收件箱.
- 发件箱
- 安[ActivityStreams活动流]
有序集合
由演员产生的所有信息组成;看见5.1 发件箱.
启动位置应该此外,提供以下内容属性:
- 下列的
- 指向[ActivityStreams活动流]演员集合这个演员正在跟随;看见5.4 以下集合
- 追随者
- 指向[ActivityStreams活动流]演员集合跟随这个演员;看见5.3 粉丝集合.
启动位置5月提供以下属性:
- 喜欢
- 指向[ActivityStreams活动流]对象集合此演员喜欢;看见5.5 喜欢的收藏.
示例9
{“@context”: ["https://www.w3.org/ns/activitystreams网站",{“@语言”:“ja”}],“类型”:“个人”,“id”:"https://kenzoishii.example.com/",“关注”:"https://kenzoishii.example.com/following.json",“关注者”:"https://kenzoishii.example.com/followers.json",“喜欢”:"https://kenzoishii.example.com/liked.json",“收件箱”:"https://kenzoishii.example.com/inbox.json",“发件箱”:"https://kenzoishii.example.com/feed.json网站",“首选用户名”:“肯佐西”,“名称”:"石井健蔵",“摘要”:"この方はただの例です",“图标”: ["https://kenzoishii.example.com/image/165987aklre4"]}
启动位置5月此外,还提供以下属性:
- 溪流
- 可能感兴趣的补充托收清单。
- 首选用户名
- 一个简短的用户名,可以用来指代演员,没有唯一性保证。
- 端点
- 映射其他(通常是服务器/域范围)的json对象可能对该参与者或某人有用的端点引用此演员。此映射可以作为值嵌套在actor文档中或者可以是指向具有这些属性的JSON-LD文档的链接。
这个端点
映射5月包括以下内容属性:
- 代理URL
- 端点URI,以便此参与者的客户端可以访问远程需要身份验证才能访问的ActivityStreams对象。要使用此端点,客户端将
x-www-form-urlencoded
身份证件
参数值为身份证件
请求的ActivityStreams对象。
- oauthAuthorization端点
- 如果OAuth 2.0无记名令牌[RFC6749协议] [RFC6750型]正在使用用于身份验证客户端到服务器相互作用,此端点指定浏览器身份验证用户所在的URI可以获得新的授权授予。
- oauthToken端点
- 如果OAuth 2.0无记名令牌[RFC6749协议] [RFC6750型]正在使用用于身份验证客户端到服务器相互作用,此端点指定客户端可以在其中获取访问令牌。
- 提供客户端密钥
- 如果链接数据签名和HTTP签名用于身份验证和授权,此端点在哪些浏览器身份验证用户可以授权客户端的公共的键客户端到服务器相互作用.
- signClientKey(签名客户端密钥)
- 如果链接数据签名和HTTP签名用于身份验证和授权,此端点在其中客户端密钥可以由参与者的密钥签名一段时间代表演员与外国人互动的窗口服务器。
- 共享收件箱
- 可选端点用于广泛交付公开发表的活动以及发送给关注者的活动.
共享收件箱
端点应该也要公开可读的有序集合
对象包含对象的地址公共特别收藏。从共享收件箱
端点不能目前未发送到公共
端点。
注释
作为ActivityPub的上游词汇,任何适用的[ActivityStreams活动流]属性可以用于ActivityPub参与者。一些ActivityStreams属性特别值得强调演示如何在ActivityPub实现中使用它们。
- 网址
- 如果不等于的值
身份证件
.
- 名称
- 演员的首选“昵称”或“显示名称”。
- 总结
- 用户关于自己的快速摘要或个人简介。
- 偶像
- 指向表示用户的个人资料图片(这可能是缩略图)。
5收藏
[ActivityStreams活动流]定义集合概念;活动Pub定义了几个具有特殊行为的集合。请注意,ActivityPub使用ActivityStreams分页遍历大型对象集。
请注意,其中一些集合被指定为类型
有序集合
具体来说,当其他人被允许成为
收藏
或一个
有序集合
.安
有序集合
必须以相反的时间顺序一致地呈现。
注释
使用什么属性来确定逆时间顺序有意留作实现细节。例如,许多SQL样式的数据库使用递增整数作为一个标识符,可以合理地用于处理大多数情况下的插入顺序。在其他数据库中,插入时间时间戳可能是首选。使用什么并不重要,但元素的顺序必须保持原样,先换新的。定期更改的属性,如“上次更新”时间戳,不应使用。
5.1发件箱
发件箱是通过发件箱
的属性演员的轮廓。这个发件箱
必须成为
有序集合
.
发件箱流包含用户的活动发布,取决于请求者检索活动(即发件箱的内容由阅读者的权限)。如果用户提交请求时没有授权服务器应该用所有的公共帖子。这可能是由用户,尽管可用项目的数量留给实现和部署服务器的人员的自由裁量权。
发件箱接受HTTP POST请求,其行为如客户端到服务器互动.
5.2收件箱
通过收件箱
的属性演员的轮廓。这个收件箱
必须成为
有序集合
.
收件箱流包含演员。服务器应该根据请求者的筛选内容许可。通常,收件箱的所有者可能能够访问所有收件箱内容。根据访问控制,一些其他内容可能是公开的,而其他内容可能需要非所有者用户的身份验证(如果他们可以访问收件箱)完全。
服务器必须对返回的活动执行重复数据消除收件箱。如果活动同时满足这两个条件,则可能发生重复对演员的追随者,以及特定的同时跟随接收方参与者的参与者,而服务器出现故障以消除收件人列表的重复。此类重复数据消除必须通过比较身份证件
删除所有活动已经看过了。
联邦服务器上参与者的收件箱接受HTTP POST请求,行为描述见送货.非联邦服务器应该返回405方法不允许收到POST请求。
5.3粉丝集合
每演员 应该有一个追随者
收藏。这是发送了跟随演员的活动,添加为副作用.在这里可以找到所有演员的名单跟随演员。这个追随者
收集必须要么是
有序集合
或a
收藏
和5月根据经过身份验证的用户的权限进行筛选或在未提供身份验证时视情况而定。
注释:通知目标的默认设置
以下活动通常是请求查看参与者的对象创建。这使Followers集合成为适当的默认值的目标传送个通知(共个)。
5.4以下集合
每个演员应该有一个下列的
收藏。这是演员关注的所有人的列表,添加为副作用.这个下列的
收集必须要么是
有序集合
或a
收藏
和5月根据经过身份验证的用户的权限进行筛选或在未提供身份验证时视情况而定。
5.5喜欢的收藏
每个演员5月有一个喜欢
收藏。这是所有参与者的每个对象的列表喜欢
活动,添加为副作用.这个喜欢
收集必须要么是
有序集合
或a
收藏
和5月根据经过身份验证的用户的权限进行筛选或在未提供身份验证时视情况而定。
5.6公共寻址
除此之外[ActivityStreams活动流]集合和对象,活动还可以针对特殊的“公众”集合,带有标识符https://www.w3.org/ns/activitystreams#公开
.例如:
示例10
{“@context”:"https://www.w3.org/ns/activitystreams网站",“id”:"https://www.w3.org/ns/activitystreams#公开",“类型”:“集合”}
所有人都可以访问针对该特殊URI的活动用户,无需身份验证。启动位置不能向“公众”提供特别收藏;它不能接收实际的活动。然而,演员5月有一个共享收件箱
可用于高效共享公共交付的端点帖子(以及仅针对追随者的帖子);看见7.1.3 共享收件箱传递.
注释
使用ActivityStreams压缩ActivityStreams对象JSON-LD上下文可能会导致https://www.w3.org/ns/activitystreams#公开
被简单地表示公共
或作为:公共
这些是公共集合的有效表示。将ActivityStreams对象视为简单对象的实现JSON,而不是将传入活动转换为使用JSON-LD工具的本地上下文应该知道这一点并应准备接受所有三种陈述。
5.7Likes系列
每个对象5月有一个喜欢
收藏。这是所有喜欢
此对象的活动作为对象
属性,添加为副作用.这个喜欢
收集必须要么是
有序集合
或a
收藏
和5月根据经过身份验证的用户的权限进行筛选或在未提供身份验证时视情况而定。
注释
应注意不要混淆喜欢
名称相似但不同的集合喜欢
收藏。总之:
5.8股份收款
每个对象5月有一个分享
收藏。这是所有宣布
此对象的活动作为对象
属性,添加为副作用.这个分享
收集必须要么是
有序集合
或a
收藏
和5月根据经过身份验证的用户的权限进行筛选或在未提供身份验证时视情况而定。
6客户端到服务器的交互
定义的活动[ActivityStreams活动流]是核心机制用于在社交图中创建、修改和共享内容。
通过客户端发布进行客户端到服务器的交互演员的活动发件箱.为此,客户必须从中发现演员发件箱的URL他们的轮廓然后必须生成HTTP邮政
对该URL的请求,其内容类型为application/ld+json;profile=“https://www.w3.org/ns/activitystreams网站"
.服务器5月解释的Content-Type或Accept标头应用程序/活动+json
等效到application/ld+json;profile=“https://www.w3.org/ns/activitystreams网站"
用于客户端到服务器的交互。请求必须使用用户凭据进行身份验证发件箱属于谁。的主体邮政
请求必须包含单个活动(其中5月包含嵌入对象),或单个非活动对象,其中将被包装在Create活动中由服务器.
例11:将活动提交到发件箱
邮政 /发件箱/HTTP/1.1协议主机:dustycloud.org授权:持票人XXXXXXXXXX内容类型:application/ld+json;profile=“https://www.w3.org/ns/activitystreams网站"{“@context”: ["https://www.w3.org/ns/activitystreams网站",{“@语言”:“恩”}],“类型”:“喜欢”,“演员”:"https://dustycloud.org/chris网站/",“名称”:“Chris喜欢‘Minimal ActivityPub更新客户端’”,“对象”:"https://rhiaro.co.uk/2016/05/minimal-activitypub网站",“至”: ["https://rhiaro.co.uk/#amy","https://dustycloud.org/关注者","https://rhiaro.co.uk/关注者/"],“抄送”:"https://e14n.com/evan"}
如果提交的活动中包含身份证件
属性,服务器必须忽略此项并生成新的身份证件
用于活动。服务器必须返回a201创建
HTTP代码,除非活动是暂时的,必须包括新的身份证件
在中位置
收割台。
示例12:对已提交活动的发件箱响应
HTTP/1.1协议201创建位置: https://dustycloud.org/likes/345
服务器必须删除bto公司
和/或密件抄送
属性(如果存在)交付,但必须利用最初存储的地址上bto公司
/密件抄送
用于确定的属性中的收件人传送.
服务器必须然后将此新的“活动”添加到发件箱收藏。根据“活动”的类型,可能会要求服务器产生进一步的副作用。(但是,不能保证活动出现的时间发件箱。“活动”可能会在延迟后出现或在任何时间段消失)。这些按以下单个活动进行描述。
尝试将对象提交到未实现客户端到服务器的服务器支持应该导致405不允许的方法
响应。
HTTP缓存机制[RFC7234协议]应该在以下情况下受到尊重适当,无论是在从服务器接收响应的客户端中作为服务器向客户端发送响应。
6.1客户端寻址
客户负责处理新活动适当地。在某种程度上,这取决于特定的客户实现,但客户端必须知道服务器只会将新活动转发给到
,bto公司
,复写的副本
,密件抄送
、和观众
领域。
这个粉丝集合和/或公共收藏都很好新活动的默认寻址选项。
客户应该查看通过对象
,目标
,inReplyTo中
和/或标签
字段,检索他们的 演员
或归属于
属性,以及5月还检索它们的寻址属性,并将这些添加到到
或复写的副本
正在创建的新“活动”的字段。客户5月通过附加的对象递归,但如果这样做,应该为这个递归设置一个限制。(注意,这并不意味着客户应该“拆包”参与者集合作为单个接收者)。
客户5月让用户有机会在用户界面。
例如,当克里斯喜欢艾米的以下文章时:
例13:一篇文章
{“@context”: ["https://www.w3.org/ns/activitystreams网站",{“@语言”:“en-GB”}],“id”:"https://rhiaro.co.uk/2016/05/minimal-activitypub网站",“类型”:“文章”,“名称”:“最小活动Pub更新客户端”,“内容”:“今天我完成了morph,一个发布ActivityStreams2的客户端…”,“归属于”:"https://rhiaro.co.uk/#amy",“至”:"https://rhiaro.co.uk/关注者/",“抄送”:"https://e14n.com/evan"}
类似的由客户端生成为:
例14:文章的相似之处
{“@context”: ["https://www.w3.org/ns/activitystreams网站",{“@语言”:“恩”}],“类型”:“喜欢”,“演员”:"https://dustycloud.org/chris网站/",“摘要”:“Chris喜欢‘Minimal ActivityPub更新客户端’”,“对象”:"https://rhiaro.co.uk/2016/05/minimal-activitypub网站",“至”: ["https://rhiaro.co.uk/#amy","https://dustycloud.org/关注者","https://rhiaro.co.uk/关注者/"],“抄送”:"https://e14n.com/evan"}
然后,接收发件箱可以执行传送不仅是克里斯的追随者(类似者),还有艾米和艾米的followers和Evan,他们都收到了原始文章。
客户向发件箱
必须提供对象
活动中的属性:创建
,更新
,删除
,跟随
,添加
,删除
,喜欢
,块
,撤消(U)
.此外,客户向发件箱提交以下活动必须还提供目标
属性:添加
,删除
.
6.2创建活动
这个创建
活动在发布新对象时使用。这有一个副作用,即对象嵌入到Activity中(位于对象
属性)。
当创建
活动已发布演员
活动的应该复制到对象
的归属于
字段。
Create活动的寻址与其对象
可能会导致混淆。因此,服务器应该复制“创建”活动的所有收件人至其对象
在初始分配时,同样从中复制收件人对象
到包装上创建活动。请注意,对于对象
的寻址稍后更改而不更改创建
的寻址(例如通过更新
活动)。
6.2.1不带创建活动的对象创建
对于客户端到服务器的发布,可以为提交对象没有周围活动的创造。服务器必须接受有效的[ActivityStreams活动流]反对不是的子类型活动
在POST请求中发件箱。然后是服务器必须将此对象作为对象
的创建活动.对于非瞬态对象,服务器必须附上身份证件
到两个包装上创建
及其包裹对象
.
注释
这个位置
服务器返回的值应为的URL新的Create活动(而不是对象)。
任何到
,bto公司
,复写的副本
,密件抄送
,和观众
对象上指定的属性必须是由服务器复制到新的Create活动。
例15:目标受众对象
{“@context”:"https://www.w3.org/ns/activitystreams网站",“类型”:“备注”,“内容”:“这是一张便条”,“已发布”:“2015-02-10T15:04:55Z”,“至”: ["https://example.org/~约翰/“],“抄送”: ["https://example.com/~erik/追随者“,"https://www.w3.org/ns/activitystreams#公开"]}
上述示例可以转换为:示例16:创建服务器生成的活动包装
{“@context”:"https://www.w3.org/ns/activitystreams网站",“类型”:“创建”,“id”:"https://example.net网站/~马洛里/87374“,“演员”:"https://example.net网站/~马洛里“,“对象”: {“id”:"https://example.com/~mallory/note/72“,“类型”:“备注”,“归属于”:"https://example.net网站/~马洛里“,“内容”:“这是一张便条”,“已发布”:“2015-02-10T15:04:55Z”,“至”: ["https://example.org/~约翰/“],“抄送”: ["https://example.com/~erik/追随者“,"https://www.w3.org/ns/activitystreams#公开"]},“已发布”:“2015-02-10T15:04:55Z”,“至”: ["https://example.org/~约翰/“],“抄送”: ["https://example.com/~erik/追随者“,"https://www.w3.org/ns/activitystreams#公开"]}
6.3更新活动
这个更新
更新已存在的现有对象。这样做的副作用是对象
必须是修改以反映更新中定义的新结构活动,假设参与者有权更新此对象。
6.3.1部分更新
对于客户端到服务器的交互,更新是部分的;而不是一次更新文档,任何键值提供的对用于将现有值替换为新值。这仅适用于更新的对象。一个特殊的例外是当值为json时无效的
类型;这意味着该字段应该从服务器的对象表示中删除。
请注意,此行为用于客户端到服务器的交互,其中客户端仅向服务器发布。服务器到服务器的交互以及从服务器到客户端的更新应该包含对象的整个新表示已应用部分更新应用程序。请参阅的描述服务器到服务器的更新活动相互作用了解更多详细信息。
6.4删除活动
这个删除
活动用于删除已现有对象。这样做的副作用是服务器5月更换对象
用一个墓碑
对象的将显示在引用已删除的对象。如果请求删除的对象,服务器应该用回应如果墓碑
对象显示为响应主体,否则使用找不到HTTP 404。
已删除对象:
例17
{“@context”:"https://www.w3.org/ns/activitystreams网站",“id”:"https://example.com/~alice/note/72“,“类型”:“墓碑”,“已发布”:“2015-02-10T15:04:55Z”,“已更新”:“2015-02-10T15:04:55Z”,“已删除”:“2015-02-10T15:04:55Z”}
6.5关注活动
这个跟随
活动用于订阅另一个演员的活动。
在发件箱是服务器吗应该添加对象
到演员
的下列的
收藏当且仅当接受
活动随后进行收到此跟随
活动作为其对象。
6.6添加活动
在收到添加
活动进入发件箱,服务器应该添加对象
到中指定的集合目标
财产,除非:
- 这个
目标
不归接收方所有服务器,因此他们无权对其进行更新。
- 这个
对象
不允许添加到目标
出于其他原因,在接收服务器的酌处权。
6.7删除活动
收到后删除
活动进入发件箱,服务器应该删除对象
从中指定的集合目标
财产,除非:
- 这个
目标
不属于接收服务器,并且因此,他们无权更新它。
- 这个
对象
不允许从中删除目标
出于其他原因,在接收服务器的酌处权。
6.8类似活动
这个喜欢
活动表示演员
喜欢这个对象
.
在发件箱是服务器吗应该添加对象
到演员
的喜欢
收藏.
6.9区块活动
这个块
活动用于指示过帐actor不需要另一个actor(在对象
属性)能够与参与者发布的对象交互发布块
活动。服务器应该阻止被阻止的用户与任何对象交互由演员发布。
服务器不应该向他们的对象
.
6.10撤消活动
这个撤消(U)
activity用于撤消前一个活动。请参阅上的活动词汇文档反向活动和“撤消”.例如,撤消(U)
可用于撤消上一个喜欢
,跟随
,或块
.撤消活动和正在撤消的活动必须两者都有同一个演员。应尽可能消除副作用。例如,如果撤消喜欢
,任何有之前增加的值应适当减少。
有一些例外,其中存在一个现有的和显式的应改用“反向活动”。创建
基于的活动应改为使用删除
、和添加
活动应使用删除
.
6.11送货
联合服务器必须对发布到发件箱根据开箱交货.
7服务器到服务器的交互
服务器与其他服务器通信并跨通过向演员发布活动的社交图收件箱端点。通过网络发送的活动应该有一个身份证件
,除非它是瞬态的(在这种情况下5月省略身份证件
).
邮政
请求(例如发送到收件箱)必须内容类型为application/ld+json;profile=“https://www.w3.org/ns/activitystreams网站"
和GET(获取)
请求(另请参见3.2 检索对象) Accept标头为application/ld+json;profile=“https://www.w3.org/ns/activitystreams网站"
.服务器应该解释Content-Type或Accept页眉,共页应用程序/活动+json
等效到application/ld+json;profile=“https://www.w3.org/ns/activitystreams网站"
用于服务器到服务器的交互。
为了在整个社交图中传播更新,活动发送给相应的收件人。首先,这些收件人是通过以下方式确定的对象之间的适当链接,直到到达参与者,然后活动被插入演员的收件箱(传送).这允许收件人服务器:
- 进行与活动相关的任何副作用(例如,参与者喜欢某个对象的通知用于更新对象的相似计数);
- 将“活动”传递给原始对象的收件人,以确保更新会传播到整个社交图(请参见收件箱交货).
交付通常由以下因素触发:
服务器正在向收件箱
或共享收件箱
其他服务器上参与者的属性必须提供对象
活动中的属性:创建
,更新
,删除
,跟随
,添加
,删除
,喜欢
,块
,撤消(U)
.此外,服务器执行服务器到服务器的以下活动必须还提供目标
属性:添加
,删除
.
HTTP缓存机制[RFC7234协议]应该在以下情况下受到尊重在接收来自其他服务器的响应时都是适当的作为向其他服务器发送响应。
7.1送货
与通信的联邦服务器需要以下内容仅限其他联邦服务器。
将活动交付给其目标(即演员)首先查找目标收件箱,然后将活动发布到这些收件箱。交付目标通过检查ActivityStreams受众定位;即到
,bto公司
,复写的副本
,密件抄送
、和观众
活动的字段。
这个收件箱由第一个确定检索目标参与者的JSON-LD表示然后抬头看收件箱
属性。如果收件人是收藏
或有序集合
,然后是服务器必须取消引用集合(使用用户的凭据)并发现集合中每个项目的收件箱。服务器必须通过限制间接寻址的层数将执行的集合,其中5月成为其中之一。
服务器必须删除最终收件人列表的副本。服务器必须也从列表中排除与演员
被通知的活动。也就是说,演员不应该自己的活动交付给自己。
注释:无声和私人活动
未定义未指定收件人时的操作,但是,建议如果未指定收件人,则将对象保持完全私有,访问控制限制访问对象。如果对象刚发送到“public”集合,则对象为未交付给任何演员,但可以在演员的发件箱。
HTTP POST请求(具有提交用户的授权)是然后制作成收件箱,活动为请求的正文。此活动由接收方添加为项目
在中收件箱OrderedCollection。尝试传递到非联合服务器上的收件箱应该导致405不允许的方法
响应。
对于向第三方服务器执行交付的联邦服务器,传送应该异步执行,以及应该另外如果由于网络错误导致传递失败,请重试传递给收件人。
注:参与者之间分配的活动相同的原点可以使用任何内部机制,并且不是必需的使用HTTP。
注释:与链接数据通知的关系
虽然理解本说明书不需要阅读,值得注意的是,ActivityPub的目标定位和交付机制与链接数据通知规范,这两个规范可以互操作合并。特别是收件箱
属性之间相同ActivityPub和链接数据通知,以及目标支持本文档中描述的交付系统通过链接数据通知。除了JSON-LD压缩的ActivityStreams文档外,Linked数据通知还支持许多RDF序列化ActivityPub实现不需要。然而,ActivityPub实现希望更广泛与链接数据通知实现兼容支持其他RDF表示。
7.1.2从收件箱转发
注释:转发以避免重影回复问题
以下部分是为了缓解“重影回复”问题这有时会导致联邦网络出现问题。这个问题最好用一个例子来说明。
Alyssa发布了一篇帖子,内容是她成功地展示了在一次会议上发表论文,并将其发送给她的追随者收藏,其中包括她的朋友本。Ben回复了Alyssa的贺信,其中包括她的追随者收集收信人。然而,本无法见到艾丽莎的成员关注者集合,因此他的服务器不会转发他的消息发送到他们的收件箱。如果没有以下机制,如果艾丽莎当时回答Ben,她的追随者会看到Alyssa没有回答Ben曾见过本互动。这将非常令人困惑!
当活动在收件箱,的服务器需要将这些转发给源站无法发送的收件人将其交付给。为此,服务器必须目标和传送价值观到
,复写的副本
,和/或观众
当且仅当以下所有条件都成立时:
- 这是服务器首次看到此“活动”。
- 的值
到
,复写的副本
,和/或观众
包含服务器拥有的集合。
- 的值
inReplyTo中
,对象
,目标
和/或标签
是属于的对象服务器。服务器应该递归这些值以查找链接对象由服务器所有,以及应该设置递归的最大限制(即线索如此之深,收件人的追随者可能不会介意如果他们不再获得不直接涉及收件人)。服务器必须仅以的值为目标到
,复写的副本
,和/或观众
在转发的原始对象上,而不拾取任何新对象通过链接对象递归时的收件人(如果这些收件人是由客户或通过客户有意修改的)。
服务器5月根据以下内容筛选其交付目标特定于实现的规则(例如,垃圾邮件过滤)。
7.1.3共享收件箱传递
对于承载多个参与者的服务器,向所有关注者交付可以导致发送大量消息。一些服务器还希望显示所有消息的列表公开发布到“已知网络”。因此,ActivityPub提供了一种可选的机制来提供这些服务两个用例。
当对象被传递到原始参与者的关注者,服务器5月减少接收参与者的数量通过识别共享相同内容的所有关注者来传递给共享收件箱否则谁将是个人收件人,而不是交付要说的对象共享收件箱
.因此,在这种情况下,远程/接收服务器参与确定目标并向特定收件箱。
此外,如果对象的地址是公共特别收藏,a服务器5月将该对象传递给所有已知的共享收件箱
网络上的端点。
源服务器将公开寻址的活动发送到共享收件箱
端点必须仍向演员交付以及以其他方式处理的收款(通过到
,bto公司
,复写的副本
,密件抄送
、和观众
)没有共享收件箱
并且不会通过共享收件箱
机制。
7.2创建活动
接收创建
中的活动收件箱
有令人惊讶的是,副作用很少;活动应出现在演员的收件箱
服务器很可能需要本地存储此活动及其附带的表示对象。然而,这通常发生在处理活动中交付给收件箱
无论如何。
7.3更新活动
对于服务器到服务器的交互更新
活动表示接收服务器应该更新其副本对象
相同的身份证件
复制到副本在中提供更新
活动。与更新活动的客户端到服务器处理,这不是部分更新,而是对象的完全替换。
接收服务器必须注意确保更新
被授权修改其对象
.至少可以通过确保更新
及其对象
具有相同的起源。
7.4删除活动
收到这封信的副作用是(假设对象
由发送参与者/服务器所有)接收删除活动的服务器应该删除其表示的对象
用同样的身份证件
、和5月将该表示替换为墓碑
对象。
(请注意,活动从源传输后服务器到远程服务器,ActivityPub中没有任何内容协议可以执行远程删除对象的表示)。
7.5关注活动
在收件箱是服务器应该生成接受
或拒绝
以Follow作为对象
并将其交付给演员
的跟随。这个接受
或拒绝
5月生成自动,或5月是用户输入的结果(可能在用户审查的一些延迟)。服务器5月选择不显式发送拒绝
作为对跟随
尽管实现者应该请注意,发送请求的服务器可能位于中间状态。例如,服务器可能不会发送拒绝
以保护用户的隐私。
如果收到接受
引用此跟随
作为对象,服务器应该添加演员
到对象参与者的粉丝集合.如果是拒绝
,服务器不能添加参与者到对象参与者的粉丝集合.
注释
有时一个成功的跟随
认购可以发生,但在未来的某个时间点,交付给跟随者失败延长一段时间。实施人员应意识到没有任何保证网络上的参与者将保持联系,并且应该相应地实施。例如,如果试图向演员提供六个月后,追随者仍然无法联系到传送服务器删除订阅者是合理的来自追随者
列表。处理无法联系到的参与者的时间框架和行为是由传送服务器自行决定。
7.6接受活动
在收件箱是由的类型决定对象
收到,并且可以接受本文档中未描述的类型(例如要约
).
如果对象
的接受
接收到收件箱是一个跟随
活动之前由接收方、服务器发送应该添加演员
到接收人的以下集合.
7.7拒绝活动
在收件箱是由的类型决定对象
收到,并且可以拒绝本文档中未描述的类型(例如要约
).
如果对象
的拒绝
接收到收件箱是一个跟随
活动之前由接收方发送,这意味着接收方没有批准跟随
请求。服务器不能添加演员
到接收人的以下集合.
7.8添加活动
在收到添加
活动进入收件箱,服务器应该添加对象
到中指定的集合目标
财产,除非:
- 这个
目标
不属于接收服务器,并且因此他们无法更新它。
- 这个
对象
不允许添加到目标
出于其他原因,在接管人的自由裁量权。
7.9删除活动
收到后删除
活动进入收件箱,服务器应该删除对象
从中指定的集合目标
财产,除非:
- 这个
目标
不属于接收服务器,并且因此他们无法更新它。
- 这个
对象
不允许删除到目标
出于其他原因,在接管人的自由裁量权。
7.10类似活动
在收件箱是服务器应该将对象的赞数增加将收到的活动添加到喜欢
收集如果存在此集合。
7.11宣布活动(共享)
在收到宣布
中的活动收件箱,服务器应该增加对象的计数通过将收到的活动添加到分享
收集如果存在此集合。
注释
这个宣布
活动实际上就是众所周知的在其他社交网络中“分享”、“转发”或“提升”。
↑