Várias perguntas sobre a limpeza de um vbulletin importado

Olá,

Importei um fórum de 20 anos para o Discourse.
Ele possui muitas contas não utilizadas ou spam e mensagens de spam.
Gostaria de fazer uma limpeza.

Configurei todos os meus usuários para o nível de confiança 0.
Tentei descobrir quantos usuários nunca publicaram nenhuma mensagem com esta consulta do Data Explorer:

SELECT COUNT (DISTINCT user_id) from posts

O resultado foi 28530.

Tentei descobrir quantos usuários tenho no total:

SELECT COUNT (DISTINCT id) FROM users

O resultado foi 180000 (as estatísticas do vBulletin confirmaram que tínhamos de fato 180000 contas).

Disparei o trabalho Sidekiq CleanUpInactiveUsers.
Apenas algumas centenas de usuários foram removidos. Analisei um desses perfis não utilizados e não vi nenhuma atividade: nenhuma postagem, nenhum tópico… No entanto, o Discobot enviou uma mensagem para eles depois que importei todos os usuários do vBulletin. Isso aconteceu há 5 dias.
Então, nas configurações do Discourse, defini limpar usuários inativos após dias para 1.
Disparei novamente o trabalho Sidekiq CleanUpInactiveUsers.
Perdi cerca de 1000 usuários.
Ainda tenho 178000 usuários e sei que a maioria deles são perfis vazios e não utilizados, sem nenhuma mensagem.

Alguma ideia do porquê eles não estão sendo removidos pelo CleanUpInactiveUsers?

Além disso, como há muitas contas e mensagens de spam, é possível acionar a detecção de spam em usuários e mensagens existentes e limpar tudo isso também?

O trabalho tem um limite de 1000 por execução, para evitar sobrecarregar a fila do Sidekiq.

Você pode executá-lo no console do Rails assim:

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

E depois colocá-lo em um loop como:

100.times do 
  Jobs::CleanUpInactiveUsers.new.execute({})
  puts "Iteração concluída. Contagem total de usuários #{User.count}"
end

Que tipo de detecção de spam você tinha em mente? Akismet?

Obrigado pela esclarecimento!

Honestamente, não sei. Não sei o que o Discourse usa para detectar e prevenir spam.

Além disso, acredito que um número considerável dos meus spammers postou mensagens nos perfis de usuários públicos, um recurso que não existe no Discourse.
Essas mensagens foram importadas no Discourse como tópicos “normais”, sem categoria e sem título, o que facilitou sua identificação.:


Exemplo de um perfil de spam:

Não quero excluir todas essas mensagens sem título, já que a maioria é inofensiva e pode conter informações que alguns usuários gostariam de recuperar.

O que eu gostaria de fazer é excluir os usuários que postaram apenas tópicos sem título e remover também os tópicos desses usuários.
Seria possível fazer isso de forma relativamente fácil com comandos do Rails?

Pode ser que exija um pouco de experimentação, mas sim. Algo assim pode funcionar como ponto de partida:

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
    # excluir os tópicos e/ou o usuário
  end
end

Para constar, aqui estão minhas condições:

No meu caso, um spammer deve ter:

  • Mais de 1 postagem
  • Pelo menos 1 tópico sem título
  • Nenhum tópico com título
  • O mesmo número de postagens que o número de tópicos (já que um tópico É uma postagem)

Então, adicionei apenas as condições:

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

Vamos torcer para que isso não afete usuários legítimos, mas parece seguro até agora, ao observar aleatoriamente os alvos. :wink: