I use the backend of https://www.stopforumspam.com/ together with honeypot very successful. But you have to check if the SFS metrics match your user risk profile.
Not sure if there's a module but here's my code if you like to copy paste and play with it...
/**
* @param $ip - ip or ip[]
* @param $name - name or name[]
* @param $email - mailadr or mailadr[]
*
* @return float|int - the average spam confidence of api.stopforumspam.org
*/
public static function checkStopForumSpam($ip, $name, $email) {
$client = Drupal::getContainer()->get('http_client');
$endpoint = 'https://api.stopforumspam.org/api';
$names = $mails = [];
if (is_array($name)) {
foreach ($name as $n) $names[] = urlencode($n);
} else {
$names[] = urlencode($name);
}
if (is_array($email)) {
foreach ($email as $n) $mails[] = md5($n);
} else {
$mails[] = md5($email);
}
$postdata = [
'form_params' => [
'username' => $names,
'emailhash' => $mails,
'ip' => $ip,
"badtorexit",
"json",
"unix"
],
'headers' => [
'Accept' => 'application/json',
]
];
try {
$response = $client->post($endpoint, $postdata);
$response_data = json_decode((string) $response->getBody(), TRUE);
} catch (\Exception $e) {
$response_data = [];
$response_data['success'] = 0;
Drupal::logger('asdentbase')->error('stopforumspam exception '.$e->getMessage());
}
$confidence = 0.0;
$conficount = 0;
$confimax = 0;
array_walk_recursive($response_data, function ($v, $k) use (&$confidence, &$conficount, &$confimax) {
if ($k == 'confidence') {
$confidence += $v;
if ($v > $confimax) $confimax = $v;
}
if ($k == 'value') {
$conficount++;
}
});
$sumconfi = $conficount == 0 ? 0.0 : $confidence / $conficount;
if ($confimax > 80) {
if ($sumconfi < $confimax) $sumconfi = $confimax;
}
return $sumconfi;
}