[EVO] Меняем капчу для eForm
Получилось так, что пришлось закрыть папку manager от посторонних глаз с помощью .htaccess и соответственно сразу перестала работать капча во всех формах.
Долго не думая, пришла идея использовать капчу яндекса, да и лично мне она нравится))
Уверен что есть и другой способ не трогая файлов сниппетов и плагинов, но речь пойдёт именно о доработке оных))
Что делаем?
Первый способ
(к сожалению уже не работает)
Заходим на api капчи яндекса tech.yandex.ru/cleanweb/ и получаем ключ.
И сохраните его куда нибудь, он ещё пригодится.
На этом, яндекс нам больше не нужен)))
В коде смотрите внимательно, вместо ВАШ_КЛЮЧ ставьте ключ полученный от яндекса.
находим файл assets/snippets/eform/eform.inc.php
находим строки
# check vericode
if($vericode)
примерно на 183-190 строке
и меняем условие (от ковычки до ковычки)
if($vericode) {
//add support for captcha code - thanks to Djamoer
$code = $_SESSION['veriword'] ? $_SESSION['veriword'] : $_SESSION['eForm.VeriCode'];
// YANDEX CAPTCHA
$xmlResponse = file_get_contents('http://cleanweb-api.yandex.ru/1.0/check-captcha?key=ВАШ_КЛЮЧ&id='. $code .'&captcha='. $_SESSION['eForm.yandexcaptcha'] .'&value='. $fields['vericode']);
$xml = simplexml_load_string($xmlResponse);
if(isset($xml->ok)) {
$fields['vericode'] = $code;
}
//\\ YANDEX CAPTCHA
if($fields['vericode']!=$code) {
$vMsg[count($vMsg)]=$_lang['ef_failed_vericode'];
$rClass['vericode']=$invalidClass; //added in 1.4.4
}
}
далее находим уже на шестисотых (600) строках
// set vericode
if($vericode) {
и меняем условие на
if($vericode) {
$_SESSION['eForm.VeriCode'] = $fields['vericode'] = substr(uniqid(''),-5);
//$fields['verimageurl'] = MODX_MANAGER_URL.'includes/veriword.php?rand='.rand();
// YANDEX CAPTCHA
$xmlResponse = file_get_contents('http://cleanweb-api.yandex.ru/1.0/get-captcha?key=ВАШ_КЛЮЧ&id='. $_SESSION['eForm.VeriCode'] .'&type=lite');
$xml = simplexml_load_string($xmlResponse);
$_SESSION['eForm.yandexcaptcha'] = (string)$xml->captcha;
$fields['verimageurl'] = (string)$xml->url;
//\\ YANDEX CAPTCHA
}
вот и всё)
ещё раз обратите внимание на ваш ключ, не забудьте поменять в коде «ВАШ_КЛЮЧ» на именно ваш, полученный от яндекса.
На этом всё)
по настройкам вида капчи идём сюда tech.yandex.ru/cleanweb/doc/dg/concepts/get-captcha-docpage/
И как это выглядит
Второй способ
В файле assets/snippets/eform/eform.inc.php находим
// set vericode
if($vericode) {
$_SESSION['eForm.VeriCode'] = $fields['vericode'] = substr(uniqid(''),-5);
$fields['verimageurl'] = MODX_MANAGER_URL.'includes/veriword.php?rand='.rand();
}
и меняем на
// set vericode
if($vericode) {
$_SESSION['eForm.VeriCode'] = $fields['vericode'] = substr(uniqid(''),-5);
$fields['verimageurl'] = 'assets/snippets/eform/captcha.php?rand='.rand();
}
и затем добавляем в папку assets/snippets/eForm/
файл captcha.php с кодом
<?php
if(!$_SERVER['HTTP_REFERER'] || stripos($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) === false) die('HACK?');
define('MODX_API_MODE', true);
include_once(dirname(__FILE__) . "../../../../index.php");
$c = new captcha_eForm;
$c->run();
class captcha_eForm {
public function run() {
$captcha = $this->generate_code();
$this->img_code($captcha);
}
/**
* @return string
*/
private function generate_code() {
//$chars = '1234567890абвгдеёжзийклмнопрстуфхцчшщъыэюя';
$chars = '1234567890';
$length = 5;
$numChars = mb_strlen($chars, 'UTF-8');
$str = '';
for($i = 0; $i < $length; $i++) {
$str .= mb_substr($chars, rand(1, $numChars) - 1, 1, 'UTF-8');
}
$array_mix = preg_split('//ui', $str, -1, PREG_SPLIT_NO_EMPTY);
srand((float) microtime() * 1000000);
shuffle($array_mix);
return implode("", $array_mix);
}
/**
* @param $code
*/
private function img_code($code) {
header("Pragma: no-cache");
header("Content-Type:image/png");
$_SESSION['veriword'] = $code;
$im = imagecreate(210, 100);
imagecolorallocatealpha($im, 255, 255, 255, 127);
$color = imagecolorallocate($im, 0, 0, 0);
$x = 10;
for($i = 0; $i < strlen($code); $i++) {
$letter = mb_substr($code, $i, 1, 'UTF-8');
imagettftext($im, 70, rand(-10, 10), $x, 75, $color, "./font.ttf", $letter);
$x += 35;
}
imagepng($im);
imagedestroy($im);
}
}
и так же в папку кладём свой шрифт и переименовываем в font.ttf, либо скачиваем этот шрифт aCooperBlackOtl
Кстати форма вторым способом реализована на нашем сайте.
P.S.
Если вдруг кому то нужно сделать так, чтобы картинку можно было обновить, без перезагрузки страницы, и если у вас подключен jQuery
код картинки в шаблоне формы
<span><img id="verimageurl" src="" alt="Код проверки" width="150" onclick="$(this).parent().load('/evo-menyaem-kapchu-dlya-eform.html #verimageurl');" title="Обновить изображение" style="cursor: pointer"></span>