YaSmartCaptcha - защитите ваши формы от спама умной капчей от Яндекс
Привет!
Представляю вам небольшой пакет, который упростит интеграцию Яндекс SmartCaptcha на ваш сайт.
Это дополнение позволит использовать SmartCaptcha от Яндекс на вашем сайте на MODX в формах, созданных с использованием сниппета FormIt (ну а также других компонентах, являющимися надстройкой над FormIt, такими как AjaxForm, SendIt). Поддерживается как обычная капча с кнопкой «Я не робот», так и невидимая.
Перед началом работы ознакомьтесь с инструкцией и зарегистрируйтесь в сервисе: yandex.cloud/ru/docs/smartcaptcha/quickstart
Для работы с капчей вам будет необходимо создать платежный аккаунт, для чего потребуется ввести данные банковской карты или зарегистрировать его на организацию.
После прохождения регистрации создайте свою первую капчу и вы получите 2 ключа (клиентский и серверный). У Яндекса хорошая и понятная документация, проблем быть не должно.
Это бесплатно?
На момент публикации (январь 2024) Яндекс дает 250000 бесплатных проверок на спам в месяц, больше уже за деньги.
Перейдите в системные настройки, выберите пространство yasmartcaptcha, и пропишите ключи:
Вообще принцип работы такой же, как в Google Recaptcha v2, если вы пользовались им ранее, то трудностей быть не должно. Это касается обычной капчи с кнопкой; для невидимой понадобится ещё немного JS, см. раздел ниже.
Шаг 1. В том месте, где вам нужно добавить капчу, добавьте некешированный вызов сниппета:
Данный сниппет подключит на страницу (перед закрывающимся body) скрипт
и добавит html блок с капчей.
У сниппета единственный параметр tpl. Если его не указывать, чанк выбирается автоматически: tpl.YaSmartCaptcha для обычной капчи или tpl.YaSmartCaptcha.Invisible, если включена настройка yasmartcaptcha_invisible.
Шаг 2. Добавьте хук YaSmartCaptcha к FormIt, например:
Если проверка не будет пройдена, то хук установит сразу 2 одинаковые ошибки с ключами smart-token и yasmartcaptcha.
Можете использовать любой ключ для показа ошибки, они равнозначны, просто первая соответствует названию hidden поля, создаваемого SmartCaptcha, а вторая названию компонента.
Невидимая капча не показывает кнопку «Я не робот», проверка запускается из JS вашего сайта и показывается пользователю, только если Яндекс сочтёт его подозрительным. Подробнее о самой технологии — в документации Яндекса: yandex.cloud/ru/docs/smartcaptcha/concepts/invisible-captcha
Формы на разных сайтах отправляются по-разному (обычный submit, AJAX, сторонние библиотеки типа AjaxForm), поэтому компонент не пытается угадать, как перехватить отправку вашей формы. Вместо этого он даёт небольшой JS API, а момент запуска проверки и саму отправку формы вы контролируете сами.
Подключение:
JS API у компонента совсем небольшой:
Дополнительно на контейнере можно указать атрибуты data-hide-shield (скрыть уведомление об обработке данных, в этом случае Яндекс требует показать его самостоятельно) и data-test (тестовый режим).
Пример для обычной формы:
Ссылка на github:
https://github.com/createit-ru/YaSmartCaptcha
Скачать пакет:
https://modstore.pro/packages/utilities/yasmartcaptcha
Также ссылка на транспортный пакет есть на github в разделе Releases (правда не гарантирую, что раздел Releases не забуду обновлять).
Компонент бесплатный, но если вам понравился и пригодился — можно поблагодарить финансово по ссылке:

Ваши благодарности ускорят внедрение новых функций, увеличат мою мотивацию, заставят внимательнее прислушиваться к пожеланиям!
Представляю вам небольшой пакет, который упростит интеграцию Яндекс SmartCaptcha на ваш сайт.
Это дополнение позволит использовать SmartCaptcha от Яндекс на вашем сайте на MODX в формах, созданных с использованием сниппета FormIt (ну а также других компонентах, являющимися надстройкой над FormIt, такими как AjaxForm, SendIt). Поддерживается как обычная капча с кнопкой «Я не робот», так и невидимая.
Регистрация в Yandex Cloud
Перед началом работы ознакомьтесь с инструкцией и зарегистрируйтесь в сервисе: yandex.cloud/ru/docs/smartcaptcha/quickstart
Для работы с капчей вам будет необходимо создать платежный аккаунт, для чего потребуется ввести данные банковской карты или зарегистрировать его на организацию.
После прохождения регистрации создайте свою первую капчу и вы получите 2 ключа (клиентский и серверный). У Яндекса хорошая и понятная документация, проблем быть не должно.
Это бесплатно?
На момент публикации (январь 2024) Яндекс дает 250000 бесплатных проверок на спам в месяц, больше уже за деньги.
Настройка компонента
Перейдите в системные настройки, выберите пространство yasmartcaptcha, и пропишите ключи:
- yasmartcaptcha_client_key — Клиентский ключ
- yasmartcaptcha_server_key — Серверный ключ
- yasmartcaptcha_enabled — глобально включить или выключить капчу на сайте, в том числе её рендеринг на страницах и проверку в хуках. По умолчанию включена.
- yasmartcaptcha_send_user_ip — передавать ли IP пользователя в Яндекс. По идее это может улучшить работу сервиса SmartCaptcha.
- yasmartcaptcha_invisible — использовать невидимую капчу вместо обычной, подробнее ниже.
- yasmartcaptcha_fail_open — пропускать ли пользователя, если сервис проверки Яндекса недоступен или отвечает с ошибкой. По умолчанию включена, то есть недоступность Яндекса не блокирует ваши формы; причина при этом записывается в журнал ошибок MODX.
Добавление капчи в форму
Вообще принцип работы такой же, как в Google Recaptcha v2, если вы пользовались им ранее, то трудностей быть не должно. Это касается обычной капчи с кнопкой; для невидимой понадобится ещё немного JS, см. раздел ниже.
Шаг 1. В том месте, где вам нужно добавить капчу, добавьте некешированный вызов сниппета:
[[!YaSmartCaptcha]]Данный сниппет подключит на страницу (перед закрывающимся body) скрипт
https://smartcaptcha.cloud.yandex.ru/captcha.jsи добавит html блок с капчей.
У сниппета единственный параметр tpl. Если его не указывать, чанк выбирается автоматически: tpl.YaSmartCaptcha для обычной капчи или tpl.YaSmartCaptcha.Invisible, если включена настройка yasmartcaptcha_invisible.
Шаг 2. Добавьте хук YaSmartCaptcha к FormIt, например:
[[!FormIt?
&hooks=`YaSmartCaptcha,email`
..
]]Если проверка не будет пройдена, то хук установит сразу 2 одинаковые ошибки с ключами smart-token и yasmartcaptcha.
Можете использовать любой ключ для показа ошибки, они равнозначны, просто первая соответствует названию hidden поля, создаваемого SmartCaptcha, а вторая названию компонента.
Невидимая капча
Невидимая капча не показывает кнопку «Я не робот», проверка запускается из JS вашего сайта и показывается пользователю, только если Яндекс сочтёт его подозрительным. Подробнее о самой технологии — в документации Яндекса: yandex.cloud/ru/docs/smartcaptcha/concepts/invisible-captcha
Формы на разных сайтах отправляются по-разному (обычный submit, AJAX, сторонние библиотеки типа AjaxForm), поэтому компонент не пытается угадать, как перехватить отправку вашей формы. Вместо этого он даёт небольшой JS API, а момент запуска проверки и саму отправку формы вы контролируете сами.
Подключение:
- В системных настройках включите yasmartcaptcha_invisible.
- Вызов сниппета остаётся прежним, но он должен находиться внутри тега <form>:
Сниппет выведет контейнер капчи (чанк tpl.YaSmartCaptcha.Invisible); поле smart-token виджет создаёт внутри контейнера сам, добавлять его в разметку вручную не нужно.<form method="post"> [[!YaSmartCaptcha]] .. </form>
- Хук YaSmartCaptcha в FormIt подключается так же, как и для обычной капчи (см. Шаг 2 выше).
- В JS сайта перед отправкой формы вызовите YaSmartCaptcha.execute(form).
?render=onload&onload=YaSmartCaptchaInit и подключите assets/components/yasmartcaptcha/js/yasmartcaptcha.js раньше него.JS API у компонента совсем небольшой:
— запускает проверку и возвращает Promise с токеном. Проверка показывается пользователю только если Яндекс сочтёт его подозрительным.YaSmartCaptcha.execute(form)
— сбрасывает капчу. Вызывайте после каждой отправки формы: токен одноразовый и действует 5 минут.YaSmartCaptcha.reset(form)
Дополнительно на контейнере можно указать атрибуты data-hide-shield (скрыть уведомление об обработке данных, в этом случае Яндекс требует показать его самостоятельно) и data-test (тестовый режим).
Пример для обычной формы:
form.addEventListener('submit', async (e) => {
e.preventDefault();
await YaSmartCaptcha.execute(form);
form.submit();
});Пример отправки через fetch:form.addEventListener('submit', async (e) => {
e.preventDefault();
await YaSmartCaptcha.execute(form);
const response = await fetch(form.action, {method: 'POST', body: new FormData(form)});
// ..обработка ответа..
YaSmartCaptcha.reset(form);
});Если пользователь закрыл окно проверки, Promise остаётся неразрешённым: форма не отправляется, повторный клик запускает проверку заново.Ссылки
Ссылка на github:
https://github.com/createit-ru/YaSmartCaptcha
Скачать пакет:
https://modstore.pro/packages/utilities/yasmartcaptcha
Также ссылка на транспортный пакет есть на github в разделе Releases (правда не гарантирую, что раздел Releases не забуду обновлять).
В заключение
Компонент бесплатный, но если вам понравился и пригодился — можно поблагодарить финансово по ссылке:

Ваши благодарности ускорят внедрение новых функций, увеличат мою мотивацию, заставят внимательнее прислушиваться к пожеланиям!
Техническая поддержка MODX
Сайт лежит, тормозит или остался без разработчика?
Переезд с MODX 2 на 3, PHP 7 на 8, скорость и безопасность. Поддержка со сроками и ответственностью, а не совет в чате.
Подробнее
Реклама
Комментарии: 39
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Я только для formit писал. И исправили верно сниппет.
Если я доберусь до github и будет свободное время — нужно сделать обновление)
Может PR сделаете, чтобы не забыл? Или issue)
titanremont.ru/pages-2024
Здесь отображается капча в форме на странице, а в модалке из шапки капчи нет. Но в коде видно, что блоку «smart-captcha» присвоен стиль «height:0». Если я отключаю стиль или своим css его перебиваю, то капча уже отображается и работает.
С чем может быть такое поведение связано?
Нормально работает, эти стили не перебивались.
Еще обнаружил странный баг в модальном окне на fancybox. Если стоит такой стиль на внешнем контейнере .modal {width: 100%;}, то бегунок капчи двигается но проверка не происходит и он снова сбрасывается в начало. Заменил параметр на «width: auto;» и все заработало.
Я же правильно понимаю, что название сниппета нужно добавлять в preHooks? Больше ведь ничего не надо делать? (ну кроме вызова сниппет в html-форме)
500 ошибка — надо смотреть логи сервера…
Fatal error: Uncaught Error: Object of class FormIt could not be converted to string in /core/components/yasmartcaptcha/model/yasmartcaptcha.class.php:60 Stack trace: #0
Подскажите в чем может быть проблема. Причем не важно пройдена капча или нет.
github.com/createit-ru/YaSmartCaptcha/blob/1.0.1-pl/core/components/yasmartcaptcha/model/yasmartcaptcha.class.php#L60
В этом файле ни слова про FormIt нету
Установил, настроил, капча выводится, но если не чекнуть её и отправить форму получаю ошибку: Журнал ошибок ModX пуст.
Modx 3.1.2-pl, YaSmartCaptcha 1.0.2-pl, Formit 5.1.1-pl.
В логе сервера такая ошибка:
Подскажите, пожалуйста, может я что-то не так настроил?
Попробуйте… я просто убрал код, вызывающий ошибку, но к сожалению самому проверить сейчас негде.
Еще раз в этом случае — сниппет Login не работает с pdoTools и Fenom синтаксисом.
На странице в модальных окнах есть 5 форм.
В каждой форме вставлен [[!YaSmartCaptcha]] в нужное место.
Из-за этого он 5 раз закачивает два файла:
* smartcaptcha.cloud.yandex.ru/slider.xxxxxxxxxx.js
* smartcaptcha.cloud.yandex.ru/captchapgrd
Из-за этого размер страницы сильно раздувается.
Как можно решить проблему дублирования?
— скрипт вычисляет свой базовый адрес из собственного src:
и потом дозагружает с него iframe-страницы:
С нашего домена он запросит site.ru/assets/template/js/checkbox.ru.4fdec4f0c66230612adf.html → 404, капча не отрисуется.
Скачать эти HTML тоже не выход: у вашей копии хеш 4fdec4f0c66230612adf, а Яндекс сейчас отдаёт 2e94c0142a465b4a — файл уже устарел, и хеши меняются при каждом их релизе.
Плюс запасной поиск скрипта (строка 122) распознаёт только официальные домены Яндекса.
— Надо именно как-то продумать это в плагине.
В системной настройке service_js сейчас указана ссылка smartcaptcha.cloud.yandex.ru/captcha.js
Я предложил очистить эту настройку, тогда компонент не будет автоматически регистрировать на странице скрипт. И можно добавить этот скрипт в html шаблон сайта самостоятельно. Не нужно делать копию файла на свой сайт, пусть грузится с яндекс.
Странная ситуация, на тестовом домене/сайте в Менеджере пакетов есть YaSmartCaptcha, а на основном домене/сайте нет в списке доступных пакетов. Почему такое может быть?
Уже проверил и пофиксил, плюс скачал пакет с GitHub дополнительно
Кто-то одаренный на основном домене переключил версию PHP с 8.2 на 7.1, со всеми прелестями 500 ошибок )))