Разные вопросы по очистке импортированного vBulletin

Здравствуйте,
Я импортировал 20-летний форум в Discourse.
В нём много неиспользуемых или спам-аккаунтов и спам-сообщений.
Я хочу провести очистку.

Я установил уровень доверия для всех пользователей на 0.
Я попытался узнать, сколько пользователей никогда не публиковали сообщений, используя этот запрос для Data Explorer:

SELECT COUNT (DISTINCT user_id) from posts

Он показал 28530.

Я попытался узнать общее количество пользователей:

SELECT COUNT (DISTINCT id) FROM users

Он показал 180000 (статистика vBulletin действительно указывала на 180000 аккаунтов).

Я запустил Sidekiq-задачу CleanUpInactiveUsers.
Было удалено лишь несколько сотен пользователей. Я проверил один из таких неиспользуемых профилей и не обнаружил активности: ни постов, ни тем… Однако Discobot отправил им сообщение после импорта всех пользователей из vBulletin. Это было 5 дней назад.
Поэтому в настройках Discourse я установил параметр clean up inactive users after days на 1.
Я снова запустил Sidekiq-задачу CleanUpInactiveUsers.
Я потерял около 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 поста
  • Как минимум 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: