Как запретить ботам кликать по телефону и копировать e-mail

Запретить ботам кликать по телефону и email можно и через DNS интеграцию - нужно просто показать капчу или запретить ботам заход на сайт. Но в этой статье мы разберём, как именно запретить ботам кликать по ссылкам с телефоном и копировать e-mail в случае JS интеграции - когда бот имеет физический доступ к сайту. Мы настроим цели в Яндекс.Метрике таким образом, чтобы эти события не срабатывали а ботов.

Шаг 1: создаём цель в Яндекс.Метрике

Для начала нужно создать цель в Метрике. Переходим в интерфейс Яндекс.Метрики, нажимаем «Добавить цель» и выбираем тип цели «JavaScript-событие» [1]:

создаем цель в метрике

В поле идентификатора цели вводим, например, PHONE_CLICK [1]но вы можете использовать любой другой ID. Название цели [3] задаётся произвольно — оно будет отображаться в списке целей.

После создания цели Яндекс.Метрика покажет код, который нужно добавить на сайт. Этот код обрамлен синим прямоугольником на скриншоте выше. Именно этот кусочек JS кода нужно выполнить при клике на телефон, чтобы событие ушло в метрику.

Шаг 2: Пишем JS код срабатывания целей метрики на клик e-mail и копирования телефона

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


// Регистрируем событие клика по телефону (ссылка <a> с атрибутом tel:)
document.addEventListener('click', function (e) {
  const target = e.target.closest('a[href^="tel:"]');
  if (target) {
    ym(XXXXXX,'reachGoal','PHONE_CLICK'); // замените XXXXXX на ваш ID Метрики
    console.log('Клик по телефону:', target.getAttribute('href'));
  }
});

// Регистрируем событие копирования email (ссылка с mailto:)
document.addEventListener('copy', function (e) {
  const selection = window.getSelection().toString();
  const mailtoLinks = document.querySelectorAll('a[href^="mailto:"]');

  for (let link of mailtoLinks) {
    if (selection.includes(link.textContent)) {
      ym(XXXXXX,'reachGoal','EMAIL_COPY'); // замените XXXXXX на ваш ID Метрики
      console.log('Копирование e-mail:', link.getAttribute('href'));
      break;
    }
  }
});

Далее мы вставим этот скрипт в JS код KillBot чтобы он срабатывал только для реальных пользователей, а не для ботов.

Шаг 3: Добавляем код срабатывания целей в KillBot только для пользователей

Теперь переходим к следующему этапу — добавлению кода срабатывания целей в метрике в скрипт KillBot. Для этого:

  1. Зайдите в личный кабинет и перейдите в  настройки скрипта:

    переходим в настройки скрипта килбот
  2. Пролистайте страницу вниз до блока Разместить этот код в body. В этом JS-скрипте, почти в самом начале (сразу после объявления переменных), находится функция kbBeforeFinish(). Именно в этой функции реализуется логика обработки заходов бота и пользователя и именно сюда мы должны вставить наш кастомный JavaScript-код  фиксирования событий кликов по телефону и копирования e-mail:

    место откуда нужно взять код

 

Внутри kbBeforeFinish() есть проверка if (isBot===false), и именно в этот блок мы и помещаем обработчики событий клика по телефону и копирование email.

Скопируйте код срабатывания событий и вставьте его внутрь функции kbBeforeFinish() в условие (isBot===false). После этого события PHONE_CLICK и EMAIL_COPY будут отправляться в Яндекс.Метрику только для настоящих пользователей, а у ботов — не сработают. Полный фрагмент кода будет таким:



function kbBeforeFinish(isBot,kbRes=null){
    if (isBot===false){
       //Plase your JS in user case
       // Клик по телефону (ссылка с tel:)
       document.addEventListener('click', function (e) {
         const target = e.target.closest('a[href^="tel:"]');
         if (target) {
           ym(XXXXXX ,'reachGoal','PHONE_CLICK');
           console.log('Клик по телефону:', target.getAttribute('href'));
         }
       });

// Копирование email (ссылка с mailto:)
       document.addEventListener('copy', function (e) {
         const selection = window.getSelection().toString();
         const mailtoLinks = document.querySelectorAll('a[href^="mailto:"]');

         for (let link of mailtoLinks) {
           if (selection.includes(link.textContent)) {
             ym(XXXXXX,'reachGoal','EMAIL_COPY');
             console.log('Копирование e-mail:', link.getAttribute('href'));
             break;
           }
         }
       });
   }    
}