Привет, @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;
}
?>
Пока всё работает отлично.
Обратите внимание: мой код может быть очень опасным при использовании в других контекстах, и его содержимое следует тщательно продумать.
Например, флаг “ReviewableUser” может быть установлен для пользователей на форумах, где требуется ручная проверка пользователей (не знаю, так ли это в вашем случае, это просто пример). На других форумах пороги обнаружения спама могут быть изменены в настройках, либо автоматическое обнаружение может быть менее точным.