가져온 vBulletin 정리 관련 여러 질문

안녕하세요,
20년 된 포럼을 Discourse로 가져왔습니다.
사용하지 않거나 스팸인 계정과 스팸 메시지가 많이 있습니다.
정리를 하고 싶습니다.

모든 사용자의 신뢰 수준을 0으로 설정했습니다.
아래 데이터 탐색 쿼리를 사용하여 메시지를 한 번도 작성하지 않은 사용자의 수를 확인해 보았습니다:

SELECT COUNT (DISTINCT user_id) from posts

28,530명이 계산되었습니다.

총 사용자 수를 확인해 보았습니다:

SELECT COUNT (DISTINCT id) FROM users

180,000명이 계산되었습니다 (vBulletin 통계에 따르면 실제로 180,000개의 계정이 있었던 것으로 확인됩니다).

CleanUpInactiveUsers Sidekiq 작업을 실행했습니다.
몇백 명만 삭제되었습니다. 사용하지 않는 프로필 중 하나를 확인해 보니 활동이 전혀 없었습니다: 게시글도, 주제도 없었습니다. 그러나 vBulletin에서 모든 사용자를 가져온 후 Discobot이 그들에게 메시지를 보낸 적이 있었습니다. 5일 전이었습니다.
그래서 Discourse 설정에서 clean up inactive users after days(비활성 사용자 정리까지 대기일)을 1로 설정했습니다.
다시 CleanUpInactiveUsers Sidekiq 작업을 실행했습니다.
약 1,000명의 사용자가 삭제되었습니다.
아직 178,000명의 사용자가 남아 있고, 그중 대부분은 메시지가 없는 비어 있고 사용하지 않는 프로필이라는 것을 알고 있습니다.

왜 CleanUpInactiveUsers에 의해 삭제되지 않는지 아이디어가 있을까요?

또한 스팸 계정과 메시지가 많기 때문에, 기존 사용자와 메시지에 대해 스팸 감지를 실행하고 그것도 모두 정리할 수 있을까요?

Sidekiq 큐가 막히는 것을 방지하기 위해 이 작업은 실행당 1,000건으로 제한되어 있습니다.

다음과 같이 rails 콘솔에서 실행할 수 있습니다.

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

그리고 다음과 같이 루프에 넣으면 됩니다.

100.times do 
  Jobs::CleanUpInactiveUsers.new.execute({})
  puts "Done iteration. Total user count #{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
    # delete the topics and/or the user
  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: