Cada día, tengo una docena de cuentas de spam marcadas como “Este nuevo usuario ingresó información de perfil sin leer ningún tema o publicación”.
En dos años, tuvimos 0 falsos positivos.
Por lo tanto, estoy pensando que podríamos eliminar automáticamente estas cuentas si se marcan por esta razón específica.
Opcionalmente, se podría enviar un correo electrónico automático al destinatario antes de la eliminación, mencionando que la cuenta fue eliminada automáticamente, pero que el administrador puede ser contactado por correo electrónico a través del foro.
Así que, estoy probando esto, usaré los webhooks que nunca antes había usado.
He empezado a usar Use Discourse webhooks with PHP como plantilla y devuelve datos a Discourse correctamente.
Pero necesito crear elementos de spam revisables manualmente (como “el usuario escribió demasiado rápido” o “completó su perfil sin leer ninguna publicación”). ¿Alguna idea de cómo hacerlo?
Lo he conseguido.\n\nCreando un usuario con Insomnia, rellenando su perfil con un disparador de Akismet, que activa una Revisión.\nSe realizan algunas comprobaciones y el usuario se elimina automáticamente.\n\n
\n\nLas propiedades de Revisión para que el script active la eliminación de un usuario son:\n* Tipo: ReviewableAkismetUser, ReviewableUser o ReviewableQueuedPost\n* Puntuación > 0\n\nNo quiero eliminar automáticamente a los usuarios marcados por otros que no sean @system.\n\nAquí está el script PHP que utilizo:\n\nphp\n<?php\n\n// Verifica inmediatamente la autenticidad de la solicitud.\nif (array_key_exists('HTTP_X_DISCOURSE_EVENT_SIGNATURE', $_SERVER)) {\n $discourse_payload_raw = file_get_contents('php://input');\n $discourse_payload_sha256 = substr($_SERVER['HTTP_X_DISCOURSE_EVENT_SIGNATURE'], 7);\n \n // Por seguridad, configura el webhook con un secreto en Discourse y establécelo a continuación.\n $discourse_payload_secret = '2J3tM5X4WYGkGp0tTkmu';\n \n // Verifica que la solicitud fue enviada desde un webhook autorizado.\n if (hash_hmac('sha256', $discourse_payload_raw, $discourse_payload_secret) == $discourse_payload_sha256) {\n echo 'recibido';\n }\n else {\n die('autenticación fallida');\n }\n}\nelse {\n die('acceso denegado');\n}\n\n// Prepara el payload para su uso en el script PHP.\n$discourse_json = json_decode($discourse_payload_raw);\n\n$reviewable = $discourse_json->reviewable;\n\n// Configura la URL de la API\n$api_url = \"https://discourse.canapin.com/review/$reviewable->id/perform/delete_user?version=0\";\n//$api_url = \"https://discourse.canapin.com/review/$reviewable->id/perform/delete_user?version=$reviewable->version\";\n\n\n// Verifica que las propiedades \"tipo\" y \"puntuación\" sean válidas\nif (($reviewable->type == \"ReviewableUser\" || $reviewable->type == \"ReviewableAkismetUser\" || $reviewable->type == \"ReviewableQueuedPost\") && $reviewable->score > 0) {\n // Configura las opciones de curl\n $options = array(\n CURLOPT_URL => $api_url,\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_CUSTOMREQUEST => \"PUT\", // Establece el método de solicitud a PUT\n CURLOPT_HTTPHEADER => array(\n \"Api-Key: 6666666666666666666666666666666666666666666\",\n \"Api-Username: system\"\n )\n );\n // Inicializa la sesión de curl\n $curl = curl_init();\n curl_setopt_array($curl, $options);\n // Realiza la llamada a la API\n $response = curl_exec($curl);\n curl_close($curl);\n // Decodifica la respuesta\n $response_data = json_decode($response);\n print_r($response_data);\n} else {\n exit;\n}\n\n?>\n\nEn una escala de 0 a 10… ¿Qué tan feo confiable es, considerando el contexto en el que funcionará (0 falsos positivos en 2 años para las detecciones de Discourse y akismet)?\n\n—\n\nTengo algunas preguntas sobre el payload de la solicitud de revisión iniciada por Discourse cuando un usuario es detectado como una cuenta de spam potencial.\n1. ¿Por qué hay 2 solicitudes para 1 ReviewableUser con diferencias mínimas entre sus respectivos payloads (la primera solicitud está a la izquierda)?\n\n
\n\n2. ¿Qué significa link_admin?\n3. Cuando elimino manualmente un usuario (detectado por Akismet) desde el panel de revisión, se activa el webhook de revisión con un nuevo payload que contiene, entre otras cosas: \"user_deleted\": false. ¿No debería ser true? \n4. En la URL https://discourse.canapin.com/review/355/perform/delete_user?version=0\", ¿la "version" aquí se refiere a la "version" encontrada en el payload? ¿Debo preocuparme por este parámetro? ¿Debería ser igual al parámetro version del payload?
En el estado actual, confío bastante en que funcionará (bueno, ¡más o menos por intuición!) y podemos rastrear posibles problemas mirando los resultados de los webhooks…
O listar los elementos revisados.
Pero hay un problema aquí que no puedo resolver.
A veces, la lista de elementos revisados se ve así, sin ninguna información:
Solo para que conste, he visto que esto aparece un puñado de veces, y una vez fue un falso positivo: un nuevo miembro sensato y atento que primero completó su perfil. Por lo tanto, puede suceder.
Sí. Para ser sincero, tuve 1 falso positivo (que yo sepa) en este lapso de más de dos años.
El usuario luego se contactó conmigo por correo electrónico, que se puede encontrar fácilmente en el sitio web si los usuarios encuentran un problema.
En mi caso, y después de revisar manualmente miles de usuarios, el beneficio de esta autodestrucción sería, en mi opinión, bastante obvio, especialmente dado que es un foro de nicho: los usuarios que realmente están interesados en el tema se pondrán en contacto con nosotros si enfrentan algún inconveniente.