Как массово обработать/удалить отмеченные регистрации?

Привет, @kirupa

У меня каким-то образом возникла та же проблема.

Мы проверили тысячи автоматически помеченных (системой и Akismet) постов и пользователей на моём форуме.
Точность как системы, так и Akismet была близка к 100 % (насколько мне известно, всего 1 ложное срабатывание на 2500 помеченных элементов). Однако это не относится ко всем форумам, поэтому, если вы хотите автоматизировать блокировку автоматически помеченных пользователей, убедитесь, что понимаете, что делаете.

В итоге я написал PHP-скрипт, использующий данные вебхука Discourse:

Сначала я создал вебхук:

Затем я использовал Use Discourse webhooks with PHP для получения запроса и парсинга данных.

Я добавил собственный код для автоматической блокировки путём отправки API-запроса в Discourse на основе произвольных критериев:

Вот финальный код:

<?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;

// Укажите URL API
$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” может быть установлен для пользователей на форумах, где требуется ручная проверка пользователей (не знаю, так ли это в вашем случае, это просто пример). На других форумах пороги обнаружения спама могут быть изменены в настройках, либо автоматическое обнаружение может быть менее точным.