インポートした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 の設定で「clean up inactive users after days」を 1 に変更しました。
再度 CleanUpInactiveUsers Sidekiq ジョブを実行しました。
約 1000 人のユーザーが削除されました。
しかし、まだ 178000 人のユーザーが残っており、そのほとんどがメッセージを持たない空の未使用プロフィールであることは分かっています。

なぜ CleanUpInactiveUsers によって削除されないのか、ご存知でしょうか?

また、スパムアカウントやスパムメッセージが多数あるため、既存のユーザーとメッセージに対してスパム検出を実行し、それらもまとめてクリーンアップすることは可能でしょうか?

Sidekiq キューが詰まるのを防ぐため、このジョブは 1 回の実行で最大 1000 件の処理に制限されています。

Rails コンソールから以下のように実行することもできます。

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

その後、以下のようにループに組み込むことができます。

100.times do 
  Jobs::CleanUpInactiveUsers.new.execute({})
  puts "Done iteration. Total user count #{User.count}"
end

どのようなスパム検出をお考えですか?Akismet でしょうか?

ご clarification ありがとうございます!

正直なところ、わかりません。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 つ以上の投稿があること
  • 少なくとも 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: