Canapin
(Coin-coin le Canapin)
1
こんにちは、
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 によって削除されないのか、ご存知でしょうか?
また、スパムアカウントやスパムメッセージが多数あるため、既存のユーザーとメッセージに対してスパム検出を実行し、それらもまとめてクリーンアップすることは可能でしょうか?
david
(David Taylor)
2
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 でしょうか?
Canapin
(Coin-coin le Canapin)
3
ご clarification ありがとうございます!
正直なところ、わかりません。Discourse がスパムの検知と防止に何を使っているのか、私は知りません。
また、私のスパム送信者の多くは、Discourse には存在しない「一般ユーザーのプロフィール」にメッセージを投稿していたと考えています。
これらのメッセージは、カテゴリもタイトルもない「通常の」トピックとして Discourse にインポートされました。そのため、特定が容易です:
スパムプロファイルの例:
タイトルがないメッセージを すべて 削除するつもりはありません。そのほとんどは無害であり、一部のユーザーが取得したい情報を含んでいる可能性があります。
私がやりたいのは、タイトルがないトピックのみを投稿したユーザーを削除し、そのユーザーのトピックも削除することです。
Rails コマンドで、そのような処理を比較的簡単に実行することは可能でしょうか?
david
(David Taylor)
4
少し試行錯誤が必要かもしれませんが、可能です。以下のようなアプローチが起点として機能するかもしれません:
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
Canapin
(Coin-coin le Canapin)
5
記録のため、私の条件を以下に記します:
私の場合、スパマーは以下の条件を満たす必要があります:
- 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
正当なユーザーを誤って対象にしてしまうことを願っていますが、ランダムにターゲットを確認した限り、現時点では安全に思えます。