Антибот
Замер и фильтр ботов на телефонных номерах сайта. Сначала скрипт показывает, сколько кликов по номерам похожи на ботов, и звонкам не мешает. Защиту со слайдером включаете, только если она действительно нужна. Установка за 2 минуты, любая CMS.
// 01 · Генератор кодаПолучите готовый скрипт
Введите номер счётчика Яндекс Метрики, нажмите «Сгенерировать» — скопируйте код и вставьте на сайт перед </body>. Если не знаете номер — оставьте поле пустым, скрипт найдёт счётчики автоматически.
Генератор кода
phone_click_suspect у живых людей. Время свайпа и число движений влияют на слайдер: уменьшайте, если много ложных phone_bot_suspect.
1. Скачайте файл и загрузите в корень вашего сайта.
2. Вставьте код выше перед </body>.
Tilda: Настройки сайта → Ещё → «HTML-код для вставки внутрь BODY» (в конец)
WordPress: footer.php перед </body> или плагин «Insert Headers and Footers» (Footer)
Bitrix: шаблон сайта → footer.php перед </body>
GTM: тег «Пользовательский HTML», триггер All Pages (DOM Ready)
// 02 · Режимы работыСначала замер, потом защита
Любой барьер перед звонком стоит части реальных обращений. Поэтому Антибот по умолчанию ничему не мешает: он показывает, есть ли проблема, а решение о защите остаётся за вами.
Только замер. Клик по номеру сразу звонит, обработчики сайта и коллтрекинга работают как раньше. Каждый клик размечается в Метрике: «человек» или «подозрение».
Слайдер только для подозрительных кликов. Обычный посетитель, который листал и читал страницу, звонит в один тап.
A/B-тест. Защита включается части посетителей, остальные работают как в режиме замера. Группа закрепляется за браузером и уходит в параметры визита Метрики.
Слайдер при каждом клике. Самая сильная фильтрация и самые большие потери: часть людей закроет окно, особенно на мобильных.
Как скрипт отличает человека от подозрения
Оценка строится по поведению посетителя до клика. Клик считается подозрительным, если есть хотя бы один признак:
untrusted: клик сгенерирован программно (element.click(),dispatchEvent)webdriver: браузер управляется автоматизацией (Selenium, Puppeteer, Playwright без маскировки)too_early: клик раньше чем через 1,5 секунды после начала загрузки страницыno_activity: до клика не было движения мыши, прокрутки, касаний или нажатий клавишhidden: вкладка в момент клика не видна
Порядок внедрения
- measure, 2–4 недели. Смотрим долю
phone_click_suspectсреди всехphone_click, отдельно по трафику из Директа. - Подозрительных мало (условно меньше 5–10 %): защита не нужна. Скрипт можно оставить как мониторинг.
- Подозрительных много: режим
abна 2–4 недели. Сравниваем группы по реальным звонкам из коллтрекинга или CRM, а не по целям Метрики. - Потери в группе с защитой приемлемы: переходим на
adaptiveдля всех.
- Это фильтр от простых ботов, а не антифрод-система. Бот, который имитирует действия человека (движения мыши, паузы, реалистичный свайп), пройдёт и оценку, и слайдер.
- Слайдер — это лишнее действие перед звонком. Часть живых людей закроет окно, не разобравшись. Цель
phone_modal_closeпоказывает, сколько. - Оценка «человек / подозрение» — эвристика. Живой человек, который открыл страницу и мгновенно нажал на номер, попадёт в подозрительные. В режиме adaptive он не теряет звонок, а просто увидит слайдер.
// 03 · Интерактивная демонстрацияОкно подтверждения
Так выглядит окно, которое видит посетитель в режимах adaptive, ab и always. В режиме замера его нет. Проведите ползунок или нажмите кнопки справа: в логе видно, какие цели уходят в Метрику.
Демо слайдера
// 04 · Цели для МетрикиНастройте 9 целей в Яндекс Метрике
Метрика → Настройки → Цели → Добавить цель → тип «JavaScript-событие». Идентификатор — из списка ниже. Первые четыре цели работают во всех режимах, остальные — только когда включено окно подтверждения.
Для оптимизации в Директе: в режиме замера — phone_click_human, в режимах с защитой — phone_redirect. Цель phone_click для оптимизации не подходит: в неё попадают и боты.
Для A/B-режима скрипт при загрузке передаёт параметр визита avs_call_guard.group (slider / direct) — по нему в Метрике строятся сегменты для сравнения групп.
// 05 · ПроблемаЗачем считать и фильтровать клики по номерам
Боты кликают по телефонным ссылкам tel: на сайте — это скликивание. Каждый такой клик засчитывается в Яндекс Метрике как «попытка звонка», искажая статистику конверсий. В рекламных кампаниях Яндекс.Директа это приводит к завышенному CR и неправильной оптимизации.
Но прежде чем ставить барьер, стоит выяснить, насколько статистика действительно искажена. Иначе можно получить более чистые цифры и одновременно потерять часть реальных звонков. Поэтому Антибот сначала измеряет, а защищает — только если вы этого захотите, и только там, где это нужно.
// 06 · Как работаетТехнология
- С момента загрузки скрипт пассивно отмечает первое действие посетителя: движение мыши, касание, прокрутку, нажатие клавиши. Прокрутку и производительность это не затрагивает
- Обработчик клика на
windowв фазе capture оценивает каждый клик по номеру и отправляет цели в Метрику - Если звонок идёт сразу (замер или «чистый» клик в adaptive), событие проходит дальше как обычно: работают обработчики сайта и коллтрекинга, браузер открывает
tel: - Если нужно подтверждение, открывается окно в Shadow DOM (стили сайта не влияют). Ползунок проверяет
isTrustedвсех событий, длительность свайпа и число событий движения - После успеха переход на
tel:идёт синхронно внутри жеста (иначе iOS не покажет диалог вызова). Номер в окне можно выделить и набрать вручную
Совместимость: Tilda, WordPress, 1С-Битрикс, React, Vue, Angular. Чистый ES5 + Pointer Events + Shadow DOM, без зависимостей. Chrome, Edge, Opera, Яндекс.Браузер, Safari 13+, Firefox.
Исключение отдельных номеров
Если какой-то номер защищать не нужно (например, виджет коллтрекинга обрабатывает клик сам):
<a href="tel:+74950000000" data-call-guard="off">+7 495 000-00-00</a>
// 07 · НастройкиПолная конфигурация
Все параметры задаются в window.AVS_CALL_GUARD_CONFIG до подключения скрипта. Указывайте только то, что меняете:
counterId— номер счётчика Метрики (или массив).0— автоопределениеmode— режим:"measure"(по умолчанию) |"adaptive"|"ab"|"always"abShare— доля посетителей с защитой в режиме ab, 0..1 (по умолчанию0.5)abVariant— как защищается группа в режиме ab:"adaptive"(по умолчанию) |"always"minTimeOnPageMs— клик раньше считается подозрительным (по умолчанию1500)priorActivityMs— активность посетителя должна начаться хотя бы за столько до клика (по умолчанию800)minDragMs— мин. длительность свайпа, мс (по умолчанию180). Быстрее — считается ботомminMoves— мин. событий движения (по умолчанию4)successRatio— доля пути ползунка, 0..1 (по умолчанию0.9)showCopy— кнопка «Скопировать номер»:"always"|"desktop"|"never"goals— переименование целей Метрикиtext— тексты окна (заголовок, подсказка, ползунок, предупреждение)
Много phone_click_suspect с причинами too_early или no_activity у, судя по всему, живых людей? Уменьшите minTimeOnPageMs до 800 и priorActivityMs до 300. Много ложных phone_bot_suspect на слайдере? Уменьшите minDragMs до 120 и minMoves до 3.
// 08 · Проверка установкиУбедитесь, что всё работает
После вставки кода на сайт выполните 4 проверки:
?_ym_debug=2 — в консоли браузера (F12 → Console) будут видны все цели и параметры.phone_click, phone_click_human и phone_redirect. В режиме always откроется окно со слайдером.phone_click_suspect с причиной untrusted. В режимах adaptive и always откроется окно, в режиме замера клик будет только помечен:
document.querySelector('a[href^="tel:"]').click()
phone_click_suspect и phone_click — это и есть ответ на вопрос, нужна ли защита.
// 09 · FAQЧастые вопросы
01Что делает скрипт «Антибот»?+
Размечает каждый клик по телефонному номеру как «человек» или «подозрение» по поведению посетителя до клика и отправляет это в Яндекс Метрику. По умолчанию звонкам не мешает. По желанию включается окно со слайдером: только для подозрительных кликов, для части посетителей или для всех.
02Не потеряю ли я реальные звонки?+
В режиме замера (по умолчанию) — нет, звонки проходят как без скрипта. Слайдер — это лишнее действие, и часть людей может закрыть окно. Поэтому защиту стоит включать, только если замер показал заметную долю подозрительных кликов, и сначала через A/B-режим, сравнивая группы по реальным звонкам из коллтрекинга или CRM.
03Это полная защита от ботов?+
Нет, это фильтр от простых ботов. Он отсекает программные клики, автоматизированные браузеры без маскировки и «мгновенные» клики без какой-либо активности на странице. Бот, который имитирует действия человека, пройдёт и оценку, и слайдер. Для полноценного антифрода нужны серверные проверки и данные коллтрекинга.
04Как установить скрипт на сайт?+
Введите номер счётчика Яндекс Метрики в генератор кода вверху страницы, скопируйте готовый код и вставьте на сайт перед </body>. Для Tilda, WordPress, GTM — используйте вкладку «Встроенный код».
05Скрипт платный?+
Нет, полностью бесплатный. Без рекламы, без ограничений, без сбора данных. Скрипт работает локально в браузере посетителя.
06На каких CMS работает?+
На любых: Tilda, WordPress, 1С-Битрикс, самописные сайты, React, Vue, Angular. Чистый ES5 без зависимостей.
07Пропали звонки в CRM или коллтрекинге?+
В режиме замера скрипт ничего не блокирует. В режимах с окном клик, который уходит в окно подтверждения, не передаётся другим обработчикам. Если коллтрекинг только подменяет номер — всё работает. Если виджет сам обрабатывает клик — добавьте атрибут data-call-guard="off".
08Можно не указывать номер счётчика?+
Да. Если counterId не указан — скрипт автоматически находит все счётчики на странице через Ya.Metrika2.counters(). Если Метрики на странице нет — слайдер в режимах с защитой работает, но цели никуда не отправляются, а режим замера теряет смысл.
09Как проверить, что скрипт работает?+
Выполните 4 проверки из раздела «Проверка установки». Ключевой тест: команда document.querySelector('a[href^="tel:"]').click() в консоли — в Метрику должна уйти цель phone_click_suspect с причиной untrusted.