Обычно работает генерация случайного значения и его сохранение в сеансе пользователя.
Когда я вывожу форму, я добавляю это значение как скрытый ввод.
Когда форма опубликована, сравните значение, которое публикуется, со значением в сеансе. Используйте каждое значение только один раз (поэтому измените его перед выводом формы).
Эти спам-боты, как правило, не хранят куки-файлы, что означает, что при выполнении публикации у вас нет текущего сеанса -> нет значения для сравнения, поэтому вы знаете, что что-то происходит. Если им удастся сохранить файлы cookie, они будут сталкиваться с изменением формы для каждого сообщения, и только первая отправка будет успешной. Если они загружают страницу снова каждый раз и также анализируют форму, этот метод не работает. Но я не думаю, что есть способ защититься от этого.
Естественно, это означает, что вам нужно распределять сессии для каждого посетителя на вашем сайте, что также означает хранение файлов cookie. Это либо та, либо капча, я не знаю других способов.