从 Yahoo! Groups 迁移

我没有 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。

Discourse 是否有任何日志可以显示哪些用户未被创建以及原因?这些日志在哪里?

此处加粗部分是我之前的错误。原来雅虎确实允许你下载这些文件,但这需要一番操作,而且 nowhere 处会告诉你下载得到的是 mbox 文件。雅虎提供了一个“获取我的数据”工具。访问该页面,登录并提交请求,然后等待他们通知你(我花了大约一周时间)。他们会通过电子邮件发送给你一个链接,点击该链接即可下载一个 .zip 文件,其中似乎包含你作为成员的所有群组的大部分内容(照片似乎缺失)。令人 somewhat 惊讶的是,.mbox 文件中包含了完整的电子邮件地址,即使对于那些你不是管理员的群组也是如此。

所以,@gerhard,看来我过早地否定了你的建议——对此我表示歉意。

编辑:是的,.mbox 的处理方式似乎效果更好得多。有些消息被跳过了(例如大约 100 条,原因似乎是缺少日期),但几乎所有 3.8 万条消息都成功导入了,所有用户也都导入了(抽样检查表明他们都关联到了正确的帖子),并且都带有正确的电子邮件地址。它在保持主题完整性方面并非完美(另一个脚本也是如此),但表现相当不错。而且,作为额外的好处,这种方法比我一直尝试的方式更易于文档化。目前我看到的唯一缺点是雅虎需要一段时间才能让你的数据可供下载。

哇!这真是挺酷的。我想他们的想法是,既然您已经在该列表中,就已经拥有这些电子邮件地址了。

这是个好消息——我刚刚完成了下载,看起来我获得了一个相当全面的邮件归档,包含了我想保留的 Yahoogroup 消息,而且是以方便且可移植的 mbox 格式保存的。太棒了!