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

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