[Mod] reCaptcha в отзывах

IRIDON

Старатель
Регистрация
3 Авг 2008
Сообщения
227
Реакции
12
Взядо Для просмотра ссылки Войди или Зарегистрируйся , спасибо пользователю gumanoid , правда кусок кода был с ошибкой, но на исправление ушло не много времени.


идем на Для просмотра ссылки Войди или Зарегистрируйся
если у вас нет google-аккаунта, то регистрируетесь.
создаете ключи для своего домена.
Для просмотра ссылки Войди или Зарегистрируйся
забираете php-библиотеку, распаковываете,файл recaptchalib.php копируете в published/SC/html/scripts


Не забываем делать копии редактируемых файлов!

далее редактируем published/SC/html/scripts/includes/product_discussion.php


Ищем

PHP:
$Message = $Register->get(VAR_MESSAGE);
    /*@var $Message Message*/


Ниже вставляем

PHP:
include("recaptchalib.php");
    $publickey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    $privatekey="YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY";

где XXXX (publickey) и YYYY (privatekey) - ключи сгенерированые рекапчей для вашего сайта

Ищем

PHP:
	if (isset($_POST["add_topic"])){ // add post to the product discussion

		if(CONF_ENABLE_CONFIRMATION_CODE){	
			require_once(DIR_CLASSES.'/class.ivalidator.php');
			$iVal = new IValidator();
			if(!$iVal->checkCode($_POST['fConfirmationCode'])){

				Message::raiseMessageRedirectSQ(MSG_ERROR, '#add-review', "err_wrong_ccode", '', array('topic_data' => $_POST));
			}
		}
		discAddDiscussion( $productID, $_POST["nick"], $_POST["topic"], $_POST["body"] );
		RedirectSQ('productID='.$productID.'&ukey=discuss_product');
	}

Заменяем на:

PHP:
	if (isset($_POST["add_topic"])){ // add post to the product discussion

		if(CONF_ENABLE_CONFIRMATION_CODE){    
            if ($_POST["recaptcha_response_field"]) {
            $resp = recaptcha_check_answer ($privatekey,
                                        $_SERVER["REMOTE_ADDR"],
                                        $_POST["recaptcha_challenge_field"],
                                        $_POST["recaptcha_response_field"]);
                if (!$resp->is_valid) {
                    Message::raiseMessageRedirectSQ(MSG_ERROR, '#add-review', "err_wrong_ccode", '', array('topic_data' => $_POST));
                }
            }
			
		discAddDiscussion( $productID, $_POST["nick"], $_POST["topic"], $_POST["body"] );
		RedirectSQ('productID='.$productID.'&ukey=discuss_product');
	}
	}

далее в этом же файле примерно 93 строка
было:
PHP:
$smarty->assign('conf_image', URL_ROOT.'/imgval.php?'.generateRndCode(4).'=1');

делаем так:

PHP:
$smarty->assign('conf_image', recaptcha_get_html($publickey, $error));

теперь в файле published/SC/html/scripts/templates/frontend/product_discussion.html
почти в самом конце вместо:

PHP:
{if $smarty.const.CONF_ENABLE_CONFIRMATION_CODE}
<tr>
    <td colspan="2">&nbsp;</td>
</tr>
<tbody class="background1">
<tr>
    <td colspan="2">{"str_enter_ccode"|translate}</td>
</tr>
<tr>
    <td align="right">
        <img src="{$conf_image}" alt="code" align="right" />
    </td>
    <td align="left">
        <input name="fConfirmationCode" type="text" >
    </td>
</tr>
</tbody>
{/if}

Заменяем на:

PHP:
{if $smarty.const.CONF_ENABLE_CONFIRMATION_CODE}
<tr>
    <td colspan="2">&nbsp;</td>
</tr>
<tbody class="background1">
<tr>
    <td colspan="2">{"str_enter_ccode"|translate}</td>
</tr>
<tr> 
        <td align="right">
<!--                 <img src="{$conf_image}" alt="code" align="right" />
        </td>
        <td align="left">
                <input name="fConfirmationCode" type="text" >  -->
        </td>
        <td>
            {$conf_image}
        </td>
</tr>
</tbody>
{/if}

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

Далее человек просил благодарить его материально, если у вас есть такое желание, то реквизиты можете найти по ссылке которой я давал в начале сообщения.
 
  • Заблокирован
  • #2
Сделал по инструкции все, кеш очистил, все равно старая капча, где искать баг? Так же желательно вставить и на форму регистрации.
 
Сделал по инструкции все, кеш очистил, все равно старая капча, где искать баг? Так же желательно вставить и на форму регистрации.
Капча будет только в отзывал


Отредактированные файлы которые я лмчно ставил, на версию 300

 
Поделюсь своим вариантом решения проблемы спама в отзывах.

Как-то около года назад напали спам-боты, а здесь на форуме не устраивали решения.
В моем варианте добавлется вопрос, сколько будет 2+3 и т.п.

Работает у меня без нареканий! Ни одного спам отзыва с тех пор!

По шагам:

1. В редакторе "Языки и перевод" добавляем новую переменную:
str_enter_ccode_rev ---> "Защита от спама: Напишите, пожалуйста, сколько будет 2 + 3"
err_wrong_ccode_rev ---> "Введен не правильный ответ на вопрос"

2. В файле /public_html/published/SC/html/scripts/templates/frontend/product_discussion.html
После
Код:
<tr> <td align=right>{"str_subject"|translate}:</td> <td><input type="text" name="topic" value="{$new_topic.topic|escape:'html'}" ></td> </tr>
Добавляем еще одно поле с вопросом для анти спама:
Код:
<tr> <td align=right width="250">{"str_enter_ccode_rev"|translate}:</td> <td><input type="text" name="antispam" ></td> </tr>

3. В файле /public_html/published/SC/html/scripts/includes/product_discussion.php
Находим строку

Код:
discAddDiscussion( $productID, $_POST["nick"], $_POST["topic"], $_POST["body"] );
Заменяем на (проверяет, правильно ли указал пользователь цифру
Код:
if ($_POST["antispam"] == 5) { discAddDiscussion( $productID, $_POST["nick"], $_POST["topic"], $_POST["body"] ); } else { Message::raiseMessageRedirectSQ(MSG_ERROR, '#add-review', "err_wrong_ccode_rev", '', array('topic_data' => $_POST)); }
4. В файле /public_html/published/SC/html/scripts/js/frame.js
Этот шаг уже необязателен, но многие (90% у меня на сайте) не хотят указывать тему, а просто пишут отзыв. Поэтому я проверку наличия темы отзыва отключаю.

Код:
if (document.formD.topic.value.length < 1) { alert(translate.err_input_message_subject); return false; }
выключаем комментарием


Код:
/* if (document.formD.topic.value.length < 1) { alert(translate.err_input_message_subject); return false; } */

Вот и все!
 
Назад
Сверху