ActivityPub 笔记

news2025/7/4 23:45:26

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": "<p>幹 還敢釣R</p>"}}

我收到消息之后,喜欢了这个 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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37277.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LSTM和GRU

LSTM和GRU RNN的优缺点 优点&#xff1a; 可以捕获序列之间的关系&#xff1b;共享参数。 缺点&#xff1a; 存在梯度消失和梯度爆炸问题&#xff1b;RNN的训练是一个比较困难的任务&#xff1b;无法处理长序列问题。 LSTM LSTM可以处理长序列问题&#xff0c;同样在之前…

openssl做文件处理(base64,MD5,sha256等)

这次使用openssl&#xff0c;发现openssl不仅可以用来做加密和解密&#xff0c;实际上也可以用来做文件的处理&#xff0c;比如base64转码、解码&#xff0c;文件md5的计算等。实现这些&#xff0c;即可以从命令行去做&#xff0c;也可以通过代码去实现。 1. 命令行操作 1. ba…

【ML特征工程】第 5 章 :分类变量:机器鸡时代的鸡蛋计数

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

想做副业没有方向,这三条告诉你什么是副业思维

怎样副业赚钱&#xff1f;教你几招&#xff0c;掌控自己的固有思维 你了解钱是怎么来的吗&#xff1f;你如果弄不懂这一点&#xff0c;你也是很难赚到钱的。 钱不是苦的&#xff0c;辛苦努力挣的基本都是一点钱。 假如将你的工作时长换为钱&#xff0c;你可以清晰地赚多少钱…

Java并发-线程上下文切换与死锁

理解线程的上下文切换 概述&#xff1a;在多线程编程中&#xff0c;线程个数一般都大于 CPU 个数&#xff0c;而每个 CPU 同一时&#xff0d;刻只能被一个线程使用&#xff0c;为了让用户感觉多个线程是在同时执行的&#xff0c; CPU 资源的分配采用了时间片轮转的策略&#x…

javacc之路0--- 安装与使用

官网&#xff1a; https://javacc.github.io/javacc/ https://github.com/javacc/javacc#getting-started 安装 下载解压 执行&#xff1a; mvn package 将 javacc-7.0.10.jar 重命名为 javacc.jar 并将目录下的scripts文件夹加入到环境变量中。 执行javacc命令验证是否成功…

【Qt 按钮】QPushButton所有函数和样式

【Qt 按钮】QPushButton所有函数和样式一、QSS语句 &#xff08;界面样式大全&#xff09;二、 构造函数三、Geometry &#xff08;获取属性&#xff09;四、 QFont五、setFont六、text七、setText八、move九、resize十、adjustSize[按钮自动适应文本大小]十一、setFocus十二、…

【附源码】计算机毕业设计JAVA预约健身私教网站

【附源码】计算机毕业设计JAVA预约健身私教网站 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA my…

开发人员为什么要写测试用例?

作为一名开发人员&#xff0c;你可能会发现周围的开发并不太喜欢写测试用例&#xff0c;甚至有些同学根本不写测试用例&#xff0c;认为写测试用例完全是浪费时间&#xff0c;或者是测试用例只是测试的事情。 在开发过程中&#xff0c;往往都是呼啦啦的写完代码&#xff0c;然后…

【负荷预测、电价预测】基于神经网络的负荷预测和价格预测附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

别人熬夜看世界杯 我熬夜改代码 你满意了

2022年卡塔尔世界杯正如火如荼地进行着&#xff0c; 一边是热火朝天的比赛&#xff0c;一边是让人惊掉下巴的爆冷结局&#xff0c; 但正因为这些不确定因素&#xff0c;反倒让世界杯增添了几分魅力和乐趣&#xff01; 小编在看球赛的过程中&#xff0c;不禁起了联想&#xff…

Django+Vue中文件的上传和下载

场景&#xff1a;上传一个源数据Excel文件&#xff0c;然后根据数据处理生成另外一个Excel文件并支持下载 Django&#xff1a; 1.首先在Django的settings.py文件中增加配置 MEDIA_URL /media/ MEDIA_ROOT os.path.join(BASE_DIR, media)2.项目的urls.py中增加 url(r^medi…

环境主题静态HTML网页作业作品 大学生环保网页设计制作成品 简单DIV CSS布局网站

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

百度智能云与实体经济“双向奔赴”: 一场1+1>2的双赢

实体经济&#xff0c;已经成为检验科技企业潜力的试金石。 在最近的财报季中&#xff0c;各家大厂的财报里“实体经济”都是关键字眼&#xff0c;已经成为各家心照不宣的共同目的地。 当然&#xff0c;条条大路通罗马。每一家的战略思路和打法都不一样。11月22日&#xff0c;…

Centos7下新硬盘的挂载操作

1、查看当前硬盘使用情况 df -h 2、 查看磁盘分配情况 fdisk -l 如图所示 vdb 磁盘 还未被使用&#xff0c;现在开始分配。 3、 磁盘分配 使用m查看详细命令&#xff0c;n添加一块新分区&#xff0c;默认最多只能有四个主分区&#xff0c;但可以通过设置将第…

Web前端开发技术课程大作业,期末考试HTML+CSS+JavaScript电竞游戏介绍网站

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

SpringCloudAlibaba全网最全讲解5️⃣之Feign(建议收藏)

&#x1f308;专栏简介 感谢阅读&#xff0c;希望能对你有所帮助&#xff0c;博文若有瑕疵请在评论区留言或在主页个人介绍中添加我私聊我,感谢每一位小伙伴不吝赐教。我是XiaoLin&#xff0c;既会写bug也会唱rap的男孩&#xff0c;这个专栏主要是介绍目前微服务最主流的解决方…

4 款适用于 Windows 的最佳免费 GIS 软件

GIS 代表地理信息系统&#xff0c;用于分析、存储、操作和可视化地图上的地理信息。GIS是一种应用广泛的软件&#xff0c;在农业、天文、考古、建筑、银行、航空等各个领域都有应用。开始这些项目&#xff0c;需要 shapefile。一些网站提供不同国家的免费 shapefile。下载免费 …

软件测试入门+面试点

前言&#xff1a;大约是2022年11月18日&#xff0c;我想学习软件测试&#xff0c;在此之前我是Java路线的&#xff0c;这不大环境的竞争激烈在加上自身的能力分析&#xff0c;我认为测试可能是我找工作路上的救赎之光&#xff0c;又恰逢这个时间点&#xff0c;留给我的时间不多…

python实现综合评价模型TOPSIS

原文&#xff1a;https://mp.weixin.qq.com/s/J9fZQ8T9TR1Ed7taPGYYjw 1 TOPSIS简介 有关综合评价的方法有多种&#xff0c; 根据赋权方法不同主要有两类&#xff1a;一类是主观赋值法&#xff0c; 如指数法、层次分析法、模糊综合评价法等&#xff1b;另一类是客观赋值法&am…