关于清理导入的 vbulletin 的各种问题

你好,
我将一个20年前的论坛导入到了 Discourse。
其中包含大量未使用或垃圾账户以及垃圾消息。
我想进行清理。

我已将所有用户的信任等级设置为 0。
我尝试通过以下数据探索器查询了解有多少用户从未发布过任何消息:

SELECT COUNT (DISTINCT user_id) FROM posts

结果显示为 28530。

接着我尝试统计总用户数:

SELECT COUNT (DISTINCT id) FROM users

结果为 180000(vBulletin 的统计确实显示我们有 180000 个账户)。

我触发了 CleanUpInactiveUsers Sidekiq 任务。
但只有几百个用户被移除。我查看了其中一个未使用的个人资料,发现没有任何活动:没有帖子,没有主题……不过,在我从 vBulletin 导入所有用户后,Discobot 向他们发送了一条消息,那是5天前的事。
因此,我在 Discourse 设置中将 清理不活跃用户的天数 调整为 1。
我再次触发了 CleanUpInactiveUsers Sidekiq 任务。
这次大约移除了 1000 个用户。
目前仍有 178000 个用户,而且我知道其中大多数是没有任何消息的空闲或未使用账户。

请问为什么 CleanUpInactiveUsers 没有移除这些用户?

此外,由于存在大量垃圾账户和消息,是否可以对现有用户和消息触发垃圾检测,并一并清理?

该任务每次运行限制处理 1000 条记录,以避免堵塞 Sidekiq 队列。

你可以像这样从 Rails 控制台运行:

Jobs::CleanUpInactiveUsers.new.execute({})

然后将其放入循环中:

100.times do 
  Jobs::CleanUpInactiveUsers.new.execute({})
  puts "迭代完成。当前用户总数 #{User.count}"
end

你指的是哪种垃圾邮件检测?Akismet 吗?

感谢澄清!

老实说,我不清楚。我不知道 Discourse 使用什么来检测和阻止垃圾信息。

另外,我相信有相当一部分我的垃圾信息发送者曾在公开用户的个人资料页面上发布消息,而 Discourse 并没有这个功能。
这些消息在 Discourse 上被导入为“普通”主题,没有分类也没有标题,因此很容易识别:


垃圾信息用户个人资料示例:

我不想删除所有这些没有标题的消息,其中大多数是无害的,并且可能包含一些用户希望找回的信息。

我想做的是删除那些仅发布过没有标题的主题的用户,并一并删除这些用户发布的所有主题。
能否通过 Rails 命令相对简单地实现这一点?

这可能需要一些实验,但答案是肯定的。以下代码可以作为起点:

User.find_each do |user|
  untitled_topic_count = user.topics.where(title: "").count
  titled_topic_count = user.topics.where.not(title: "").count
  if untitled_topic_count > 0 && titled_topic_count == 0
    # 删除主题和/或用户
  end
end

为记录起见,以下是我的条件:

在我的情况下,垃圾邮件发送者必须满足:

  • 发布超过 1 条帖子
  • 至少有一个无标题的主题
  • 没有任何带标题的主题
  • 帖子数量与主题数量相同(因为一个主题本身就是一条帖子)

因此,我刚刚添加了以下条件:

User.find_each do |user|
  untitled_topic_count = user.topics.where(title: "").count
  titled_topic_count = user.topics.where.not(title: "").count
  topic_count = untitled_topic_count + titled_topic_count
  post_count = user.posts.count
  if post_count > 1 && untitled_topic_count > 0 && titled_topic_count == 0 && post_count == topic_count
    puts "SPAMMER ?"
  end
end

希望这不会误伤合法用户,不过随机抽查目标后,目前看来似乎是安全的。:wink: