Sharkey 是一个基于 Misskey 的 Fediverse 社交平台 fork,它提供了强大的导入功能,支持从多个平台迁移帖子(notes)。这包括 Fediverse 生态中的 Mastodon、Pleroma、Akkoma(Pleroma 分支)、Misskey、Firefish(Misskey 分支)及其各种 forks,还扩展支持 Instagram、X(前 Twitter)和 Facebook 的数据导入。这些功能通过上传 ZIP 档案或 JSON 文件实现,Sharkey 会自动解析、上传媒体并创建本地帖子。

本文将详细介绍每个平台的数据导出方法ZIP/JSON 结构调整(基于Sharkey 导入功能源代码逻辑,确保兼容)和导入步骤。导入过程是异步的,可能需几分钟到几小时,完成后帖子会保留原时间戳,但仅本地可见(不联邦)。贴子过多时建议从小档案测试,避免服务器负载过高。

注意:Sharkey 的导入依赖 Drive 文件夹(如 “Imports” 和平台专用文件夹)。如果失败,检查日志(docker logs sharkey-web-1 | grep import)。

1. Fediverse 平台:Mastodon、Pleroma、Akkoma 及其 Forks

这些平台使用 ActivityPub 协议,导出档案为 ZIP 格式,包含 outbox.json(帖子列表)。Sharkey 通过检查 outbox.json@context(Pleroma/Akkoma 特定)区分类型。

数据导出

  • Mastodon:登录 > 偏好设置 > 导入与导出 > “请求你的档案” > 下载你的存档。
  • Pleroma/Akkoma:设置 > 管理 > 导出数据 > 下载 ZIP(包含 outbox.json)。
  • Forks(如 Glitch-Soc Mastodon fork):类似 Mastodon 导出。
  • 提示:选择“所有时间”,备份媒体文件夹。

ZIP 结构调整

Sharkey 期望根目录有 outbox.jsonactor.json。标准导出通常兼容,但如果媒体路径不对,重命名:

  • 根目录:outbox.json(帖子数组,包含 object.idobject.inReplyTo)。
  • actor.json(用户元数据,Pleroma/Akkoma 有 @context 包含 “litepub”)。
  • 媒体:media_attachments/files/(上传到 “Mastodon” 或 “Pleroma” Drive 文件夹)。
  • 调整示例
    • 如果媒体在 attachments/,重命名为 media_attachments/files/
    • ZIP 打包:zip -r mastodon_import.zip outbox.json actor.json media_attachments/(保留结构)。

导入步骤

  1. Sharkey 设置 > 账户数据 > 所有贴子 > 导入(选择 “Mastodon” 或自动检测)。
  2. 确认:Sharkey 解压,重建回复链(用 recreateChain 方法,按 ID/inReplyTo)。
  3. 等待:媒体上传到 Drive “Mastodon”/“Pleroma” 文件夹,帖子创建(visibility 基于 to/cc)。
  4. 检查:时间线刷新;日志显示 “Starting note import” 和 “Import jobs created”。

兼容性:Akkoma 作为 Pleroma fork,使用相同逻辑(检查 @context 中的 litepub)。Forks 如 Soapbox (Pleroma) 通常兼容。

2. Misskey、Firefish 及其 Forks

Misskey 和 Firefish(Misskey fork)导出为 JSON 文件(notes-*.json),Sharkey 直接解析,无需 ZIP。

数据导出

  • Misskey/Firefish:设置 > 导入/导出 > “导出笔记” > 下载 JSON(notes.json,包含 id、text、replyId、files)。
  • Forks(如 Iceshrimp):类似 Misskey 导出。
  • 提示:导出所有笔记,包含附件 URL。

文件结构调整

Sharkey 期望 JSON 数组,格式 { id, text, replyId, createdAt, files: [] }。标准导出兼容,但如果文件 URL 无效,重命名:

  • 文件名:notes-username.json(根目录)。
  • 媒体:files 数组中的 URL(Sharkey 下载到 “Misskey” Drive 文件夹)。
  • 调整示例:如果 JSON 太大,分拆为小文件(每个 <1MB),或用文本编辑器修复无效 URL。

导入步骤

  1. Sharkey 设置 > 账户数据 > 所有贴子 > 导入 > 上传 JSON(选择 “Misskey/Firefish”)。
  2. 确认:解析 notes,重建回复链(用 id/replyId)。
  3. 等待:下载附件到 Drive “Misskey” 文件夹,创建帖子(cw、visibility 保留)。
  4. 检查:时间线;日志 “Import jobs created”。

兼容性:Firefish/Iceshrimp forks 使用相同 JSON 格式,无需调整。

3. Instagram

Sharkey 支持实验性 Instagram 导入,解析帖子文本/媒体,但需特定路径。

数据导出

  • Instagram 设置 > 账户中心 > 你的信息和权限 > 下载你的信息 > 选择 “帖子” > JSON 格式 > 请求下载(需 1-48 小时,邮件通知 ZIP)。

ZIP 结构调整

Sharkey 检查 instagram_liveinstagram_ads_and_businesses 确认类型,读取 content/posts_1.json(帖子数组)和 media/posts/(媒体)。标准 ZIP 无这些路径,重命名:

  • content/posts_1.jsonyour_instagram_activity/accounts/activity/posts/media.json(帖子:title、creation_timestamp、media.uri)。
  • media/posts/media/(媒体文件夹,按 ID)。
  • 调整示例
    • 创建 content/ 文件夹,放重命名 JSON。
    • 创建 media/posts/,复制媒体子文件夹。
    • ZIP:zip -r ig_import.zip content/ media/posts/(添加空 instagram_ads_and_businesses/ 以触发检测)。

导入步骤

  1. Sharkey 设置 > 账户数据 > 所有贴子 > 导入 > Instagram > 上传调整后的 ZIP。
  2. 确认:解压,上传媒体到 “Instagram” Drive 文件夹。
  3. 等待:队列 ImportIGToDbJob 处理帖子(decodeIGString 解码标题,时间戳 *1000 转为 Date)。
  4. 检查:时间线;日志 “createImportIGToDbJob”。

提示:多媒体帖子用 media 数组;失败常见于路径错。

4. X (前 Twitter)

Sharkey 解析 Twitter ZIP 的 data/tweets.js,重建回复链。

数据导出

  • X 设置 > 你的账户 > 下载 X 数据存档 > 请求档案(需几天,邮件 ZIP)。

ZIP 结构调整

标准 ZIP 兼容,但确保:

  • 根目录:data/tweets.js(JS 格式推文数组)。
  • 媒体:extended_entities.media URL(Sharkey 下载)。
  • 调整示例:如果 JS 损坏,用编辑器修复;ZIP 打包保持 data/ 结构。

导入步骤

  1. Sharkey 设置 > 账户数据 > 所有贴子 > 导入 > Twitter > 上传 ZIP。
  2. 确认:解压,解析 tweets.js(移除 window.YTD 包装)。
  3. 等待:重建链(id_str/in_reply_to_status_id_str),文本替换(URL/mentions 为 Markdown),媒体下载到 “Twitter” Drive。
  4. 检查:时间线(递归创建回复);日志 “parseTwitterFile” 和 “processTwitterDb”。

提示:视频用 mp4 变体;重复媒体跳过。

5. Facebook

Sharkey 解析 Facebook ZIP 的帖子 JSON,解码字符串。

数据导出

  • Facebook 设置 > 账户中心 > 你的信息和权限 > 下载你的信息 > 选择 “帖子” > JSON > 请求下载(需 1-14 天,ZIP)。

ZIP 结构调整

Sharkey 读取 your_activity_across_facebook/posts/your_posts__check_ins__photos_and_videos_1.jsonmedia/。标准 ZIP 兼容,但重命名:

  • your_activity_across_facebook/posts/your_posts_1.jsonposts/your_posts_1.json(帖子:timestamp、data.post)。
  • your_activity_across_facebook/posts/media/posts/media/(附件)。
  • 调整示例:创建 your_activity_across_facebook/posts/,放重命名文件;ZIP 保持结构。

导入步骤

  1. Sharkey 设置 > 账户数据 > 所有贴子 > 导入 > Facebook > 上传 ZIP。
  2. 确认:解压,上传媒体到 “Facebook” Drive。
  3. 等待:队列 ImportFBToDbJob 处理(decodeFBString 解码标题,attachments.data.media)。
  4. 检查:时间线;日志 “processFBDb”。

提示:attachments 数组处理多媒体;check-ins/照片优先。

注意事项与故障排除

  • 通用:备份数据;小档案测试(<100 帖子);重启容器刷新队列。
  • 常见错误:路径不匹配(日志 “ENOENT”)—调整 ZIP;解析失败(“malformed file”)—检查 JSON 有效性。
  • 性能:大档案慢(>1000 帖子),分批;媒体下载超时(config.import.downloadTimeout)。
  • 源代码洞见:导入用 BullMQ 队列(process/job),媒体用 driveService.addFile,帖子用 noteCreateService.import(保留 createdAt)。
  • 社区:查 Sharkey GitHub issues 或 Reddit r/fediverse 求助。

通过这些步骤,你能顺利迁移帖子到 Sharkey,享受 Fediverse !如果有叙述错误,欢迎评论指出。