Hoạt động của mạng xã hội phi tập trung dựa trên giao thức ActivityPub đang ngày càng phổ biến. Bài viết này sẽ hướng dẫn bạn từng bước xây dựng một ứng dụng xã hội phi tập trung từ đầu.
Cấu trúc Cơ Bản của ActivityPub
ActivityPub sử dụng hai giao thức chính để hoạt động:
- Giao thức Client-to-Server
- Giao thức Server-to-Server
| Tính Năng | Hệ Thống Truyền Thống | Hệ Thống Phi Tập Trung |
|---|---|---|
| Lưu trữ Dữ Liệu | Cơ sở dữ liệu tập trung | Các nút lưu trữ phân tán |
| Quản Lý Danh Tính | Hệ thống tài khoản của nền tảng | URI danh tính đa nền tảng |
| Phân Phối Nội Dung | Đẩy nội dung trong nền tảng | Tự động đồng bộ giữa các máy chủ liên minh |
Mô Hình Dữ Liệu Cơ Bản
Dưới đây là một ví dụ về cấu trúc đối tượng cơ bản trong ActivityPub:
<code>{
"@context": "http://www.w3.org/ns/activitystreams",
"id": "https://example.vn/notes/456",
"type": "Note",
"content": "Đây là một bài viết bằng tiếng Việt!",
"published": "2025-09-10T08:30:00Z",
"attributedTo": "https://example.vn/users/quang"
}</code>
Thiết Lập Môi Trường Phát Triển
Bắt đầu bằng cách cài đặt các thư viện cần thiết:
<code># Cài đặt Node.js và các phụ thuộc npm install express body-parser jsonwebtoken</code>
Sau đó, tạo một server cơ bản:
<code>const express = require('express');
const app = express();
app.use(express.json());
// Endpoint người dùng
app.get('/users/quang', (req, res) => {
res.json({
"@context": ["http://www.w3.org/ns/activitystreams", "http://www.w3.org/ns/activitypub"],
"id": "https://example.vn/users/quang",
"type": "Person",
"preferredUsername": "quang",
"name": "Quang Nguyen",
"inbox": "https://example.vn/users/quang/inbox",
"outbox": "https://example.vn/users/quang/outbox"
});
});
// Endpoint nhận hộp thư đến
app.post('/users/quang/inbox', (req, res) => {
const activity = req.body;
console.log(`Nhận được hoạt động mới: ${activity.type} từ ${activity.actor}`);
// Thực hiện logic xác thực, loại bỏ trùng lặp và lưu trữ hoạt động
res.status(202).send(); // Chấp nhận hoạt động
});
app.listen(3000, () => console.log('Máy chủ ActivityPub đang chạy tại cổng 3000'));</code>
Xử Lý Các Hoạt Động Cơ Bản
Hoạt Động Đăng Bài Viết (Create)
Ví dụ yêu cầu gửi lên server:
<code>POST /users/quang/outbox HTTP/1.1
Host: example.vn
Content-Type: application/activity+json
{
"@context": "http://www.w3.org/ns/activitystreams",
"type": "Create",
"actor": "https://example.vn/users/quang",
"object": {
"type": "Note",
"content": "Bài viết đầu tiên của tôi bằng ActivityPub! 🎉",
"to": ["http://www.w3.org/ns/activitystreams#Public"]
}
}</code>
Phản hồi từ server:
<code>HTTP/1.1 201 Created
Content-Type: application/activity+json
{
"@context": "http://www.w3.org/ns/activitystreams",
"type": "Create",
"id": "https://example.vn/activities/1628459372154",
"actor": "https://example.vn/users/quang",
"published": "2025-09-10T09:49:32Z",
"object": {
"type": "Note",
"id": "https://example.vn/notes/1628459372154",
"content": "Bài viết đầu tiên của tôi bằng ActivityPub! 🎉",
"published": "2025-09-10T09:49:32Z",
"attributedTo": "https://example.vn/users/quang",
"to": ["http://www.w3.org/ns/activitystreams#Public"]
}
}</code>
Theo Dõi Người Khác (Follow)
Yêu cầu theo dõi:
<code>{
"@context": "http://www.w3.org/ns/activitystreams",
"type": "Follow",
"actor": "https://gamecorp.vn/people/tuan/",
"object": "https://gamecorp.vn/people/minh/",
"to": ["https://gamecorp.vn/people/minh/"]
}</code>
Quy trình xử lý yêu cầu này bao gồm việc xác thực, thêm vào danh sách người theo dõi và có thể thông báo cho người bị theo dõi.
Kết Luận
ActivityPub mở ra nhiều khả năng cho các ứng dụng xã hội phi tập trung. Bằng cách hiểu và triển khai các giao thức này, bạn có thể xây dựng các ứng dụng mạnh mẽ và linh hoạt hơn.