我没有 mbox 文件,也不知道如何获取它们——雅虎肯定不会允许我下载它们。您知道有什么工具可以将 JSON 转换为 mbox 吗?谷歌显示了一些反向转换的工具,但我没看到有什么能快速完成这个任务的。
我原本以为,既然已经有专门设计用于迁移雅虎小组的脚本,这些脚本应该能真正起作用,那将是最直接完成任务的方法。看来我的期望过于乐观了——这些脚本“起作用”了,它们迁移了消息,也大致迁移了用户,但遗漏了大部分电子邮件地址,并将大部分消息分配给了错误的用户,这确实是个问题。
让我感到沮丧的是,这似乎对真正懂一点 Ruby 的人来说应该是一个微不足道的修复——但不幸的是,我不是这样的人(我正在努力,但时间永远不够用)。我的小组规模足够小,如果需要的话,我大概可以手动修复它——但我更希望不需要这样做,更重要的是,我正在尝试为其他雅虎小组管理员想出一个通用的方法。
编辑:我想我应该庆幸自己在一种我几乎一无所知的语言中还能做到这么多,但我仍然觉得我漏掉了什么重要的(本该显而易见的)东西。我尝试用 Mail gem 使用另一种方法。我修改过的 import_users 部分代码如下:
create_users(profiles.to_a) do |u|
user_id = user_id + 1
# 获取该 profile 的最后一条消息以获取最新的用户信息,因为这可能已更改
user_info = @collection.find("ygData.profile": u["_id"]["profile"]).sort("ygData.msgId": -1).limit(1).to_a[0]
# 将 user_id 存储到 profile 查找映射中
@user_profile_map.store(user_info["ygData"]["profile"], user_id)
puts "用户已创建:#{user_info["ygData"]["profile"]}"
user_email = Mail::Address.new(HTMLEntities.new.decode(user_info["ygData"]["from"]))
user =
{
id: user_id, # 雅虎的 "userId" 序列似乎在论坛运行期间发生了变化,因此需要生成此 ID
username: user_info["ygData"]["profile"],
name: user_info["ygData"]["authorName"],
email: user_email.address, # 必填
created_at: Time.now
}
user
end
它起作用了!嗯,大部分情况下。脚本统计出 302 个不同的用户,导入了 289 个。它们在管理页面上显示,用户名、全名(如果提供)和电子邮件地址都正确。脚本声称导入了全部 302 个用户,并且没有报告任何错误。但当它开始导入主题时,我遇到了以下错误:
正在导入讨论
主题: 1 / 12232 (0.01%) 主题: Newspapers
主题: 2 / 12232 (0.02%) 主题: Ents
回溯(最近一次调用在最后):
8: from script/import_scripts/yahoogroup.rb:168:in `<main>'
7: from /home/dan/discourse/script/import_scripts/base.rb:47:in `perform'
6: from script/import_scripts/yahoogroup.rb:40:in `execute'
5: from script/import_scripts/yahoogroup.rb:101:in `import_discussions'
4: from script/import_scripts/yahoogroup.rb:101:in `each_with_index'
3: from script/import_scripts/yahoogroup.rb:101:in `each'
2: from script/import_scripts/yahoogroup.rb:132:in `block in import_discussions'
1: from /home/dan/discourse/script/import_scripts/base.rb:535:in `create_post'
/home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/activerecord-6.0.0/lib/active_record/core.rb:177:in `find': 找不到 id 为 298 的用户 (ActiveRecord::RecordNotFound)
…这并不令人意外,因为最高的用户 ID 是 290。