自动删除被系统标记的用户?

您好!

每天,我都会收到十几条垃圾邮件账户的标记,提示为“该新用户在未阅读任何主题或帖子的情况下输入了个人资料信息”。

两年内,我们没有出现过 0 例误报。

因此,我想我们可以自动删除这些被标记为特定原因的账户。

另外,可以在删除前向收件人发送一封自动电子邮件,告知账户已被自动删除,但管理员可以通过论坛的电子邮件联系到。

我查看了 https://meta.discourse.org/t/discourse-automation/195773,但它本身并不支持此功能。

是否可以通过 discourse 自动化方法编写插件,还是需要从头开始编写?

或者,是否有更简单的方法来阻止这些无休止的垃圾邮件进入我们的审核列表?

4 个赞

所以,我来试试这个,我将使用我以前从未使用过的 webhook。
我开始使用 Use Discourse webhooks with PHP 作为模板,它能正常地将数据返回给 Discourse。

但我需要手动创建可审核的垃圾邮件项目(例如“用户输入太快”或“未阅读任何帖子就填写了个人资料”)。有什么办法可以做到吗?

我已成功实现。

使用 Insomnia 创建用户,并用 Akismet 触发器填写其个人资料,这会触发一次审核。
进行一些检查后,用户将被自动删除。

用于触发用户删除的脚本的审核属性为:

  • 类型ReviewableAkismetUserReviewableUserReviewableQueuedPost
  • 分数 > 0

我不想自动删除除 @system 之外的其他用户标记的用户。

这是我使用的 PHP 脚本:

<?php

// 立即验证请求的真实性。
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);
    
    // 出于安全考虑,请在 Discourse 中配置 webhook 并设置一个密钥,然后在此处设置。
    $discourse_payload_secret = '2J3tM5X4WYGkGp0tTkmu';
    
    // 验证请求是否来自授权的 webhook。
    if (hash_hmac('sha256', $discourse_payload_raw, $discourse_payload_secret) == $discourse_payload_sha256) {
        echo 'received';
    }
    else {
        die('authentication failed');
    }
}
else {
    die('access denied');
}

// 准备用于 PHP 脚本的负载。
$discourse_json = json_decode($discourse_payload_raw);

$reviewable = $discourse_json->reviewable;

// 设置 API URL
$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";


// 验证“类型”和“分数”属性是否有效
if (($reviewable->type == "ReviewableUser" || $reviewable->type == "ReviewableAkismetUser" || $reviewable->type == "ReviewableQueuedPost") && $reviewable->score > 0) {
  // 设置 curl 选项
    $options = array(
        CURLOPT_URL => $api_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => "PUT", // 将请求方法设置为 PUT
        CURLOPT_HTTPHEADER => array(
            "Api-Key: 6666666666666666666666666666666666666666666",
            "Api-Username: system"
        )
    );
    // 初始化 curl 会话
    $curl = curl_init();
    curl_setopt_array($curl, $options);
    // 发起 API 调用
    $response = curl_exec($curl);
    curl_close($curl);
    // 解码响应
    $response_data = json_decode($response);
    print_r($response_data);
}   else {
    exit;
}

?>

根据 0 到 10 的评分……它有多么丑陋可靠,考虑到它将工作的上下文(在 2 年内,对于 Discourse 和 akismet 检测,误报为 0)?


关于 Discourse 在检测到用户为潜在垃圾邮件帐户时发起的审核请求负载,我有一些问题。

  1. 为什么对于具有最小负载差异的 1 个 ReviewableUser 会有 2 个请求(第一个请求在左侧)?

  2. link_admin 是什么意思?

  3. 当我从审核面板手动删除一个用户(由 Akismet 检测到)时,它会触发审核 webhook,并带有一个新的负载,其中包含:"user_deleted": false。这不应该是 true 吗?:thinking:

  4. 在 URL https://discourse.canapin.com/review/355/perform/delete_user?version=0\" 中,“version”是指负载中的“version”吗?我应该关心这个参数吗?它应该等于负载的 version 参数吗?

在目前的状态下,我很有信心(嗯,大部分是凭直觉……)这会奏效,我们可以通过查看 webhook 结果来跟踪潜在问题……
或者列出已审核的项目。

但这里有一个我无法弄清楚的问题。

有时,已审核的项目列表看起来是这样的,没有任何信息:

有时它看起来是这样的:

我想保留所有信息,以便在删除误报时更容易跟踪。

有什么想法知道这种行为来自哪里吗?

似乎是在某个时候自动删除后发生的,但我不知道如何以及为什么。

我补充说,已审核的项目页面的 JSON 版本包含了 Discourse 界面中所有缺失的信息。


编辑:我弄明白了。禁用 Akismet 插件时就会发生这种情况。

仅供参考,我曾见过几次这种情况,其中一次是误报:一位明智且有爱心的会员先填写了个人资料。所以,这种情况确实会发生。

1 个赞

是的。老实说,在这两年多的时间里,我(据我所知)有过 1 次误报。
然后用户通过电子邮件联系了我,如果用户遇到问题,可以在网站上轻松找到我的电子邮件。

就我而言,在手动审查了数千名用户之后,我认为这种自动删除的好处将非常明显,尤其因为这是一个小众论坛——真正对该主题感兴趣的用户在遇到任何不便时联系我们。:slight_smile:

2 个赞

此主题在上次回复后 30 天自动关闭。不再允许回复。