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.
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?
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.
Perché ci sono 2 richieste per 1 ReviewableUser con differenze minime tra i rispettivi payload (la prima richiesta è a sinistra)?
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?
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:
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.
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.