Salut @kirupa
J’ai eu le même problème.
Nous avons examiné des milliers de publications/utilisateurs signalés automatiquement (par le système et Akismet) sur mon forum.
La précision du système et d’Akismet était très proche de 100 % (1 faux positif à ma connaissance pour 2500 signalements). Ce n’est pas le cas pour tous les forums, vous devez donc être sûr de ce que vous faites si vous souhaitez automatiser le bannissement des utilisateurs signalés automatiquement.
Finalement, j’ai créé un script PHP utilisant les données d’un webhook Discourse :
J’ai d’abord créé le webhook :
Ensuite, j’ai utilisé Use Discourse webhooks with PHP pour recevoir la requête et analyser les données.
J’ai ajouté du code personnalisé pour déclencher le bannissement automatique en envoyant une requête API à Discourse, basée sur des critères arbitraires :
Voici le code final :
<?php
// Vérifier 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 des raisons de sécurité, configurez le webhook avec un secret dans Discourse et définissez-le ci-dessous.
$discourse_payload_secret = 'xxxxxxxxxxxxxxxxxxxxx';
// Vérifier 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éparer la charge utile pour utilisation dans le script PHP.
$discourse_json = json_decode($discourse_payload_raw);
$reviewable = $discourse_json->reviewable;
// Définir l'URL de l'API
$api_url = "https://unicyclist.com/review/$reviewable->id/perform/delete_user?version=0";
// Vérifier que les propriétés "type" et "score" sont valides
if (($reviewable->type == "ReviewableUser" || $reviewable->type == "ReviewableAkismetUser" || $reviewable->type == "ReviewableQueuedPost") && $reviewable->score > 0) {
// Configurer les options curl
$options = array(
CURLOPT_URL => $api_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => "PUT", // Définir la méthode de requête sur PUT
CURLOPT_HTTPHEADER => array(
"Api-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"Api-Username: system"
)
);
// Initialiser la session curl
$curl = curl_init();
curl_setopt_array($curl, $options);
// Effectuer l'appel API
$response = curl_exec($curl);
curl_close($curl);
// Décoder la réponse
$response_data = json_decode($response);
print_r($response_data);
} else {
exit;
}
?>
Cela fonctionne parfaitement jusqu’à présent.
Notez que mon code peut être très dangereux à utiliser dans un autre contexte et que le contenu doit être soigneusement réfléchi.
Par exemple, un signalement “ReviewableUser” peut être appliqué aux utilisateurs des forums qui ont besoin de valider manuellement les utilisateurs (je ne sais pas si c’est le cas, ce n’est qu’un exemple). D’autres forums pourraient avoir modifié les seuils de détection de spam dans leurs paramètres, ou la détection automatique pourrait simplement être moins précise sur leur forum.