在 Dweb 系列文章中,我们将介绍一些探索去中心化或分布式网络潜力的项目。这些项目与 Mozilla 无关,其中一些项目重新定义了我们对网络浏览器的看法。他们拥有一个共同点:这些项目都是开源的,并且开放参与,他们与 Mozilla 的使命一致,即保持网络对所有人开放和可访问。
社交网站最初让我们在线与朋友聊天和分享,然后变成了回声室内容孤岛,最后以成熟的状态出现,成为由我们日常在线生活的排泄物驱动的监控资本主义巨头。尾巴不仅在摇动狗,它正在扼杀它。然而,可能存在一种向前发展的道路,将用户重新置于驾驶席:一套用于在网络上对社交活动进行去中心化的新规范。今天,你将从著名机器人制造者和 Mozilla 研究员 Darius Kazemi 那里获得进入那个世界的帮助。
– Dietrich Ayala
介绍 ActivityPub
大家好,我是 Darius Kazemi。我是 Mozilla 研究员,也是去中心化网络的爱好者。在过去的一年里,我对 ActivityPub 越来越感兴趣,这是一个 W3C 标准协议,它描述了不同社交网络站点(定义比较宽泛)之间相互通信和交互的方式。你可能还记得 RSS 的鼎盛时期,当时用户可以从任意数量的独立开发的阅读器订阅世界上几乎所有的内容提要。ActivityPub 旨在为社交网络互动做 RSS 为内容做的事情。
架构
ActivityPub 允许建立去中心化的社交网络,其中服务器网络代表个人用户/客户端相互交互,与电子邮件在宏观层面的运作方式非常相似。在符合 ActivityPub 的服务器上,单个用户帐户拥有一个收件箱和一个发件箱,它们通过 API 端点接受 HTTP GET 和 POST 请求。它们通常位于类似 https://social.example/users/dariusk/inbox
和 https://social.example/users/dariusk/outbox
的地方,但只要它们位于有效的 URI,它们实际上可以位于任何地方。单个用户由 Actor 对象表示,这只是一个 JSON-LD 文件,它提供了诸如用户名和收件箱和发件箱位置之类的信息,以便你可以与 Actor 交谈。代表 Actor 发送的每条消息都包含指向 Actor 的 JSON-LD 文件的链接,因此任何收到消息的人都可以查找所有相关信息并开始与他们交互。
一个简单的服务器用于发送 ActivityPub 消息
使用 ActivityPub 的最受欢迎的社交网络站点之一是 Mastodon,这是一个开源的社区所有并无广告的社交网络服务替代品,类似于 Twitter。但 Mastodon 是一个庞大而复杂的项目,对于开发者来说,它不是 ActivityPub 规范的最佳介绍。因此,我从 Eugen Rochko 撰写的一篇教程 开始(Mastodon 的主要开发者)并使用 Node.js 和 Express.js 创建了一个部分参考实现,称为 Express ActivityPub 服务器。
该软件的目的是为希望构建自己的 ActivityPub 应用程序的开发者提供最简单的起点。我选择了在我看来最小的有用 ActivityPub 功能子集:发布任何 ActivityPub 用户都可以订阅的符合 ActivityPub 的帖子提要的能力。具体来说,这对发布信息提要的非交互式机器人很有用。
要在本地开发环境中开始使用 Express ActivityPub 服务器,请安装
git clone https://github.com/dariusk/express-activitypub.git
cd express-activitypub/
npm i
为了真正测试服务器,它需要与有效的、启用 https 的域名或子域名关联。对于本地测试,我喜欢使用 ngrok 在他们提供的临时域名之一上进行测试。首先,使用他们的说明安装 ngrok(你必须登录,但有一个免费层级足以进行本地调试)。接下来,运行
ngrok http 3000
这将在你的控制台中显示一个屏幕,其中包含一个类似 abcdef.ngrok.io
的域名。务必记下它,因为它将在 ngrok 运行期间充当你的临时测试域名。在执行其他所有操作时,将它保持在自己的终端会话中运行。
然后转到 express-activitypub
目录中的 config.json
并将 DOMAIN
字段更新为 ngrok 给你的任何 abcdef.ngrok.io
域名(不要包含 http://
),并将 USER
更新为某些用户名,并将 PASS
更新为某些密码。这些将是服务器上创建新用户所需的管理员密码。当通过 ngrok 在本地进行测试时,你不需要指定 PRIVKEY_PATH
或 CERT_PATH
。
接下来运行你的服务器
node index.js
转到 https://abcdef.ngrok.io/admin(同样,替换子域名),你应该会看到一个管理员页面。你可以在这里创建一个帐户,方法是为它提供一个名称,然后在提示时输入管理员用户名/密码。尝试创建一个名为“test”的帐户 - 它会给你一个很长的 API 密钥,你应该将其保存到某个地方。然后打开一个 ActivityPub 客户端,例如 Mastodon 的 Web 界面,并尝试关注 @test@abcdef.ngrok.io
。它应该找到帐户并让你关注!
回到管理员页面,你会注意到另一个部分叫做“发送消息给关注者” - 在其中填写“test”作为用户名,你刚刚记下的十六进制密钥作为密码,然后输入一条消息。它应该看起来像这样

表单截图
点击“发送消息”,然后检查你的 ActivityPub 客户端。在你主时间轴上,你应该会看到来自你帐户的消息,如下所示

Mastodon 移动 Web 视图中的帖子
就是这样!它本身并不十分有用,但你可以 fork 存储库并将其用作构建自己服务的起点。例如,我将其用作 我编写的 RSS 到 ActivityPub 转换服务的基石(源代码在这里)。当然,可以使用它构建其他服务。例如,想象一下,你可以订阅你最喜欢的乐队的更新以替代类似 MailChimp 的东西,但与接收电子邮件不同,所有关注 ActivityPub 帐户的人都会收到带有专辑发行信息的直接消息。此外,值得浏览预定义的 Activity Streams 词汇,看看规范默认支持哪些事件类型。
了解更多
ActivityPub 比我在这里介绍的要复杂得多,不幸的是,除了规范本身和各种问题跟踪器上的对话之外,没有太多学习资源。
如果你想了解更多关于 ActivityPub 的信息,当然可以 阅读 ActivityPub 规范。重要的是要知道,虽然 ActivityPub 规范规定了消息的发送和接收方式,但不同类型消息的定义在 Activity Streams 2.0 规范 中,而发送消息的实际格式在 Activity Streams 词汇 规范中定义。熟悉这三者非常重要。
你可以加入 社交网络孵化器社区小组,这是一个 W3C 社区小组,参与有关 ActivityPub 和其他社交网络技术标准的讨论。他们每月都会举行会议,你可以拨打电话参加会议,这些会议列在维基页面上。
当然,如果你正在使用像 Mastodon 这样的 ActivityPub 社交网络服务或 Pleroma,那么那里的 #ActivityPub 标签始终处于活跃状态。
关于 Darius Kazemi
Darius Kazemi 是 2018-2019 年的 Mozilla 研究员,与科学与社会代码合作进行 Dat 项目。他在 Tiny Subversions 的名义下创作互联网艺术,并且十多年来一直为开源项目贡献力量。
一条评论