Como processar/excluir em massa registros sinalizados?

Olá a todos — nos últimos dias, nossos fóruns têm recebido muitas inscrições de spam que estão sendo devidamente sinalizadas para nossa revisão. O problema é a grande quantidade delas a cada poucas horas:

Existe alguma maneira de revisar rapidamente e fazer uma edição em massa, para que não precisemos clicar em cada entrada e clicar novamente para selecionar a opção de excluir + banir? Isso fica bastante cansativo após algum tempo.

Como alternativa, podemos simplesmente excluir automaticamente os usuários que se enquadram nessa categoria:

Você está recuperando um atraso de perfis antigos de spam. Assim que terminar de recuperar, tudo ficará bem.

Olá Jeff, equipe - a quantidade de spam que recebemos é bastante alta, e temos cerca de 30-40 posts sinalizados para revisão diariamente. É muito clique repetitivo. Alguma nova técnica foi introduzida para tornar isso menos tedioso?

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.

Obrigado por compartilhar - talvez eu tenha que usar algo assim! Eu gostaria que o Discourse suportasse este fluxo de trabalho automaticamente :slight_smile:

Tenho usado a solução do @Canapin em meu Discourse pessoal, mas também tenho uma configuração de instância separada para outra empresa. Eu preferiria não usar este script na solução deles.

Existe alguma atualização da equipe do Discourse sobre abordagens alternativas? Isso se aplica tanto a registros sinalizados quanto a postagens sinalizadas como spam:

Até o momento, não planejamos adicionar ações em massa à Fila de Revisão, mas se você puder criar uma solicitação de Feature para isso, poderíamos avaliar mais facilmente a popularidade da sugestão, o que pode lhe render mais atenção.