В первой части (дада, она оказалось первой, после того как появилась вторая:)) я вроде бы поставил точку на теме защиты от спама форума SMF. Однако, как показала практика и время, не все так радужно, и мне снова пришлось взяться за эту проблему.

Описанный ранее мод reCAPTCHA for SMF выдает свою каптчу только при регистрации, а грязный хак, что описывается в конце первой части, спокойно пропускает сообщения, во1, без URL, во2, сообщения с неактивными URL (некликабельными).

Для чего спамерам постить сообщения без ссылок? есть 2 причины:

  1. Ссылку можно поставить в профиле после регистрации (но т.к. у нас на регистрации стоит reCAPTCHA, беспокоиться не о чем)
  2. Спамер проверяет, модерируется ли форум, а также индексируется ли он. То есть, спам-бот постит случайный набор символов, а потом через недельки две проверяет. Если этот случайный набор находится в поисковике, и на форуме он по-прежнему находится, значит, на этот форум можно постить ссылки.

В последнее время «проверяющих» сообщений стало ну просто дофигища, и я засел за проблему. Залез в моды для SMF, увидел, что ничего с прошлого моего захода не поменялось, и понял, что нужно делать свой хак. Решение пришло быстро — добавить в форму ответа простой checkbox, отмечая который реальные посетители будут идентифицировать свою реальность :)

Итак, нужно поменять и добавить кода в следующие файлы:

  1. в файл Display.template.php после
    <input type="hidden" name="num_replies" value="', $context['num_replies'], '" />';
    

    добавить код:

    if ($context['user']['is_guest']) {
        echo '<table width="95%" cellspacing="5" cellpadding="0" border="0"><tr><td align="left"><input type="text" name="guestname" size="22" /> Имя</td></tr><tr><td align="left"><input type="text" name="email" size="22" /> E-mail</td></tr><tr><td align="left"><input type="checkbox" name="chicken"/> ', $txt['no_spam'], '</td></tr></table>';	
    }
    

    Данный код добавить к быстрому ответу, во1, имя и email (которые почему-то отсутствуют), а во2 — тот самый checkbox.

  2. в файл Post.template.php перед
    // Are you posting a calendar event?
    

    добавить код:

    if ($context['user']['is_guest']) {
        echo '<tr><td align="right" style="font-weight: bold;', isset($context['post_error']['spamer']) || isset($context['post_error']['spamer']) ? 'color: red;' : '', '">', $txt['no_spam'], '</td><td><input type="checkbox" name="chicken"/></td></tr>';
    }
    
    

    Этот код добавит checkbox в форму расширенного ответа.

  3. в файл Post.php (папка sources) после
    $post_errors[] = 'long_name';
    

    добавить код:

    if (!$_POST['chicken']) $post_errors[] = 'spamer';
    

    Собственно, добавляем само действие — если checkbox не отмечен — возвращаем ошибку.

  4. в файл Errors.russian-utf8.php добавить в конец строку:
    $txt['error_spamer'] = 'Вы забыли поставить галочку напротив "Я не спамер"';
    

    в файл index.russian-utf8.php добавить в конец строку:

    $txt['no_spam'] = 'Я не спамер';
    

    А это сообщения и надписи, которые будут выводиться

Вот, собственно, и все.. template-файлы лежат либо в папке /Themes/ваша_тема/, либо в папке /Themes/Default/

Вот так это выглядит в быстром ответе:
Вот так это выглядит в быстром ответе

А вот так происходит сообщение об ошибке при непоставленной галочке:
А вот так происходит сообщение об ошибке при непоставленной галочке

Замечу, что эта проблема возникла с форумом, где гости имеют право постить без регистрации!. В случае, когда это запрещено, все намного проще, спасает reCAPTCHA