¿Cómo procesar/borrar en masa registros marcados?

Hola a todos: durante los últimos días, nuestros foros han recibido muchas registros de spam que están siendo correctamente marcados para nuestra revisión. El problema es la gran cantidad de ellos cada pocas horas:

¿Existe alguna forma de revisar rápidamente y realizar una edición masiva para que no tengamos que hacer clic en cada entrada y volver a hacer clic para seleccionar la opción de eliminar + banear? Eso se vuelve bastante tedioso con el tiempo.

Como alternativa, ¿podemos simplemente eliminar automáticamente a los usuarios que caigan en esta categoría:

Estás poniéndote al día con un retraso de perfiles de spam antiguos. Una vez que te pongas completamente al día, deberías estar bien.

Hola Jeff, equipo: la cantidad de spam que recibimos es bastante alta y tenemos entre 30 y 40 publicaciones marcadas para revisión diariamente. Es mucho trabajo repetitivo de hacer clic. ¿Se han introducido nuevas técnicas para hacer esto menos tedioso?

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.

:warning: 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.

Gracias por compartir. ¡Quizás tenga que usar algo como esto! Desearía que Discourse soportara este flujo de trabajo automáticamente :slight_smile:

He estado usando la solución de @Canapin en mi Discourse personal, pero también tengo una instancia separada configurada para otra empresa. Preferiría no usar este script en su solución.

¿Hay alguna actualización del equipo de Discourse sobre enfoques alternativos? Esto se aplica tanto a los registros marcados como a las publicaciones marcadas como spam:

Hasta ahora, no tenemos nada planeado para agregar acciones masivas a la Cola de Revisión, pero si pudieras crear una solicitud de #funcionalidad para ello, podríamos medir más fácilmente la popularidad de la sugerencia, lo que podría darle más atención.