ActivityPub 笔记
创始人
2024-02-17 07:39:45
0

ActivityPub 协议是一个去中心化的社交网络协议,其基于 ActivityStreams 2.0 数据格式。

在 ActivityPub 协议里,一个用户在服务器上的角色为“参与者(actor)”。用户在不同的服务器上的角色为不同的“参与者”。每一名“参与者”有:

  • 一个收件箱:用于接收消息

  • 一个发件箱:用于发送消息

例如,我在实例 A 上注册成为 251@example.com,而在另外一个实例 B 上注册成为 251@mastodon.art,虽然都是我一个人注册的,但因为在不同的实例上注册,故为不同的参与者。我分别在实例 A 与实例 B 都有一个收件箱和发件箱。而这收件箱和发件箱其实就是在 ActivityPub 参与者的 ActivityStreams 里的一个 URL。

{"@context": "https://www.w3.org/ns/activitystreams","type": "Person","id": "https://example.com/251/","name": "Kiryuu Sakuya","preferredUsername": "misaka00251","summary": "FAQ is love","inbox": "https://example.com/251/inbox/","outbox": "https://example.com/251/outbox/","followers": "https://example.com/251/followers/","following": "https://example.com/251/following/","liked": "https://example.com/251/liked/"}

正如前文说过,ActivityPub 基于 ActivityStreams 数据格式。而后者基本上概括了所有社交网络需要的活动,例如上面例子里的“粉丝”、“正在关注”、“喜欢的内容”。就算没有概括,它使用一种基于 JSON 的格式 JSON-LD。其目的既是为了可读,又方便机器处理,甚至如果你要加东西进去也很简单。

假设我现在要和 nong 哥互相隔空喊话,ActivityPub 如何帮我们做到这个?W3C 规范里有一张图:

原理

简单来说就是:

  • 用户可以使用 POST 操作来将消息发送至别人的收件箱(服务端对服务端,仅在接入网络的情况下)
  • 用户可以使用 GET 操作来从自己的收件箱获取消息(客户端对服务端,类似于读取你的社交网络数据流)
  • 用户可以使用 POST 操作来向发件箱发送消息(客户端对服务端)
  • 用户可以使用 GET 操作在对方允许的情况下来向好友的发件箱获取消息(客户端对服务端或者服务端对服务端)

我们在前文说过了,我在实例 A 上作为参与者,有一个收件箱和发件箱。那么,我首先要发送一个 ActivityStreams 对象(object):

{"@context": "https://www.w3.org/ns/activitystreams","type": "Note","to": ["https://example.org/anong/"],"attributedTo": "https://example.com/251/","content": "nong 哥,柯文哲說要競選了,妳怎麼看"}

能看得出来,这个对象(object)是要给 nong 哥的。接着,我把这个内容(object)发送(POST)到我的发件箱。

因为这是并不是一个活动(non-activity,其 type 为 note)对象(object),实例 A 意识到这是一个新被创建的对象(object),并创建一个活动(activity,其 type 为 create):

W3C 规定 ActivityStreams 有八大核心 type,以及用于社交网络而延伸的三组 type,总共四组。

  • 活动内容(Activity objects),例如 Follow 或者 Announce。一个活动是参与者所采取的举措(action)。
  • 参与者内容(Actor objects),例如 Person 或者 Group。参与者通常进行创造内容以及关注等活动。
  • 对象类型(Object types),例如 Note 或者 Video。这些对象类型通常代表着某种内容。
  • 集合内容(Collection objects)。这些是其他对象的分组或者列表,例如某个人的粉丝列表或者一串公共帖子的列表。

虽然 create 是活动内容里面的,但 note 不属于,这么理解即可。

{"@context": "https://www.w3.org/ns/activitystreams","type": "Create","id": "https://example.com/251/posts/9f905da5-ce8e-4b9e-a76a-8ef4b1dacc98","to": ["https://example.org/anong/"],"actor": "https://example.com/251/","object": {"type": "Note","id": "https://example.com/251/posts/9f905da5-ce8e-4b9e-a76a-8ef4b1dacc98","attributedTo": "https://example.com/251/","to": ["https://example.org/anong/"],"content": "nong 哥,柯文哲說要競選了,妳怎麼看"}}

然后,实例 A 就通过 ActivityStreams 查看 nong 哥 的”参与者”(actor object),找到他的收件箱,然后发送(POST)创建的这个对象(object)给他。技术上来说,这分了两个步骤,一个是客户端到服务器的通讯,一个是服务器与服务器之间的通讯(组成联盟)。这个例子里我们都用了,所以我们可以把整个过程抽象的理解成是我的发件箱 –> nong 哥的发件箱。过了一会,我想看他收到了什么新消息,于是他的客户端开始获取(GET)操作,除了其他人发的沙雕图片和视频以外,还有这样一条消息:

{"@context": "https://www.w3.org/ns/activitystreams","type": "Create","id": "https://example.org/anong/p/114514","to": ["https://example.com/251/"],"actor": "https://example.org/anong/","object": {"type": "Note","id": "https://example.org/anong/p/114513","attributedTo": "https://chatty.example/ben/","to": ["https://example.com/251/"],"inReplyTo": "https://example.com/251/posts/9f905da5-ce8e-4b9e-a76a-8ef4b1dacc98","content": "

幹 還敢釣R

"}}

我收到消息之后,喜欢了这个 post:

{"@context": "https://www.w3.org/ns/activitystreams","type": "Like","id": "https://example.com/251/posts/e6dc43cb-f95e-4a26-8e41-ea9a5e77d0f8","to": ["https://example.org/anong/"],"actor": "https://example.com/251/","object": "https://example.org/anong/p/114514"}

当然,我把这个对象(object)发送(POST)到我了的发件箱。因为这是一个活动(activity, 其 type 为 Like),实例 A 就不需要重新包装,可以直接发送出去。Like 是属于 Activity Types 里面的。最后,我给我的粉丝们发送了一条公共消息。因为是公共消息,所以不仅粉丝们可以收到,任何人原则上也可以看到。

{"@context": "https://www.w3.org/ns/activitystreams","type": "Create","id": "https://example.com/251/posts/30c68a4e-f3a8-483a-ae39-2618fcfc31fb","to": ["https://example.com/251/followers/","https://www.w3.org/ns/activitystreams#Public"],"actor": "https://social.example/alyssa/","object": {"type": "Note","id": "https://example.com/251/posts/30c68a4e-f3a8-483a-ae39-2618fcfc31fb","attributedTo": "https://example.com/251/","to": ["https://example.com/251/followers/","https://www.w3.org/ns/activitystreams#Public"],"content": "還是被發現了,哭哭"}}

以上就是一个很简单的例子了。我们通常说,某人(Somebody)对某个对象(object)做了什么(something);在 ActivityPub 里则是说是某个参与者(actor)在对一个对象(object)执行一个活动(activity)。

参考资料

  • https://www.w3.org/TR/activitypub/
  • https://www.w3.org/TR/activitystreams-core/
  • https://www.w3.org/TR/activitystreams-vocabulary/

相关内容

热门资讯

解读中央经济工作会议精神⑥丨以... ■ 中国经济时报记者 王晶晶 2025年中央经济工作会议把“坚持对外开放,推动多领域合作共赢”确定为...
首次!澳门法律专业社团在内地设... 日前,澳门法律交流协进会广东代表处在横琴琴澳国际法务集聚区揭牌成立。这是澳门首个法律专业社团在内地设...
纠纷化解“只进一扇门” 近日,柯某某等一行11人来到芜湖市弋江区综治中心,反映辖区某项目拖欠工资问题。经初步了解,柯某某等人...
原创 海... 未查获现货但有证据证明的走私货物如何认定走私数额? 2021年10月起,钟某向陈某1、王某1(以上...
最高法:密切关注《检察公益诉讼... 12月22日,最高人民法院举行新闻发布会,发布第三批行政公益诉讼典型案例。 最高人民法院审判委员会委...
船营法院:破解金融纠纷 护航营... 今年以来,吉林市船营区人民法院立足辖区内市级金融机构密集、大额金融合同集中的地域特点,牢牢坚守“强制...
中国拟立法规定南极考察、旅游、... 中新网北京12月22日电 (记者 谢雁冰 郭超凯)南极活动与环境保护法草案22日提请十四届全国人大常...
信用修复!央行发布最新政策 22日,中国人民银行发布通知,实施一次性信用修复政策,支持信用受损但积极还款的个人高效便捷重塑信用。...
法规洞察 | 欧盟GMP无菌附... 污染控制策略(Contamination Control Strategy,CCS)是欧盟GMP无菌...
人大常委会丨拟写入法律!网络游... 新华社北京12月22日电(记者魏冠宇)十四届全国人大常委会第十九次会议12月22日继续审议国家通用语...