Я помог сайту, который подвергся атаке спам-постов в количестве около 30 в час. Мы включили AI Spam, но это не решило проблему уже существующих постов. Вот что я сделал. Возможно, это сработает и для вас. Это не протестировано на вашем сайте, поэтому, если вы решите выполнить какие-либо из этих действий, обязательно создайте резервную копию и убедитесь, что всё выглядит так, будто это не было написано ИИ, пытающимся вывести ваш сайт из строя.
Это предполагает, что вы знаете, что такое Rails и как его запускать. Если нет, то вам, вероятно, не стоит этого делать.
Сначала переведите свой сайт в Режим только для чтения в Discourse, чтобы пользователи не могли создавать новый контент, пока вы совершаете какую-нибудь ужасную ошибку. Затем сделайте резервную копию. Это означает, что до тех пор, пока вы не отключите режим только для чтения, вы сможете безопасно вернуться к резервной копии.
Получение недавних постов
Атака началась чуть более суток назад, поэтому я зашел на два дня назад. Вы также можете использовать что-то вроде 36.hours.ago, если хотите быть более точным. Если бы я был хитрее, возможно, я бы исключил посты в личных сообщениях, но я решил не беспокоиться об этом.
posts = Post.where("created_at >= ?", 2.days.ago)
.where(deleted_at: nil)
.where("user_id > ?", 1)
Запуск SpamScanner для этих постов
Я не совсем уверен, что именно привело к сбоям некоторых из них, но если вы видите несколько сообщений «oops», это, вероятно, не повод для беспокойства.
posts.each do |post|
begin
puts "https://talk.commonmark.org/p/#{post.id}"
DiscourseAi::AiModeration::SpamScanner.perform_scan(post)
rescue
puts "oops";
end;
sleep 0.2;
end
Получение постов, которые теперь требуют проверки
Это получает элементы на рассмотрение, которые были только что помечены как требующие проверки (предположительно вышеуказанными действиями). Мы не хотим бездумно применять это к чему-либо, что не является частью этого опасного приключения.
reviewables = Reviewable.where(status: "pending")
.where(potential_spam: true)
.where("created_at >= ?", 1.hour.ago)
.where("updated_at >= ?", 1.hour.ago)
Слепо доверять ИИ
Конечно, вы внимательно просмотрели темы, которые были скрыты, и все они выглядят как настоящий спам, так что вы просто пойдете на это. Заголовок — шутка. Вы ведь не собираетесь слепо доверять ИИ, правда?!?!?
Это приведет к удалению постов, а также к удалению и блокировке пользователей. Это действительно, очень опасно.
reviewables.each do |reviewable|
begin
puts "deleting https://talk.commonmark.org/t/#{reviewable.topic_id}"
if reviewable.topic.nil?
puts "already gone"
next
end
reviewable.perform(user, :delete_user_block)
rescue
puts "oops"
end
end