Eliminare automaticamente gli utenti segnalati dal sistema?

Ciao!

Ogni giorno, ho una dozzina di account spam contrassegnati come “Questo nuovo utente ha inserito informazioni sul profilo senza leggere alcun argomento o post”.

In due anni, abbiamo avuto 0 falsi positivi.

Quindi, sto pensando che potremmo eliminare automaticamente questi account se vengono contrassegnati per questo motivo specifico.

Opzionalmente, un’email automatica potrebbe essere inviata al destinatario prima dell’eliminazione, menzionando che l’account è stato eliminato automaticamente, ma che l’amministratore può essere contattato via email tramite il forum.

Ho dato un’occhiata a Discourse Automation ma non lo consente immediatamente.

Sarebbe possibile codificare un plugin utilizzando i metodi di automazione di Discourse, o dovrebbe essere codificato da zero?

O c’è un modo più semplice per prevenire questo spam infinito che finisce nella nostra lista di revisione?

4 Mi Piace

Quindi, ci sto provando, userò i webhook che non ho mai usato prima.
Ho iniziato a usare Use Discourse webhooks with PHP come modello e restituisce correttamente i dati a Discourse.

Ma ho bisogno di creare manualmente elementi spam revisionabili (come “l’utente ha digitato troppo velocemente” o “ha compilato il proprio profilo senza leggere alcun post”). Hai qualche idea su come fare?

Ci sono riuscito.

Creazione di un utente con Insomnia, compilazione del suo profilo con un trigger Akismet, che a sua volta innesca una Revisione.
Vengono effettuati alcuni controlli e l’utente viene eliminato automaticamente.

Le proprietà di Revisione per lo script che innesca l’eliminazione di un utente sono:

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

Non voglio eliminare automaticamente gli utenti segnalati da altri utenti diversi da @system.

Ecco lo script PHP che utilizzo:

<?php

// Verifica immediatamente l'autenticità della richiesta.
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);
    
    // Per sicurezza, configura il webhook con un segreto in Discourse e impostalo qui sotto.
    $discourse_payload_secret = '2J3tM5X4WYGkGp0tTkmu';
    
    // Verifica che la richiesta sia stata inviata da un webhook autorizzato.
    if (hash_hmac('sha256', $discourse_payload_raw, $discourse_payload_secret) == $discourse_payload_sha256) {
        echo 'ricevuto';
    }
    else {
        die('autenticazione fallita');
    }
}
else {
    die('accesso negato');
}

// Prepara il payload per l'uso nello script PHP.
$discourse_json = json_decode($discourse_payload_raw);

$reviewable = $discourse_json->reviewable;

// Imposta l'URL dell'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";


// Verifica che le proprietà "type" e "score" siano valide
if (($reviewable->type == "ReviewableUser" || $reviewable->type == "ReviewableAkismetUser" || $reviewable->type == "ReviewableQueuedPost") && $reviewable->score > 0) {
  // Imposta le opzioni curl
    $options = array(
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => "PUT", // Imposta il metodo di richiesta su PUT
        CURLOPT_HTTPHEADER => array(
            "Api-Key: 6666666666666666666666666666666666666666666",
            "Api-Username: system"
        )
    );
    // Inizializza la sessione curl
    $curl = curl_init();
    curl_setopt_array($curl, $options);
    // Effettua la chiamata API
    $response = curl_exec($curl);
    curl_close($curl);
    // Decodifica la risposta
    $response_data = json_decode($response);
    print_r($response_data);
}   else {
    exit;
}

?>

Su una scala da 0 a 10… Quanto è brutto affidabile, considerando il contesto in cui verrà utilizzato (0 falsi positivi in 2 anni per le rilevazioni di Discourse e Akismet)?


Ho alcune domande sul payload della richiesta di revisione avviata da Discourse quando un utente viene rilevato come potenziale account spam.

  1. Perché ci sono 2 richieste per 1 ReviewableUser con differenze minime tra i rispettivi payload (la prima richiesta è a sinistra)?

  2. Cosa significa link_admin?

  3. Quando elimino manualmente un utente (rilevato da Akismet) dal pannello di revisione, questo innesca il webhook di revisione con un nuovo payload contenente, tra le altre cose: "user_deleted": false. Non dovrebbe essere true? :thinking:

  4. Nell’URL https://discourse.canapin.com/review/355/perform/delete_user?version=0", la “version” qui si riferisce alla “version” trovata nel payload? Devo preoccuparmi di questo parametro? Dovrebbe essere uguale al parametro version del payload?

In questo stato, sono abbastanza sicuro che funzionerà (beh, per lo più intuizione…) e possiamo monitorare potenziali problemi guardando i risultati dei webhook…
Oppure elenca gli elementi esaminati.

Ma c’è un problema qui che non riesco a capire.

A volte, l’elenco degli elementi esaminati appare così, senza alcuna informazione:

E a volte appare così:

Vorrei conservare tutte le informazioni per poter monitorare più facilmente se ci fosse stato un falso positivo eliminato.

Qualche idea da dove provenga questo comportamento?

Sembra accadere dopo un’eliminazione automatica a un certo punto, ma non so come e perché.

Aggiungo che la versione JSON della pagina degli elementi esaminati contiene tutte le informazioni mancanti dall’interfaccia di Discourse.


Modifica: Ho capito. Questo è ciò che accade quando disabiliti il plugin Akismet.

Solo per segnalare, ho visto questo accadere alcune volte, ed è stato una volta un falso positivo: un nuovo membro sensato e premuroso che ha compilato per primo il proprio profilo. Quindi, può succedere.

1 Mi Piace

Sì. A dire il vero, ho avuto 1 falso positivo (a mia conoscenza) in questo arco di tempo di oltre due anni.
L’utente mi ha poi contattato via email, che si trova facilmente sul sito web se gli utenti incontrano un problema.

Nel mio caso, e dopo aver esaminato manualmente migliaia di utenti, il beneficio di questa auto-cancellazione sarebbe secondo me abbastanza ovvio, soprattutto perché si tratta di un forum di nicchia – gli utenti veramente interessati all’argomento ci contatteranno se dovessero affrontare qualsiasi inconveniente. :slight_smile:

2 Mi Piace

Questo argomento è stato chiuso automaticamente 30 giorni dopo l’ultima risposta. Non sono più consentite nuove risposte.