대량으로 처리하거나 삭제할 수 있는 방법이 있나요?

안녕하세요, 여러분. 지난 며칠간 포럼에 스팸 등록이 많이 유입되고 있으며, 이는 적절하게 플래그가 지정되어 검토 대기 상태에 있습니다. 문제는 몇 시간마다 대량으로 유입된다는 점입니다:

각 항목에 하나씩 들어가서 삭제 + 차단 옵션을 선택하는 대신, 빠르게 검토하고 일괄 편집을 수행할 수 있는 방법이 있을까요? 시간이 지날수록 꽤 번거로워집니다.

대안으로, 이 범주에 해당하는 사용자는 자동으로 삭제할 수 있을까요?

과거 스팸 프로필로 쌓인 잔업을 처리 중입니다. 완전히 처리를 마치면 문제가 해결될 것입니다.

제프 팀장님, 팀원 여러분 - 우리가 받는 스팸 양이 꽤 많아서 매일 30~40개의 게시물이 검토 대상으로 표시되고 있습니다. 반복적인 클릭 작업이 정말 많습니다. 이 작업을 덜 지루하게 만들 새로운 기법이 도입되었나요?

Hi @kirupa

어떤 이유로 같은 문제를 겪고 있었습니다.

저희 포럼에서 자동으로 플래그가 지정된(시스템 및 Akismet) 게시물/사용자를 수천 건 검토해 보았습니다.
시스템과 Akismet의 정확도는 거의 100%에 가까웠습니다(2,500건의 플래그 중 제 기억으로는 오인 1건). 모든 포럼이 그런 것은 아니므로, 자동으로 플래그가 지정된 사용자를 자동 BAN 처리하려는 경우 자신이 하는 일에 확신을 가져야 합니다.

결국 저는 Discourse 웹훅 데이터를 사용하여 PHP 스크립트를 작성했습니다:

먼저 웹훅을 생성했습니다:

그다음 Use Discourse webhooks with PHP 을 사용하여 요청을 수신하고 데이터를 파싱했습니다.

임의의 기준에 따라 API 요청을 Discourse에 보내어 자동 BAN을 트리거하도록 사용자 정의 코드를 추가했습니다:

최종 코드는 다음과 같습니다:

<?php

// 요청의 진위를 즉시 검증합니다.
if (array_key_exists('HTTP_X_DISCOURSE_EVENT_SIGNATURE', $_SERVER)) {
    $discourse_payload_raw = file_get_contents('php://input');
    $discourse_payload_sha256 = substr($_SERVER['HTTP_X_DISCOURSE_EVENT_SIGNATURE'], 7);
    
    // 보안을 위해 Discourse에서 웹훅을 시크릿으로 구성하고 아래에 설정하십시오.
    $discourse_payload_secret = 'xxxxxxxxxxxxxxxxxxxxx';
    
    // 요청이 승인된 웹훅에서 전송되었는지 검증합니다.
    if (hash_hmac('sha256', $discourse_payload_raw, $discourse_payload_secret) == $discourse_payload_sha256) {
        echo 'received';
    }
    else {
        die('authentication failed');
    }
}
else {
    die('access denied');
}

// PHP 스크립트에서 사용할 수 있도록 페이로드를 준비합니다.
$discourse_json = json_decode($discourse_payload_raw);

$reviewable = $discourse_json->reviewable;

// API URL을 설정합니다
$api_url = "https://unicyclist.com/review/$reviewable->id/perform/delete_user?version=0";

// "type"과 "score" 속성이 유효한지 검증합니다
if (($reviewable->type == "ReviewableUser" || $reviewable->type == "ReviewableAkismetUser" || $reviewable->type == "ReviewableQueuedPost") && $reviewable->score > 0) {
  // curl 옵션을 설정합니다
    $options = array(
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => "PUT", // 요청 메서드를 PUT으로 설정합니다
        CURLOPT_HTTPHEADER => array(
            "Api-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "Api-Username: system"
        )
    );
    // curl 세션을 초기화합니다
    $curl = curl_init();
    curl_setopt_array($curl, $options);
    // API 호출을 수행합니다
    $response = curl_exec($curl);
    curl_close($curl);
    // 응답을 디코딩합니다
    $response_data = json_decode($response);
    print_r($response_data);
}   else {
    exit;
}

?>

지금까지는 완벽하게 작동하고 있습니다.

:warning: 제 코드는 다른 맥락에서 사용할 때 매우 위험할 수 있으며, 콘텐츠는 신중하게 고려해야 합니다.

예를 들어, “ReviewableUser” 플래그는 수동으로 사용자를 검증해야 하는 포럼의 사용자에게 설정될 수 있습니다(그렇지 않을 수도 있으며, 단지 예시일 뿐입니다). 다른 포럼은 설정에서 스팸 탐지 임계값을 변경했을 수 있거나, 자동 탐지가 그들의 포럼에서 단순히 덜 정확할 수도 있습니다.

공유해 주셔서 감사합니다. 이런 걸 사용해야 할지도 모르겠네요! Discourse가 이 워크플로를 자동으로 지원해 주었으면 좋겠습니다 :slight_smile:

저는 개인 Discourse에서 @Canapin님의 솔루션을 사용하고 있지만, 다른 회사를 위해 별도 인스턴스도 설정해 두고 있습니다. 해당 회사의 솔루션에는 이 스크립트를 사용하고 싶지 않습니다.

대안적 접근 방식에 대해 Discourse 팀에서 업데이트가 있나요? 이는 플래그가 지정된 가입자뿐만 아니라 스팸으로 플래그가 지정된 게시물에도 적용됩니다:

아직 리뷰 큐에 일괄 작업을 추가하는 계획은 없지만, 해당 기능에 대해 Contribute > Feature 요청을 만들어 주신다면 제안의 인기도를 더 쉽게 파악할 수 있으며, 이는 더 많은 관심을 받을 수 있는 계기가 될 수 있습니다.