Tôi sử dụng phụ trợ của https://www.stopforumspam.com/ cùng với honeypot rất thành công. Nhưng bạn phải kiểm tra xem các số liệu SFS có khớp với hồ sơ rủi ro người dùng của bạn hay không.
Không chắc có mô-đun nào không nhưng đây là mã của tôi nếu bạn muốn sao chép, dán và chơi với nó...
/**
* @param $ip - ip hoặc ip[]
* @param $name - tên hoặc tên[]
* @param $email - mailadr hoặc mailadr[]
*
* @return float|int - độ tin cậy thư rác trung bình của api.stopforumspam.org
*/
hàm tĩnh công khai checkStopForumSpam($ip, $name, $email) {
$client = Drupal::getContainer()->get('http_client');
$endpoint = 'https://api.stopforumspam.org/api';
$names = $mails = [];
nếu (is_array($name)) {
foreach ($name as $n) $names[] = urlencode($n);
} khác {
$names[] = urlencode($name);
}
nếu (is_array($email)) {
foreach ($email là $n) $mails[] = md5($n);
} khác {
$mails[] = md5($email);
}
$postdata = [
'form_params' => [
'tên người dùng' => $names,
'emailhash' => $mail,
'ip' => $ip,
"badtorexit",
"json",
"unix"
],
'tiêu đề' => [
'Chấp nhận' => 'ứng dụng/json',
]
];
cố gắng {
$response = $client->post($endpoint, $postdata);
$response_data = json_decode((string) $response->getBody(), TRUE);
} bắt (\Ngoại lệ $e) {
$response_data = [];
$response_data['success'] = 0;
Drupal::logger('asdentbase')->error('stopforumspam exception '.$e->getMessage());
}
$ tự tin = 0,0;
$conficount = 0;
$confimax = 0;
array_walk_recursive($response_data, function ($v, $k) use (&$trust, &$conficount, &$confimax) {
if ($k == 'sự tự tin') {
$ tự tin += $v;
nếu ($v > $confimax) $confimax = $v;
}
nếu ($k == 'giá trị') {
$conficount++;
}
});
$sumconfi = $conficount == 0 ? 0,0 : $conficount / $conficount;
nếu ($confimax > 80) {
nếu ($sumconfi < $confimax) $sumconfi = $confimax;
}
trả về $sumconfi;
}