将 phpBB3 论坛迁移到 Discourse

@gerhard:我是否可以在迁移后使用 Sidekiq 来清理错误的字符编码?我对 Discourse 还非常陌生,可能不太了解其工作原理。
或者,是否可以直接在 MariaDB 中运行 SQL 脚本?

非常感谢!

当然可以!你也可以手动编辑每篇帖子。如果可能,在迁移前就着手处理要容易得多,因为那时可以重新开始,工作量大约只有后处理的十分之一。

我尝试了多种方法来在 MariaDB 端修复编码问题,但未能找到解决方案。以下是我在处理一个导入项目时用来修复编码的代码:

    ### WIN1252 编码
    win_encoded = ''
    begin
      win_encoded = raw.force_encoding('utf-8').encode("Windows-1252",
                            invalid: :replace, undef: :replace, replace: ""
                           ).force_encoding('utf-8').scrub
    rescue => e
      puts "\n#{'-'*50}\nWin1252 处理失败:\n\n#{raw}\n\n"
      win_encoded = ''
    end
1 个赞

好的,谢谢 :slight_smile:

1 个赞

这是一次痛苦的体验。我尝试了多种编码方式,并在帖子中包含了多种编码以便进行比较。这一种似乎能在大多数情况下解决大部分问题。弄清楚 .scrub 花费了我比预期更长的时间,因为如果没有它,我最终得到的字符串将无法再用 gsub 进行解析。

有人已经找到从 phpBB 导入嵌套列表的好办法了吗?

我对 Ruby 不够熟悉,不知道该如何着手解决这个问题——我正对着这段代码发愁:

 def process_lists(text)
      # 将 list 标签转换为 ul,将 list=1 标签转换为 ol
      # 不支持 list=a,因此将其按 list=1 处理
      # list=9 和 list=x 的效果与 list=1 和 list=a 相同
      text.gsub!(/\[list\](.*?)\[\/list:u\]/mi) do
        $1.gsub(/\[\*\](.*?)\[\/\*(:m)?\]\n*/mi) { "* #{$1}\n" }
      end
      text.gsub!(/\[list=.*?\](.*?)\[\/list:o\]/mi) do
        $1.gsub(/\[\*\](.*?)\[\/\*(:m)?\]\n*/mi) { "1. #{$1}\n" }
      end
    end

有人知道如何处理嵌套列表的“循环”逻辑吗?

下面是一个 BBCode 示例:

[list]
   [*]
   [list=a]
      [*]a
      [*]b
      [*]c
      [*]d
      [*]e
   [/list]
   [*]outer list
[/list]
1 个赞

@helmi

你有没有研究过这个官方 Discourse 插件如何帮助你处理 LIST 标签?

1 个赞

我还没看,但我会去看的,谢谢。不过我尽量不用它,因为从长远来看,我不想支持额外的 BBTags——我更喜欢在导入时直接转换内容。嵌套列表虽然不是关键问题,但如果能有就太好了。

您可以创建备份,升级到 phpBB 3.2,然后使用我的实验分支。它对 BBCodes 的支持要好得多。:wink:

1 个赞

这听起来很有趣,但我更不想再折腾 phpBB 了。除了列表之外,导入过程已经相当顺畅了。那样做反而会增加更多的工作和测试量。不过,看到 3.2 的进展顺利还是很令人欣慰的。

@helmi

是的,我们过去一个月一直在处理这类问题,迁移一个使用了近二十年的 vB3 遗留论坛,其中包含了各种千奇百怪的 BBCode 用法、嵌套、嵌入等等。

要将此类迁移做到 99.9% 的完美并非易事。例如,我们编写了 Ruby 代码,从代码块中移除所有 BBCode 标签,因为 Markdown 并不“喜欢”在围栏代码块中包含 BBCode。

在我们这边,我们仍在完善大量的 Ruby 预处理例程,虽然越来越接近目标,但面对近二十年间一些极具创意的 BBCode 用户(更不用说那些直接复制粘贴到帖子中的用户等)所发布的内容,我们永远无法达到“完美”或“100%”。

我们仍在努力清理从 BBCode 到 Markdown 转换过程中产生的问题。

有时候我会想“干脆全删掉算了”……哈哈。

1 个赞

看起来,当用户名包含某些特殊字符时,我们仍然会遇到用户名被修改或根本未被导入的问题。

导入器是否存在已知问题,还是我在 Discourse 中设置 Unicode 用户名选项的方式有误?我已启用该选项,但白名单中仍包含变音符号。我需要删除白名单以允许所有 Unicode 字符,还是必须列出所有字符?我的理解是:启用 Unicode 即允许所有 Unicode 字符,而禁用时则仅允许白名单中的字符。

在导入过程中,某些字符(如 @ 或 *)似乎被替换为下划线 _。我能理解 @ 可能会与 @提及功能产生冲突,但……在手动处理所有待导入用户之前(这将是一大麻烦),我想先确认一下。

对此有什么建议吗?

祝好,
Frank

即使启用了 Unicode 支持,它仍然只允许使用字母和数字。请参阅 Unicode usernames and group names

2 个赞

你好,

首先,感谢你们提供的所有文档以及本主题中的帮助。
我刚将一个旧的 phpBB3 论坛导入到一个全新的 Discourse 论坛中。

整个导入过程相当顺利,涉及 20 万篇帖子和 2 万个附件,但 Sidekiq 在导入后处理数据时遇到了一点小问题。

现在我遇到了一个新问题:那些包含在 URL 标签中的图片标签,例如:
[url=http://www.casimages.com][img]http://nsm01.casimages.com/img/2009/04/24//090424092900546293539010.jpg[/img][/url]

导入后(将 bbcode 转换为 markdown),这些图片看起来就像普通链接:
[nsm01.casimages.com/img/2009/04/24//090424092900546293539010.jpg](http://www.casimages.com)

有没有办法处理或重新烘焙这些链接,使它们显示为图片,并能自动上传到 S3?

提前感谢你们的帮助。

在系统设置中搜索“下载远程”

编辑:哎呀。看来那不是您的问题。抱歉。

@pfaffman

谢谢 Jay。是的,我已经启用了“下载远程”设置。我的问题是,这些图片显示为链接(而且图片 URL 只是链接的“显示部分”,目标地址并不指向图片内容)。

1 个赞

你好,

我目前有一个从 phpBB 导入的论坛。
我正在考虑将另一个 phpBB 论坛(包含 36,000 条消息和 230 名成员)导入到我现有的 Discourse 安装中。这两个论坛拥有共同的分类和用户。

用户账户可以手动合并。
至于消息,导入后它们将被手动移动到现有的分类中。

这样操作的话,导入脚本能否开箱即用,还是会引发混乱?

如果我导入一个 phpBB 论坛,而某些用户的邮箱地址已经存在于我当前的 Discourse 中,会发生什么情况?

您需要清除 import_id 自定义字段,否则新帖子会被视为已导入。

这听起来像是您在使用主数据库备份的本地安装环境中需要频繁折腾的事情。

2 个赞

感谢您提供的宝贵信息,这是我之前未曾考虑到的 :+1:t6:
好的,我会照做,并在测试服务器上进行尝试,看看是否可行。

关于背景情况:

我运营着一个关于独轮车的全国性 Discourse 论坛。
同时,我还运营着一个服务于当地独轮车协会的 phpBB 论坛。
这两个论坛有一些共同的用户,部分话题或讨论内容也存在重复。我们的想法是将当地协会的论坛合并到全国论坛中,以消除话题重复,并为与当地协会相关的内容创建一个专属群组或分类。

此外,原本只参与当地协会论坛的用户也将借此加入全国论坛,或许能为社区带来更多活跃度。

有人知道 MySQL 在导入容器中无法运行的原因吗?

我已经尝试过很多次,之前一直正常,但现在遇到了以下错误:

无法通过端口 30810 连接到本地 MySQL 服务器

我尝试启动导入操作后,反复检查了所有配置,并多次重建了导入容器。一切看起来都正常,但 MySQL 似乎并未运行。:frowning:

我有点惊慌,因为今天是我们正式迁移到 Discourse 的日子。

:question: :question::question: 这看起来很奇怪。这是从哪里来的?