Varias preguntas sobre la limpieza de un vbulletin importado

Hola,

He importado un foro de 20 años de antigüedad a Discourse.
Contiene muchas cuentas inactivas o de spam, así como mensajes no deseados.
Me gustaría realizar una limpieza.

He configurado todos mis usuarios en el nivel de confianza 0.
Intenté averiguar cuántos usuarios nunca han publicado ningún mensaje con esta consulta de Data Explorer:

SELECT COUNT (DISTINCT user_id) from posts

El resultado es 28530.

Luego intenté saber cuántos usuarios tengo en total:

SELECT COUNT (DISTINCT id) FROM users

El resultado es 180000 (las estadísticas de vBulletin confirmaban que teníamos 180000 cuentas).

Ejecuté el trabajo de Sidekiq CleanUpInactiveUsers.
Solo se eliminaron unos pocos cientos de usuarios. Revisé uno de estos perfiles inactivos y no mostraba actividad: ni publicaciones, ni temas… Sin embargo, Discobot les envió un mensaje después de que importara todos los usuarios desde vBulletin. Esto ocurrió hace 5 días.
Así que en la configuración de Discourse, establecí limpiar usuarios inactivos después de días en 1.
Ejecuté nuevamente el trabajo de Sidekiq CleanUpInactiveUsers.
Perdí aproximadamente 1000 usuarios.
Aún tengo 178000 usuarios y sé que la mayoría son perfiles vacíos e inactivos sin ningún mensaje.

¿Alguna idea de por qué no son eliminados por CleanUpInactiveUsers?

Además, dado que hay muchas cuentas y mensajes de spam, ¿es posible activar la detección de spam en usuarios y mensajes existentes, y limpiar todo eso también?

El trabajo tiene un límite de 1000 por ejecución para evitar saturar la cola de Sidekiq.

Podrías ejecutarlo desde la consola de Rails así:

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

Y luego colocarlo en un bucle como este:

100.times do 
  Jobs::CleanUpInactiveUsers.new.execute({})
  puts "Iteración completada. Recuento total de usuarios #{User.count}"
end

¿A qué tipo de detección de spam te referías? ¿Akismet?

¡Gracias por la aclaración!

Honestamente, no lo sé. No tengo idea de qué usa Discourse para detectar y prevenir el spam.

Además, creo que un buen número de mis spammers publicaron mensajes en los perfiles de usuarios públicos, una función que no existe en Discourse.
Estos mensajes se importaron en Discourse como temas “normales”, sin categoría ni título, lo que los hace fáciles de identificar:


Ejemplo de un perfil de spam:

No quiero eliminar todos estos mensajes sin título, ya que la mayoría son inofensivos y podrían contener información que algunos usuarios querrían recuperar.

Lo que me gustaría hacer es eliminar los usuarios que publicaron únicamente temas sin título y también borrar los temas de ese usuario.
¿Se podría hacer algo así de manera bastante sencilla con comandos de Rails?

Puede que requiera un poco de experimentación, pero sí. Algo como esto podría funcionar como punto 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
    # eliminar los temas y/o el usuario
  end
end

Para que conste, aquí están mis condiciones:

En mi caso, un spammer debe tener:

  • Más de 1 publicación
  • Al menos 1 tema sin título
  • Ningún tema con título
  • El mismo número de publicaciones que de temas (ya que un tema ES una publicación)

Así que acabo de agregar las condiciones:

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

Esperemos que no afecte a usuarios legítimos, pero parece seguro hasta ahora, al revisar objetivos al azar. :wink: