您好 @kirupa
我似乎遇到了同样的问题。
我们审查了我论坛上数千条自动标记(系统和 Akismet)的帖子/用户。
就我所知,系统和 Akismet 的准确率都接近 100%(2500 条标记中只有 1 条误报)。并非所有论坛都如此,因此如果您想自动禁止被自动标记的用户,您必须确保您所做的事情是正确的。
最后,我使用 Discourse 网页钩子数据编写了一个 PHP 脚本:
我首先创建了网页钩子:
然后我使用了 Use Discourse webhooks with PHP 来接收请求并解析数据。
我添加了自定义代码,通过向 Discourse 发送 API 请求来触发自动禁止,该请求基于任意标准:
这是最终代码:
<?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 中配置网页钩子并设置一个密钥,然后在此处设置。
$discourse_payload_secret = 'xxxxxxxxxxxxxxxxxxxxx';
// 验证请求是否来自授权的网页钩子。
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://unicyclist.com/review/$reviewable->id/perform/delete_user?version=0";
// 验证 "type" 和 "score" 属性是否有效
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: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"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;
}
?>
到目前为止,一切正常。
请注意,我的代码在其他上下文中可能非常危险,并且内容必须仔细考虑。
例如,“ReviewableUser”标记可能会针对需要手动验证用户的论坛上的用户设置(我不知道是否是这种情况,这只是一个例子)。其他论坛可能在其设置中更改了垃圾邮件检测阈值,或者其论坛上的自动检测可能不够准确。
