Way to bulk process/delete flagged registrations?

Olá @kirupa

Aconteceu de eu ter, de alguma forma, o mesmo problema.

Revisamos milhares de posts/usuários sinalizados automaticamente (sistema e Akismet) em meu fórum.
A precisão de ambos, sistema e Akismet, foi muito próxima de 100% (1 falso positivo, que eu saiba, para 2500 sinalizações). Não é o caso para todos os fóruns, então você tem que ter certeza do que está fazendo se quiser automatizar o banimento de usuários sinalizados automaticamente.

No final, fiz um script PHP usando dados de webhook do Discourse:

Primeiro criei o webhook:

Então usei Use Discourse webhooks with PHP para receber a solicitação e analisar os dados.

Adicionei código personalizado para acionar o banimento automático enviando uma solicitação de API para o Discourse, com base em critérios arbitrários:

Aqui está o código final:

<?php

// Verifica imediatamente a autenticidade da solicitação.
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);
    
    // Para segurança, configure o webhook com um segredo no Discourse e defina-o abaixo.
    $discourse_payload_secret = 'xxxxxxxxxxxxxxxxxxxxx';
    
    // Verifica se a solicitação foi enviada por um webhook autorizado.
    if (hash_hmac('sha256', $discourse_payload_raw, $discourse_payload_secret) == $discourse_payload_sha256) {
        echo 'recebido';
    }
    else {
        die('autenticação falhou');
    }
}
else {
    die('acesso negado');
}

// Prepara o payload para uso no script PHP.
$discourse_json = json_decode($discourse_payload_raw);

$reviewable = $discourse_json->reviewable;

// Define a URL da API
$api_url = "https://unicyclist.com/review/$reviewable->id/perform/delete_user?version=0";

// Verifica se as propriedades "type" e "score" são válidas
if (($reviewable->type == "ReviewableUser" || $reviewable->type == "ReviewableAkismetUser" || $reviewable->type == "ReviewableQueuedPost") && $reviewable->score > 0) {
  // Configura as opções do curl
    $options = array(
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => "PUT", // Define o método da solicitação como PUT
        CURLOPT_HTTPHEADER => array(
            "Api-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "Api-Username: system"
        )
    );
    // Inicializa a sessão curl
    $curl = curl_init();
    curl_setopt_array($curl, $options);
    // Faz a chamada da API
    $response = curl_exec($curl);
    curl_close($curl);
    // Decodifica a resposta
    $response_data = json_decode($response);
    print_r($response_data);
}   else {
    exit;
}

?>

Funciona perfeitamente até agora.

:warning: Note que meu código pode ser muito perigoso de usar em outro contexto e o conteúdo deve ser pensado cuidadosamente.

Por exemplo, uma sinalização “ReviewableUser” pode ser definida em usuários em fóruns que precisam validar usuários manualmente (não sei se é o caso, é apenas um exemplo). Outros fóruns podem ter alterado os limites de detecção de spam em suas configurações, ou a detecção automática pode simplesmente ser menos precisa em seu fórum.

3 curtidas