ya ne robot ya robert

Небольшая предыстория. Я изначально использовал родную капчу компонента JComments - kcaptcha. В какой-то момент отключил ее, поскольку она раздражала комментаторов. Тут же в комментарии посыпался спам в гигантских количествах. Начал использовать CleanTalk - символически платный ($9 в год) плагин, защищающий от спамботов не только комментарии, но и вход/регистрацию, контакты и формы многих сторонних расширений. Спам было прекратился, но в последнее время эти гады настрополились слать мусорные комментарии, по форме маскирующиеся под нормальные и даже включающие в тексте заголовки статей. Их CleanTalk пока отфильтровать не может. Подобных "комментариев" стало приходить по 4-5 в день - не очень критично, да и убивать их легко прямо из уведомлений в почте. Но все же захотелось найти компромиссное решение проблемы - капчу, блокирующую не отлавливаемый CleanTalk-ом спам, но в то же время не раздражающую потенциальных комментаторов.

NO CAPTCHA reCAPTCHA от Гугла (или просто reCAPTCHA v2.0) подходит идеально. Начиная с Joomla 3.4, вторая версия включена в плагин reCAPTCHA, поставляемый с CMS. На время написания прошло почти два года с того релиза, а разрабы JComments так и не озаботились добавить поддержку этого плагина в свой компонент. Это никак не умаляет его достоинств - JComments был и остается лучшим бесплатным решением для комментариев на Джумла-сайте. Тем более что встроить сабж в комментарии достаточно просто своими силами. Для этого вам предстоит выполнить ряд несложных действий.

  1. Если ваш сайт не зарегистрирован в reCAPTCHA, заходите на страницу сервиса, кликаете на кнопку Get reCAPTCHA и добавляете доменное имя сайта. (Понятно, что нужно иметь аккаунт в Google.) Получаете два ключа - публичный и приватный. Замечу здесь, что если вы ранее пользовались первой версией reCAPTCHA, ключи для нее не подходят ко второй версии.
  2. В админке сайта заходим в Расширения | Extensions > Менеджер плагинов | Plugins, находим плагин CAPTCHA - reCAPTCHA и кликаем на его имя. В настройках плагина выбираем версию 2.0, вводим полученные от Гугла ключи, определяем стиль и размер. Если плагин выключен - включаем его. Сохраняем настройки.
  3. Редактируем два файла компонента JComments. Вам понадобится найти указанные оригинальные куски кода и заменить их на кастомизированные. Кликабельные скриншоты результатов сравнения в WinMerge с номерами строк и подсветкой изменений наглядно покажут, где, что и на что поменять (справа - изначальный код, слева - измененный).

    Изменение 1.

    Редактируем файл components\com_jcomments\tpl\default\tpl_form.php. Находим следующий кусок кода:

    if ($this->getVar('comments-form-captcha', 0) == 1) {
        $html = $this->getVar('comments-form-captcha-html');
        if ($html != '') {
          echo $html;
        } else {
          $link = JCommentsFactory::getLink('captcha');
    ?>
    <p>
      <span>
        <img class="captcha" onclick="jcomments.clear('captcha');" id="comments-form-captcha-image" src="<?php echo $link; ?>" width="121" height="60" alt="<?php echo JText::_('FORM_CAPTCHA'); ?>" /><br />
        <span class="captcha" onclick="jcomments.clear('captcha');"><?php echo JText::_('FORM_CAPTCHA_REFRESH'); ?></span><br />
        <input class="captcha" id="comments-form-captcha" type="text" name="captcha_refid" value="" size="5" tabindex="6" /><br />
      </span>
    </p>
    <?php
        }
    }
    ?>

    Заменяем на:

    if ($this->getVar('comments-form-captcha', 0) == 1) {
     
      $captchaEngine = 'recaptcha'; //or 'kcaptcha'
     
      if ($captchaEngine == 'recaptcha') {
        JPluginHelper::importPlugin('captcha');
        $dispatcher = JDispatcher::getInstance();
        $dispatcher->trigger('onInit','dynamic_recaptcha_1');
        $recaptcha = $dispatcher->trigger('onDisplay', array(null, 'dynamic_recaptcha_1', 'class=""'));
    ?>
    <div id="comments-form-captcha-holder">
      <?php echo (isset($recaptcha[0])) ? $recaptcha[0] : ''; ?>
    </div>
    <?php	
      } else if ($captchaEngine == 'kcaptcha') {
        $html = $this->getVar('comments-form-captcha-html');
        if ($html != '') {
          echo $html;
        } else {
          $link = JCommentsFactory::getLink('captcha');
    ?>
    <p>
      <span>
        <img class="captcha" onclick="jcomments.clear('captcha');" id="comments-form-captcha-image" src="<?php echo $link; ?>" width="121" height="60" alt="<?php echo JText::_('FORM_CAPTCHA'); ?>" /><br />
        <span class="captcha" onclick="jcomments.clear('captcha');"><?php echo JText::_('FORM_CAPTCHA_REFRESH'); ?></span><br />
        <input class="captcha" id="comments-form-captcha" type="text" name="captcha_refid" value="" size="5" tabindex="6" /><br />
      </span>
    </p>
    <?php
        }
      }
    }
    ?>

    Результат сравнения:

    Интегрируем reCAPTCHA v2 (NO CAPTCHA) в JComments - кастомизация 1

    Изменение 2.

    Редактируем код файла components\com_jcomments\jcomments.ajax.php. Здесь заменить предстоит всего одну строчку:

    $captchaEngine = $config->get('captcha_engine', 'kcaptcha');

    Код для замены:

    $captchaEngine = 'recaptcha'; //or 'kcaptcha'
     
    if ($captchaEngine == 'recaptcha') {
      $post = JRequest::get('post');  
      JPluginHelper::importPlugin('captcha');
      $dispatcher = JDispatcher::getInstance();
      $result = $dispatcher->trigger('onCheckAnswer', $post['recaptcha_response_field']);
      $response->addScript('grecaptcha.reset();');
     
      if (!in_array(true, $result, true)) {
        self::showErrorMessage(JText::_('ERROR_RECAPTCHA_V2'), 'captcha');
        return $response;
      }
    } else

    Результат сравнения:

    Интегрируем reCAPTCHA v2 (NO CAPTCHA) в JComments - кастомизация 2

  4. Если комментатор забыл кликнуть на капчу, всплывает сообщение об ошибке. Для текста сообщения по умолчанию используется константа ERROR_CAPTCHA из языкового файла компонента. Ее значение - "Пожалуйста, введите код изображенный на картинке!". Поскольку никакой картинки с кодом теперь нет, я заменил сообщение на более подходящее - "Пожалуйста, подтвердите, что вы не робот!" и присвоил его новой константе ERROR_RECAPTCHA_V2. Почему я решил ввести новую языковую константу, а не переопределить значение уже имеющейся, а также - как и куда ее добавить, разъясняется в следующей статье.
  5. Чтобы органично вписать капчу в блок комментария на странице, задайте стиль элемента <div id="comments-form-captcha-holder"> в файле стилей вашего активного шаблона. Мне, например, оказалось достаточно выровнять его по вертикали, для чего я добавил в css-файл моего шаблона следующий код:
    div#comments-form-captcha-holder {
        margin-top: 16px !important;
        margin-bottom: 20px !important;
    }
  6. Чтобы включить вывод капчи для соответствующих групп пользователей, открываем меню Компоненты | Components > JComments, заходим в Настройки | Settings, после чего кликаем на закладке Права | Permissions. Для выбранных групп пользователей (я рекомендую для ВСЕХ) отмечаем галку Защита от спамботов (CAPTCHA) | Enable CAPTCHA. Во вкладке же Вид | Layout в выпадающем списке CAPTCHA остается выбранным единственное значение - KCAPTCHA. Здесь это ни на что не влияет, выбор же между старой kcaptcha и новой удобной reCAPTCHA v2.0 осуществляется в измененном коде. Если по какой-либо причине вам захочется вернуться к родной капче компонента, просто измените строки
    $captchaEngine = 'recaptcha'; //or 'kcaptcha'

    в обоих файлах на такие:

    $captchaEngine = 'kcaptcha'; //or 'recaptcha'

В заключение напомню, что кастомизации придется восстанавливать в случае выхода новых билдов или версий компонента JComments. Но, на мой взгляд, это не слишком большое неудобство. Во-первых, восстановить изменения займет от силы несколько минут, а во-вторых, разработчики не слишком часто обновляют продукт. Тем не менее - будьте внимательны.

Комментарии  

Cthutq
-5 # Cthutq 19.03.2018 01:47
Плохо, зачем вирусы распространяете в своем коде? Получите за свои деяния и вы когда нибудь. На каждый хитрую жопу есть х.. с винтом.
Ответить | Ответить с цитатой | Цитировать
Денис
0 # Денис 19.03.2018 01:52
Не понятно, какой вирус? В каком коде? Я вот делал по инструкции в этой статье, значит вирус на сайт себе залил???
Уточните! Реально же это может очень плохо кончится!
Ответить | Ответить с цитатой | Цитировать
Ogri
+2 # Ogri 19.03.2018 02:17
Да это кто-то здесь развлекается. Я потер уже с десяток матерных постов, прошедших все спам-фильтры. Или надо начинать зверствовать?
Ответить | Ответить с цитатой | Цитировать
ProtectYourSite
+1 # ProtectYourSite 19.03.2018 02:44
Максимум в Jcomments, что детектирует из антивирусов (тот же Ai-Bolit) - это закодированный в base64 копирайт и он опасности не представляет. Так что здесь нету никаких вирусов.
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 19.03.2018 02:54
Он опасности не представляет, точно. Особенно если его отключить. Но вот как это сделать - мануал не буду писать. Грамотные люди и так найдут, остальные пусть постят сцыль на разрабов. Разрабы старались, делали. Пусть им копеечки от прижимистых дилетантов капают.
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 19.03.2018 02:22
Уже давайте, друзья, харе про вирусы. Для школоты полно ресурсов, там и паситесь.
Ответить | Ответить с цитатой | Цитировать
Aleksandr
+1 # Aleksandr 08.04.2018 16:51
тест капчи.

Спасибо за материал, попробую.
Единственный минус - uMatrix и подобные по умолчанию блокируют модуль капчи.
Ответить | Ответить с цитатой | Цитировать
Serg
0 # Serg 07.11.2018 04:15
Все сделал по инструкции, но комментарии не публикуются. Версия Joomla 2.5
Ответить | Ответить с цитатой | Цитировать
Cedars
0 # Cedars 08.11.2018 00:43
Для J2.5 - нужно еще и плагин recaptсha - обновить..

Вот решение: заменяете файл ./plugin/captcha/recaptcha/recaptcha.php файлом взятым здесь:http://altersoftware.it/products/contrib/joo mla25_captcha_v2 - обновляете ключи на v2 и все
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 08.11.2018 01:27
Для J2.5 нужно прежде всего перейти на J3 и далее до крайнего билда. J4 на носу. В статье я даже не рассмативал Джумлы ниже третьей.
Ответить | Ответить с цитатой | Цитировать
Serg
0 # Serg 08.11.2018 06:51
Ясно, я сам плагин recaptha обновил,ключи тоже, на странице регистрации, обратной связи, каптча версии 2 работает)
Она даже отображается в комментариях, но они не публикуются.
Я так и думал что это все работает только для 3 Джумлы)
ладно спасибо за пояснение.
Ответить | Ответить с цитатой | Цитировать
Alexey664655
0 # Alexey664655 29.11.2018 04:07
Понять не могу, если reCAPTCHA не активировано, то при нажатии на кнопку «отправить» не появляется сообщение с ошибкой "Пожалуйста, подтвердите, что вы не робот!".
В чем может быть проблема?
У вас на сайте сообщение с ошибкой появляется.

Помогите решить проблему. (у меня J3.)
Ответить | Ответить с цитатой | Цитировать
Леонид
0 # Леонид 24.01.2019 07:59
Не пашет.
Ответить | Ответить с цитатой | Цитировать
andreypominov
0 # andreypominov 08.05.2019 14:30
Работает. reCaptcha появилась, вот только сообщение если капчу не отметить не появляется (новая константа ERROR_RECAPTCHA_V2 в языковой файл ru-RU.com_jcomments.ini прописана). Точнее вроде что-то в виде кружка загрузки на секунду появится и все. Где лечить?
Ответить | Ответить с цитатой | Цитировать
andreypominov
0 # andreypominov 08.05.2019 14:32
кстати здесь тоже без отметки в рекапче ничего не пишет (4 пункт)
Ответить | Ответить с цитатой | Цитировать
andreypominov
0 # andreypominov 08.05.2019 16:05
еще один косяк, если выбрать "скрыть форму добавления комментария", то после нажатия на "добавить комментарий" форма появляется без reCaptcha. :sad:
Ответить | Ответить с цитатой | Цитировать
Иван
0 # Иван 20.07.2019 10:40
Спасибо, помогло.
Для шаблона комментов joomspirit_theme можно заменять код аналогичным образом.
Ответить | Ответить с цитатой | Цитировать
Денис
0 # Денис 29.11.2019 18:58
Ещё раз спасибо. После обновления jcomments довольно быстро по вашей инструкции опять включил эту капчу.

Но вот сами комменты перестали отправляться... просто так, всё работало и перестало - не после обновления, а просто так, ни с того, ни с сего. Причём, если оставить слабую kcaptcha, то каждый день приходится чистить комменты от спама, то есть, как-то они у кого-то отправляются, но лично я всё равно ни из какого браузера их отправить не могу, чертовщина какая-то.
Возможно, вообще от формы комментариев на сайте откажусь, если не починю.
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 30.11.2019 04:24
Вы знаете, я сам не обновляю компонент, поскольку внес в него много своих изменений и не уверен, что будет просто их адаптировать под новую версию от разработчиков. Они по прежнему тянут kcaptcha после апгрейда? Если да, то у них, видимо, есть свои соображения.

Поставьте Анти-спам от CleanTalk. Я пользуюсь помимо капчи. Очень помогает.
Ответить | Ответить с цитатой | Цитировать
Денис
0 # Денис 03.12.2019 06:08
Да, в самой последней версии (3.0.7 вроде бы) всё та же kcaptcha. Поэтому и воспользовался ещё раз вашей инструкцией.

Анти-спам от CleanTalk ставить не буду по одной простой причине - перестали отправляться комментарии в jcomments. Причём, вот просто так на ровном месте - всё работало и в какой-то момент перестало. Если снизить версию PHP до 7.0 - всё работает, если версия выше - нет. Никаких ошибок, просто ничего не происходит при нажатии кнопки "отправить".
Если PHP оставить самую новую - 7.3 и вместо CAPTCHA "Я не робот" вернуть стандартную kcaptca, то спамных комментариев налетает куча, НО я всё равно ни из каких браузеров коммент отправить не могу... Вот такая чертовщина. Поэтому пока у меня jcomments последней версии с CAPTCHA 2 "Не робот" на PHP 7.3 - просто так присутствует, без функционала, в надежде, что либо само починится, как само и сломалось, либо я со временем найду решение.
Ответить | Ответить с цитатой | Цитировать
Денис
0 # Денис 03.12.2019 06:09
P.S. кстати, у вас невозможно ответить на ответ если делать это в браузере FF. Получилось только в Хроме.
При попытке ответить на комментарий в Файерфоксе появляется 2 формы ответа - в верхней автоматически заполнены поля Имя, Почта, Сайт, пустая форма для комментария и нет капчи; под эти делом- ещё одна форма для ответа с пустыми полями и капчой. Если написать что-либо в верхнюю форму, которая "ответ на комментарий" и нажать капчу в нижней форме - вполне логично, ничего не происходит. Пришлось в нижней форме просто все эти многобукоф добавить в качестве нового коммента.
Ответить | Ответить с цитатой | Цитировать
ProtectYourSite
0 # ProtectYourSite 04.12.2019 06:56
Попробуйте поставить данную версию на PHP 7
Ответить | Ответить с цитатой | Цитировать
Денис
0 # Денис 07.12.2019 07:50
Посмотрел ссылку. Там что-то очень много файлов... как устанавливать???
Ответить | Ответить с цитатой | Цитировать

Добавить комментарий


Работая с этим сайтом, вы даете свое согласие на использование файлов cookie, необходимых для сохранения выбранных вами настроек, а также для нормального функционирования сервисов Google.