1. 实现原理
每个博客(A 和 B)提供一个 API 接口,用于接收对方博客发来的文章。
- 当 A 发布新文章时,调用 B 的 API 接口,将文章发布到 B 博客。
- 当 B 发布新文章时,调用 A 的 API 接口,将文章发布到 A 博客。
- 双方通过注册为对方的用户,获得发文权限,但不会共享管理员账号。
2. 实现步骤
步骤 1:在 A 和 B 博客中创建 API 接口
每个博客需要创建一个 API 接口,用于接收对方发来的文章。
A 博客的 API 接口示例代码:
<?php
if (!defined('__TYPECHO_ROOT_DIR__')) exit;
// 接收文章数据
$input = file_get_contents('php://input');
$data = json_decode($input, true);
// 验证请求(可选)
$token = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
if ($token !== '你的API密钥') {
header('HTTP/1.1 401 Unauthorized');
exit;
}
// 插入文章
$db = Typecho_Db::get();
$insert = $db->insert('table.contents')
->rows([
'title' => $data['title'],
'slug' => $data['slug'],
'created' => time(),
'modified' => time(),
'text' => $data['content'],
'authorId' => $data['authorId'], // 对方的用户 ID
'type' => 'post',
'status' => 'publish',
'commentsNum' => 0,
'allowComment' => 1,
'allowPing' => 1,
'allowFeed' => 1
]);
$db->query($insert);
// 返回成功响应
header('Content-Type: application/json');
echo json_encode(['status' => 'success']);
步骤 2:在 A 和 B 博客中注册为对方的用户
在 A 博客中注册 B 博客的管理员账号为一个普通用户,记录其用户 ID。
在 B 博客中注册 A 博客的管理员账号为一个普通用户,记录其用户 ID。
步骤 3:在 A 和 B 博客中开发文章同步功能
当 A 发布新文章时,调用 B 的 API 接口;当 B 发布新文章时,调用 A 的 API 接口。
A 博客的同步代码:
function syncPostToBlogB($post) {
// B 博客的 API 地址
$url = 'https://B博客地址/api/sync-post';
// 文章数据
$data = [
'title' => $post['title'],
'slug' => $post['slug'],
'content' => $post['text'],
'authorId' => 'B博客中A的用户ID' // A 在 B 博客中的用户 ID
];
// 发送 HTTP 请求
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: 你的API密钥'
]);
$response = curl_exec($ch);
curl_close($ch);
// 记录日志(可选)
file_put_contents(__TYPECHO_ROOT_DIR__ . '/usr/plugins/SyncToBlogB/log.txt', $response . PHP_EOL, FILE_APPEND);
}
B 博客的同步代码:
代码与 A 博客类似,只需修改 API 地址和用户 ID。
步骤 4:挂载文章发布事件
在 A 和 B 博客中,挂载文章发布事件,调用同步函数。
A 博客的挂载代码:
Typecho_Plugin::factory('Widget_Contents_Post_Edit')->finishPublish = array('SyncToBlogB_Plugin', 'syncPostToBlogB');
B 博客的挂载代码:
Typecho_Plugin::factory('Widget_Contents_Post_Edit')->finishPublish = array('SyncToBlogA_Plugin', 'syncPostToBlogA');
3. 测试同步功能
- 在 A 博客发布一篇文章,检查是否同步到 B 博客。
- 在 B 博客发布一篇文章,检查是否同步到 A 博客。
- 确保双方原有的文章不受影响。
注意事项
- API 安全性:使用 HTTPS 加密传输数据,并在 API 接口中添加身份验证(如 API 密钥)。
- 用户权限:确保对方用户只能发布文章,不能修改或删除其他文章。
- 文章格式:确保文章内容格式兼容(如 Markdown 或 HTML)。
- 性能优化:如果文章数量较多,可以增加错误重试机制和日志记录。
更多技术分享和实用教程,欢迎访问我的博客:6v6 博客,一起探索技术的无限可能!