Добавляем reCaptcha v2 на компонент JComments в связке с Joomla младше 3 версии

Обратился ко мне клиент с вопросом о спаме в комментариях, посмотрев сам сайт, я обнаружил использование компонента JComments 2.3.0 (с родной капчей kcaptcha) и Joomla 2.5.28 (с старой reCaptcha V1).

Естественно на сегодняшний день это давно устаревшие вещи, но вопрос не мог решиться сам собой, так как предложение об миграции на новую версию Joomla (начиная с Joomla 3 уже имеется под капотом уже вшитая reCaptcha V2)  и JComments было отвергнуто (скорее всего по финансовым причинам).

В общем  в настройках компонента JComments 2.3.0  я не обнаружил функционала для выбора капчи по умолчанию, пришлось действовать в коде. Расскажу ниже что и как делал для замены стандартной капчи компонента JComments 2.3.0 на reCaptcha V2 (я не робот) без обновления Joomla и JComments!

Установка reCaptcha V2 на JComments 2.3.0 в независимости от версии Joomla

  1. Если Ваш сайт не регистрировался на reCAPTCHA, тогда вам сюда.
  2. Редактируем два файла компонента JComments.
  3. Создаем папку «recapcha» в «com_jcomments/libraries/» и заливаем туда библиотеку reCaptcha v2. Скачать ее можно тут.

Правка 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_2');
    $recaptcha = $dispatcher->trigger('onDisplay', array(null, 'dynamic_recaptcha_2', 'class=""'));
?>
<div id="comments-form-captcha-holder">
  <div  id="dynamic_recaptcha_2"  class="g-recaptcha" data-sitekey="ВАШ ПУБЛИЧНЫЙ КЛЮЧ ДЛЯ RECAPTHA"></div>
  	<script src='https://www.google.com/recaptcha/api.js'></script>
</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
    }
  }
}
?>
к содержанию ↑

Правка 2

Открываю файл components\com_jcomments\jcomments.ajax.php

Нахожу строку:

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

Заменяю на:

$captchaEngine = 'recaptcha'; //or 'kcaptcha'
 
					if ($captchaEngine == 'recaptcha') { //ReCAPTCHA STARTING
					 
					 require_once(JCOMMENTS_LIBRARIES.'/recapcha/recaptchalib.php');
					  
					  $post = JRequest::get('post');  
					  JPluginHelper::importPlugin('captcha');
					  $dispatcher = JDispatcher::getInstance();
	
					 //TESTING
					 $resultReCaptcha = null;
					 $reCaptcha = new ReCaptcha('ВАШ СЕКРЕТНЫЙ КЛЮЧ ОТ RECAPTCHA');
					 $resultReCaptcha = $reCaptcha->verifyResponse($_SERVER["REMOTE_ADDR"], $post["g-recaptcha-response"]);
					 
	
					  if($resultReCaptcha->success!=1) 
						{	
							self::showErrorMessage('Докажите что вы не робот!', 'captcha');
							return $response;
					    }
					//END ReCAPTCHA
}else
к содержанию ↑

Правка 3

Заменяем в новом коде предыдущих правок надписи «ВАШ СЕКРЕТНЫЙ КЛЮЧ ОТ RECAPTCHA» и «ВАШ ПУБЛИЧНЫЙ КЛЮЧ ДЛЯ RECAPTHA» на соответствующие данные полученные при регистрации сайта в системе reCaptcha.

Результат

Результат | Установка reCaptcha V2 на JComments 2.3.0 в независимости от версии Joomla

Вывод

Данное решение подойдет для тех, у кого старая версия Joomla 1x, 2x и стандартная kcaptcha компонента JComments не справляется со спамом или по другим причинам она просто не подходит.

Чтобы включить вывод капчи для соответствующих групп пользователей, открываем меню Компоненты | Components > JComments, заходим в Настройки | Settings, после чего кликаем на закладке Права | Permissions. Для выбранных групп пользователей (я рекомендую для ВСЕХ) отмечаем галку Защита от спамботов (CAPTCHA) | Enable CAPTCHA. Во вкладке же Вид | Layout в выпадающем списке CAPTCHA остается выбранным единственное значение — KCAPTCHA. Здесь это ни на что не влияет, выбор же между старой kcaptcha и новой удобной reCAPTCHA v2 осуществляется в измененном коде. Если по какой-либо причине вам захочется вернуться к родной капче компонента, просто измените строки:

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

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

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

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

[Всего голосов: 7    Средний: 4.4/5]