Hola @kirupa
Me encontré con un problema similar.
Revisamos miles de publicaciones/usuarios marcados automáticamente (sistema y Akismet) en mi foro.
La precisión de ambos, el sistema y Akismet, estuvo muy cerca del 100% (1 falso positivo que yo sepa de 2500 marcas). No es el caso de todos los foros, así que debes estar seguro de lo que haces si quieres automatizar la prohibición de usuarios marcados automáticamente.
Al final, creé un script PHP utilizando datos de un webhook de Discourse:
Primero creé el webhook:
Luego usé Use Discourse webhooks with PHP para recibir la solicitud y analizar los datos.
Agregué código personalizado para activar la prohibición automática enviando una solicitud API a Discourse, basándome en criterios arbitrarios:
Aquí está el código final:
<?php
// Verifica inmediatamente la autenticidad de la solicitud.
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);
// Por seguridad, configura el webhook con un secreto en Discourse y establécelo a continuación.
$discourse_payload_secret = 'xxxxxxxxxxxxxxxxxxxxx';
// Verifica que la solicitud fue enviada desde un webhook autorizado.
if (hash_hmac('sha256', $discourse_payload_raw, $discourse_payload_secret) == $discourse_payload_sha256) {
echo 'recibido';
}
else {
die('autenticación fallida');
}
}
else {
die('acceso denegado');
}
// Prepara el payload para su uso en el script PHP.
$discourse_json = json_decode($discourse_payload_raw);
$reviewable = $discourse_json->reviewable;
// Configura la URL de la API
$api_url = "https://unicyclist.com/review/$reviewable->id/perform/delete_user?version=0";
// Verifica que las propiedades "type" y "score" sean válidas
if (($reviewable->type == "ReviewableUser" || $reviewable->type == "ReviewableAkismetUser" || $reviewable->type == "ReviewableQueuedPost") && $reviewable->score > 0) {
// Configura las opciones de curl
$options = array(
CURLOPT_URL => $api_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "PUT", // Establece el método de solicitud a PUT
CURLOPT_HTTPHEADER => array(
"Api-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Api-Username: system"
)
);
// Inicializa la sesión de curl
$curl = curl_init();
curl_setopt_array($curl, $options);
// Realiza la llamada a la API
$response = curl_exec($curl);
curl_close($curl);
// Decodifica la respuesta
$response_data = json_decode($response);
print_r($response_data);
} else {
exit;
}
?>
Funciona perfectamente hasta ahora.
Ten en cuenta que mi código puede ser muy peligroso de usar en otro contexto y el contenido debe ser pensado cuidadosamente.
Por ejemplo, una marca “ReviewableUser” puede ser establecida en usuarios en foros que necesitan validar usuarios manualmente (no sé si es el caso, es solo un ejemplo). Otros foros podrían haber cambiado los umbrales de detección de spam en su configuración, o la detección automática podría ser simplemente menos precisa en su foro.
