导入 vbulletin5.rb 脚本

我正在使用官方的 vBulletin v5 导入脚本,但遇到了一个问题。

我的 vBulletin 论坛结构如下:

/forum/
/forum/sub-category1/
/forum/sub-category1/thread1/
/forum/sub-category1/thread2/
/forum/sub-category2/
/forum/sub-category2/thread1/
/forum/sub-category2/thread2/

运行导入脚本后,Discourse 中只生成了两个分类,且没有任何主题:

/c/sub-category1
/c/sub-category2

我查看了另一个 vBulletin 论坛,发现他们的 URL 没有嵌套。因此我推测,在能够使用该脚本之前,我必须修改我的论坛结构如下:

/forum/
/forum/sub-category1/
/forum/sub-category2/
/forum/thread1a/
/forum/thread2a/
/forum/thread1b/
/forum/thread2b/

之后,我还需要手动为每个主题重新分配分类。

有人使用过这个脚本吗?

脚本中是否有某些地方一眼就能看出可以修改,以便支持更深层的嵌套结构?我可能完全走错了方向。

你说的“线程”是指 Discourse 话题吗?这些话题是否已创建,但未归类到正确的类别中?

嘿,Jay,

谢谢你的回复。

啊,是的——我指的是 Discourse 话题。那里除了那些空分类外什么都没有。所有用户都已成功导入。

Mike

某些因素阻碍了主题和帖子的导入。按理说,运行时应该会显示错误。主题和帖子是在用户创建之后生成的。我认为主题和帖子是由独立的函数处理的。导入器应该像显示用户导入进度一样,显示它们的进度。

导入过程中没有错误消息——仅在运行 create_users 函数时,针对无效用户邮箱地址出现了几条警告。但最终用户导入成功。以下是日志(我已移除包含客户邮箱地址的警告):

importing posts...
5 / 5 (100.0%)  [290527 items/min]                                                            
importing attachments...   
20182 / 5 (403640.0%)

我认为这里它只将我的五个分类识别为帖子并进行了导入,而对于那些未被导入的实际主题的所有附件,它不知道该如何处理?

免责声明

最初,导入失败,因为我收到的 vBulletin 数据库中没有 customprofilepic 表——我在此处添加了一个空表。

此外,没有自定义头像——因此导入脚本中引用的 AVATAR_DIR 只是我创建的一个空文件夹。我在导入脚本中注释掉了以下引用这些资源的行:

create_users(users, total: user_count, offset: offset) do |user|
        username = @htmlentities.decode(user["username"]).strip
        {
          id: user["userid"],
          name: username,
          username: username,
          email: user["email"].presence || fake_email,
          admin: user['admin'] == 1,
          password: user["password"],
          website: user["homepage"].strip,
          title: @htmlentities.decode(user["usertitle"]).strip,
          primary_group_id: group_id_from_imported_group_id(user["usergroupid"]),
          created_at: parse_timestamp(user["joindate"])
          # post_create_action: proc do |u|
          #   @old_username_to_new_usernames[user["username"]] = u.username
          #   import_profile_picture(user, u)
          #   import_profile_background(user, u)
          # end
        }
      end

但据我理解,这些更改仅影响用户创建。而用户已成功创建。

以下是我正在使用的完整导入脚本:

该脚本会从 vBulletin 数据库中的 node 表收集所有主题。该表已存在,并包含约 34,000 条帖子。列名与脚本所引用的名称完全一致:

看起来应该能直接运行 :roll_eyes:

导入脚本会搜索 contenttypeid=23contenttypeid=22 以创建帖子。

通过快速浏览 node 表,我可以确认 23 代表带有附件的帖子,而 22 应该是附件本身。

大多数帖子的 contenttypeid 为 21,即不带附件的帖子。我并未看到针对这些帖子的导入逻辑。或者,这是否由以下代码覆盖:

post_count = mysql_query("SELECT COUNT(nodeid) cnt FROM #{DBPREFIX}node WHERE parentid NOT IN (
SELECT nodeid FROM #{DBPREFIX}node WHERE contenttypeid=23 ) AND contenttypeid=22;").first["cnt"]

这段代码会处理在导入完 23/22 类型后剩余的所有内容。但除了 23/22/21 之外,还存在其他内容类型 ID,因此这段代码也会包含它们。


分类是相对于预设的 ROOT_NODE(值为 2)进行导入的。我可能需要将其设置为 3,以支持我的“三级嵌套”URL?

更新:我刚刚使用 ROOT_NODE=3 重新运行了导入,但没有任何变化。

听起来您的 vBulletin 与脚本预期的不同。在能够导入帖子之前,您需要找出为何没有任何主题被创建。

好的。问题出在 contenttypeid 上:

def import_categories
    puts "", "正在导入顶级分类..."

    categories = mysql_query("SELECT nodeid AS forumid, title, description, displayorder, parentid
	      FROM #{DBPREFIX}node
          WHERE parentid=#{ROOT_NODE}
        UNION
          SELECT nodeid, title, description, displayorder, parentid
          FROM #{DBPREFIX}node
          WHERE contenttypeid = 20
            AND parentid IN (SELECT nodeid FROM #{DBPREFIX}node WHERE parentid=#{ROOT_NODE})").to_a

例如,import_categories 函数使用了 contenttypeid = 23,这与脚本中用于帖子的 ID 相同。而分类的 ID 应为 20。通过在脚本中修改此值,我终于能够看到我的子分类/主题了:raised_hands

现在只剩下线程/帖子需要处理了。

我已为 VBulletin5 导入器提交了一个包含若干更新的拉取请求。其中最重要的改动是移除了这些硬编码的 ID。

此外,对文件上传的支持也得到了改进,导入器现在可以导入标签,并为主题及(子)分类创建永久链接。