Supprimer automatiquement les utilisateurs signalés par le système ?

Salut !

Chaque jour, une douzaine de comptes de spam sont signalés comme « Ce nouvel utilisateur a saisi des informations de profil sans lire aucun sujet ni message ».

En deux ans, nous avons eu 0 faux positifs.

Je pense donc que nous pourrions supprimer automatiquement ces comptes s’ils sont signalés pour cette raison spécifique.

En option, un e-mail automatique pourrait être envoyé au destinataire avant la suppression, mentionnant que le compte a été automatiquement supprimé, mais que l’administrateur peut être contacté par e-mail via le forum.

J’ai jeté un œil à Discourse Automation mais cela ne le permet pas tel quel.

Serait-il possible de coder un plugin en utilisant les méthodes d’automatisation de Discourse, ou faudrait-il le coder à partir de zéro ?

Ou existe-t-il un moyen plus simple d’empêcher ce spam incessant d’arriver dans notre liste de révision ?

4 « J'aime »

J’essaie donc, je vais utiliser les webhooks que je n’ai jamais utilisés auparavant.
J’ai commencé à utiliser Use Discourse webhooks with PHP comme modèle et il renvoie correctement des données à Discourse.

Mais je dois créer manuellement des éléments de spam examinables (comme « l’utilisateur a tapé trop vite » ou « a rempli son profil sans lire aucun message »). Des idées sur la façon de faire cela ?

J’ai réussi.

Création d’un utilisateur avec Insomnia, remplissage de son profil avec un déclencheur Akismet, qui déclenche une révision.
Quelques vérifications sont effectuées et l’utilisateur est automatiquement supprimé.

Les propriétés de révision pour que le script déclenche une suppression d’utilisateur sont :

  • Type : ReviewableAkismetUser, ReviewableUser ou ReviewableQueuedPost
  • Score > 0

Je ne veux pas supprimer automatiquement les utilisateurs signalés par d’autres que @system.

Voici le script PHP que j’utilise :

<?php

// Vérifie immédiatement l'authenticité de la requête.
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);
    
    // Pour la sécurité, configurez le webhook avec un secret dans Discourse et définissez-le ci-dessous.
    $discourse_payload_secret = '2J3tM5X4WYGkGp0tTkmu';
    
    // Vérifie que la requête a été envoyée par un webhook autorisé.
    if (hash_hmac('sha256', $discourse_payload_raw, $discourse_payload_secret) == $discourse_payload_sha256) {
        echo 'reçu';
    }
    else {
        die('authentification échouée');
    }
}
else {
    die('accès refusé');
}

// Prépare la charge utile pour utilisation dans le script PHP.
$discourse_json = json_decode($discourse_payload_raw);

$reviewable = $discourse_json->reviewable;

// Configure l'URL de l'API
$api_url = "https://discourse.canapin.com/review/$reviewable->id/perform/delete_user?version=0";
//$api_url = "https://discourse.canapin.com/review/$reviewable->id/perform/delete_user?version=$reviewable->version";


// Vérifie que les propriétés "type" et "score" sont valides
if (($reviewable->type == "ReviewableUser" || $reviewable->type == "ReviewableAkismetUser" || $reviewable->type == "ReviewableQueuedPost") && $reviewable->score > 0) {
  // Configure les options curl
    $options = array(
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => "PUT", // Définit la méthode de requête sur PUT
        CURLOPT_HTTPHEADER => array(
            "Api-Key: 6666666666666666666666666666666666666666666",
            "Api-Username: system"
        )
    );
    // Initialise la session curl
    $curl = curl_init();
    curl_setopt_array($curl, $options);
    // Effectue l'appel API
    $response = curl_exec($curl);
    curl_close($curl);
    // Décode la réponse
    $response_data = json_decode($response);
    print_r($response_data);
}   else {
    exit;
}

?>

Sur une échelle de 0 à 10… À quel point est-ce laid fiable, compte tenu du contexte dans lequel il fonctionnera (0 faux positifs en 2 ans pour les détections Discourse et akismet) ?


J’ai quelques questions concernant la charge utile de demande de révision initiée par Discourse lorsqu’un utilisateur est détecté comme un compte de spam potentiel.

  1. Pourquoi y a-t-il 2 requêtes pour 1 ReviewableUser avec des différences minimes entre leurs charges utiles respectives (la première requête est à gauche) ?

  2. Que signifie link_admin ?

  3. Lorsque je supprime manuellement un utilisateur (détecté par Akismet) du panneau de révision, cela déclenche le webhook de révision avec une nouvelle charge utile contenant, entre autres : "user_deleted": false. Ne devrait-ce pas être true ? :thinking:

  4. Dans l’URL https://discourse.canapin.com/review/355/perform/delete_user?version=0, la « version » ici fait-elle référence à la « version » trouvée dans la charge utile ? Dois-je me soucier de ce paramètre ? Devrait-il être égal au paramètre version de la charge utile ?

Dans l’état actuel, je suis assez confiant que cela fonctionnera (enfin, surtout par intuition…) et nous pouvons suivre les problèmes potentiels en examinant les résultats des webhooks…
Ou lister les éléments examinés.

Mais il y a un problème ici que je n’arrive pas à résoudre.

Parfois, la liste des éléments examinés ressemble à ceci, sans aucune information :

Et parfois, elle ressemble à ceci :

J’aimerais conserver toutes les informations pour pouvoir suivre plus facilement s’il y avait un faux positif supprimé.

Une idée d’où vient ce comportement ?

Il semble se produire après une suppression automatique à un moment donné, mais je ne sais pas comment ni pourquoi.

J’ajoute que la version JSON de la page des éléments examinés contient toutes les informations manquantes de l’interface de Discourse.


Edit : J’ai trouvé. C’est ce qui se passe lorsque vous désactivez le plugin Akismet.

Pour information, j’ai vu cela apparaître quelques fois, et c’était une fois un faux positif : un nouveau membre sensé et attentionné qui remplissait d’abord son profil. Donc, cela peut arriver.

1 « J'aime »

Oui. Pour être honnête, j’ai eu 1 faux positif (à ma connaissance) sur cette période de plus de deux ans.
L’utilisateur m’a ensuite contacté par e-mail, que l’on trouve facilement sur le site web si un utilisateur rencontre un problème.

Dans mon cas, et après avoir examiné manuellement des milliers d’utilisateurs, le bénéfice de cette suppression automatique serait, à mon avis, assez évident, d’autant plus qu’il s’agit d’un forum de niche - les utilisateurs vraiment intéressés par le sujet nous contacteront s’ils rencontrent un inconvénient. :slight_smile:

2 « J'aime »

Ce sujet a été automatiquement fermé 30 jours après la dernière réponse. Les nouvelles réponses ne sont plus autorisées.