«Жрёт много» или 5 способов НЕ кормить ботов из РСЯ
Всем привет!
Я, Григорий Мельников, создатель сервиса защиты сайтов от ботов KillBot.
В этой большой статье я собрал в одном месте способы настройки Яндекс.Директ, которые помогут поднять его эффективность.
В моей прошлой статье Боты в Яндекс.Директ достигли промышленного масштаба показан наглядный пример того, как каждый может доказать, что по рекламе кликает бот. Эта статья — продолжение: о том, как с этим жить.
Кто не читал предыдущую статью — прочитайте. Это действительно интересно.
В конце статьи лайвхак для всех: как самостоятельно, однозначно и безоговорочно доказать, что конверсию совершает БОТ.
О чем пойдёт речь:
Офлайн‑конверсии обязательны для Яндекс.Директ
Защищаем формы от фейков: свой Submit вместо капчи
Избавляемся от тех, кто кликает по моей рекламе ПОСТОЯННО
Минусуем ботов на основании собственного сайта
Минусуем общую аудиторию ботов.
Получаем наглядное ДОКАЗАТЕЛЬСТВО того, что заявку оставляет именно БОТ.
Прежде чем настраивать Яндекс.Директ
Важно подчеркнуть несколько фундаментальных вещей. Обязательно учитывайте это перед запуском кампании.
Яндекс всегда САМ решает, списать деньги за клик или нет. Списание происходит на стороне рекламной площадки. Если произошел клик — деньги списаны: Дошел ли пользователь до сайта, был ли он ботом, мотивированным, «грязным» или «чистым», как именно мы его классифицировали — всё это не имеет значения. Если Яндекс решил списать средства — значит, они будут списаны.
Важно зафиксировать:
Ни один сторонний метод, сервис или отдельный вебмастер не сможет запретить Яндексу списывать деньги за клик. Это принципиально невозможно технически. Т.е. если вам говорят, что какой‑то сервис или специалист сэкономил столько‑то средств в Яндекс.Директ — то это все НЕ правда.
Наша цель — самостоятельно провести комплекс работ, чтобы реклама показывалась как можно более чистой аудитории. Если мусорному трафику реклама НЕ покажется, то мусор на неё и не кликнет.
1. Офлайн‑конверсии обязательны для Яндекс.Директ
Яндекс.Директ должен обучаться ТОЛЬКО на чистом трафике НЕ позволяйте рекламной стратегии обучаться на мусорных конверсиях.
То есть, если у вас произошла конверсия, и за эту конверсию вам НЕ упали деньги, значит, это мусорная конверсия. Нельзя допустить, чтобы такая конверсия учитывалась в стратегии.
Как работает стратегия Директа?
Яндекс анализирует зафиксированные конверсии и ищет пользователей, похожих на тех, кто совершил конверсию.
Поэтому, если в стратегию Директа попадает мусорная конверсия, система начинает искать пользователей, похожих на тех, кто эту конверсию совершил. Именно поэтому мотивированный пользователь притягивает мотивированных, бот притягивает ботов, а мусорный трафик будет генерировать еще больше мусорного трафика.
Поэтому важно, чтобы в обучение рекламной стратегии попадали только действительно качественные конверсии.
Единственная защита от этого: ОФЛАЙН‑конверсии.
Нужно делать так:
Пришла заявка.
Менеджер перезвонил и подтвердил, что это живой и целевой лид
Отправляем офлайн‑конверсию в Директ.
Понятно, что практически реализовать описанное выше можно далеко не во всех случаях, но это обязательно нужно учитывать: только при использовании офлайн‑конверсий рекламная система начинает обучаться на 100% живых данных.
Если у вас CRM позволяет, то нужно отправлять конверсии через CRM. А если нет, то ниже пример кода отправки в Яндекс Метрику параметра посетителя conversion=true. На основании этого параметра в интерфейсе Яндекс Метрики можно будет создать конверсию для Яндекс Директ.
<?php
$counterId = '12345678'; // ID счетчика Яндекс.Метрики
$oauthToken = 'YOUR_OAUTH_TOKEN'; // OAuth-токен - нужно получить для доступа к АПИ метрики
$clientId = '1754923456789012345'; // ClientID посетителя в Яндекс Метрике
$paramName = 'conversion'; // Название параметра
$paramValue = 'true'; // Значение параметра
// Формируем CSV - да, для того, чтобы отпраивть офлайн корнверстю нужно отправить ФАЙЛ!
$csv = "ClientId,{$paramName}\n";
$csv .= "{$clientId},{$paramValue}\n";
$tempFile = tempnam(sys_get_temp_dir(), 'metrika_');
file_put_contents($tempFile, $csv);
//Загружаем файл с параметром посетителя через АПИ
$url = "https://api-metrika.yandex.net/management/v1/counter/".$counterId."/user_params/uploadings/upload?action=update";
$curl = curl_init($url);
curl_setopt_array($curl, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [
'file' => new CurlFile($tempFile, 'text/csv', 'params.csv')
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: OAuth {$oauthToken}"
]
]);
$response = curl_exec($curl);
curl_close($curl);
$result = json_decode($response);
if (!isset($result->uploading->id)) {
unlink($tempFile);
die("Ошибка загрузки:\n" . $response);
}
$uploadId = $result->uploading->id;
//Подтверждаем, что идентификатор в CSV это ClientID Метрики
$confirmUrl = "https://api-metrika.yandex.net/management/v1/counter/". $counterId."/user_params/uploading/".$uploadId."/confirm";
$confirmData = [
'uploading' => [
'content_id_type' => 'client_id'
]
];
$curl = curl_init($confirmUrl);
curl_setopt_array($curl, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($confirmData),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: OAuth {$oauthToken}",
"Content-Type: application/json"
]
]);
$response = curl_exec($curl);
curl_close($curl);
unlink($tempFile);
?>2. Защищаем формы от фейков: свой Submit вместо капчи
Бот может совершить конверсию (отправить СПАМ‑заявку) только потому, что на сайтах по умолчанию ВСЕ формы ввода стандартные, и кнопки и надписи на кнопках также стандартные. Поэтому, боту не составляет труда найти на сайте форму, через которую нужно отправить заявку.
Чтобы бот НЕ увидел кнопку, нужно просто сделать собственную кнопку отправки формы и запретить Submit по Enter. И все.
Ниже скрипт, который убирает кнопку Submit по ID формы и добавляет кнопку НАРИСОВАННУЮ через Canvas, и только при клике на эту нарисованную кнопку форма будет отправлена.
Просто ИНТЕГРИРУЙТЕ себе скрипт ниже и кнопки у вас будут уникальные и бот по ним не кликнет:
<script>
// Скрипт замкеняет стандартуню кнопку Submit для формы
const FORM_ID = 'leadForm'; // ID формы в которой заменить кнопку, для старой кнопки будет выставлено display:none , сабмит перехватывается JSом и ничего не произойдет. т.е. поведенческий бот не сможет отправить форму нажатием enter.
const BTN_TEXT = 'Отправить'; // Текст кнопки
// Стиль кнопки
const BTN_STYLE = {
width: '120px', // Ширина
height: '44px', // Высота
cursor: 'pointer', // Курсор
display: 'inline-block', // Чтобы вел себя как кнопка
borderRadius: '6px', // Скругление
overflow: 'hidden' // Чтобы канвас не вылезал за границы
};
// Цвета для Canvas кнопки
const COLORS = {
background: '#007bff', // Цвет фона
text: '#ffffff', // Цвет текста
hoverBackground: '#0056b3', // Цвет фона при наведении
hoverText: '#ffffff' // Цвет текста при наведении
};
document.addEventListener('DOMContentLoaded', function() {
const form = document.getElementById(FORM_ID);
if (!form) return;
// Скрываем оригинальную кнопку
const oldBtn = form.querySelector('#edit-submit'); //тут нужно ввести ID оригинальной кнопки формы которую будет скрывать
if (oldBtn) oldBtn.style.display = 'none';
// Блокируем отправку формы по ентер
form.addEventListener('keydown', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
e.stopPropagation();
}
});
const btnWrapper = document.createElement('div');
Object.assign(btnWrapper.style, BTN_STYLE);
const canvas = document.createElement('canvas');
canvas.width = parseInt(BTN_STYLE.width);
canvas.height = parseInt(BTN_STYLE.height);
canvas.style.display = 'block';
canvas.style.width = '100%';
canvas.style.height = '100%';
function drawCanvas(bgColor, textColor) {
const ctx = canvas.getContext('2d');
const w = canvas.width;
const h = canvas.height;
const radius = 6; // Скругление для канваса
ctx.clearRect(0, 0, w, h);
ctx.beginPath();
ctx.moveTo(radius, 0);
ctx.lineTo(w - radius, 0);
ctx.quadraticCurveTo(w, 0, w, radius);
ctx.lineTo(w, h - radius);
ctx.quadraticCurveTo(w, h, w - radius, h);
ctx.lineTo(radius, h);
ctx.quadraticCurveTo(0, h, 0, h - radius);
ctx.lineTo(0, radius);
ctx.quadraticCurveTo(0, 0, radius, 0);
ctx.closePath();
ctx.fillStyle = bgColor;
ctx.fill();
// Рисуем название кнопки на канвасе
ctx.fillStyle = textColor;
ctx.font = 'bold 16px Arial, sans-serif';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText(BTN_TEXT, w / 2, h / 2);
}
drawCanvas(COLORS.background, COLORS.text);
btnWrapper.appendChild(canvas);
btnWrapper.addEventListener('mouseenter', function() {
drawCanvas(COLORS.hoverBackground, COLORS.hoverText);
});
btnWrapper.addEventListener('mouseleave', function() {
drawCanvas(COLORS.background, COLORS.text);
});
// Вставляем канвас после формы
form.parentNode.insertBefore(btnWrapper, form.nextSibling);
// Отправлякм форму по клику на канвас
btnWrapper.addEventListener('click', function() {
form.submit();
});
});
</script>Добавьте скрипт выше к себе на лендинг, пропишите в нем ID формы и ID кнопки — и кнопка заменится под ключ, а ботовского спама у вас НЕ будет.
Но это НЕ избавит от реального МОТИВИРОВАННОГО спама — если спамит реальный: он и любую капчу решит и на любую кнопку ткнёт.
3. Избавляемся от тех, кто кликает по моей рекламе ПОСТОЯННО
Это называется мотивированный склик — когда реальный пользователь кликает, чтобы вас скликать. В Вебвизоре зачастую это выглядит так (в данном примере все клики с возвратами и с одного диапазона IP):
Такое поведение от одного посетителя способно съесть весь бюджет. Странно, но Директ снимает цену за каждый такой клик, несмотря на повторные визиты и один и тот же диапазон IP.
Выход тут только ОДИН: пометить эти визиты в Метрике, сделать на их основе сегмент и ВЫЧЕСТЬ его в настройках рекламной кампании. И это РЕАЛЬНО работает.
Как нужно действовать:
Спамные визиты от реальных пользователей помечаем в Метрике в параметрах посетителя (например, отправляем параметр mot.true). Сделать это можно самостоятельно с использованием моего кода отправки параметров из пункта 1, или с помощью любого другого сервиса или CRM которая поддерживает.
На основании параметра посетителя mot.true создаём сегмент аудитории в метрике:
Переходим в Директ и на основании этого сегмента создаём аудиторию мотивированных:
В настройках кампании Яндекс Директ для этой созданной аудитории мотивированных делаем корректировку «-100%»:
Это реальный кейс и это реально работает. Поэтому, если вы видите такие «возвратные визиты» в вашей поисковой кампании, то не смотрите на них, а минусуйте — это сэкономит средства и сделает стоимость заявки дешевле.
Парни, которые настраивают и ведут Яндекс.Директ — это реальные волшебники. Это действительно очень большая работа, а не как может показаться, что раз ткнул и тебя завалило деньгами.
4. Минусуем ботов на основании собственного сайта
С рекламы, помимо очевидных мотивированных визитов, есть и есть много мусорных визитов. Мы должны настроить кампанию так, чтобы этим визитам и похожим на них реклама бы НЕ показывалась.
Общая идея такая же как и в пункте 3: каждый мусорный визит в Метрике мы помечаем как бот, на основании этих визитов создаём сегмент и в Директе применяем к нему корректировку ставок «‑ 100%»
Вручную это делать не вариант. Эту задачу решают антибот‑сервисы для Яндекс Директ.
Все антибот сервисы для Яндекс Директа работают по одному принципу: в Метрике (в параметрах посетителя) эти ботовские визиты помечаются. На основании этих визитов создаётся сегмент аудитории, и эта аудитория вычитается из кампании.
Если вы НЕ хотите использовать сторонний сервис, то сегмент аудитории можно создать просто на основании битых рекламных визитов. Например создайте сегмент по условию: «Визит из рекламы и отказ» или «Визит из рекламы и 0 секунд на сайте» — так тоже можно пробовать и экспериментировать.
ОБЯЗАТЕЛЬНО: перед тем, как создать аудиторию и минусовать нужно прямо глазами в вебвизоре посмотреть, что в сегмент попали именно мусорные визиты:
На скрине выше — пример подписи визитов ботов в Яндекс Метрике. Эта подпись может отличаться в зависимости от того, какой антибот сервис вы используете. Зачастую надпись может быть как {название_сервиса.bot}.
Далее (как и в пункте 3 выше) на основе этих визитов нужно создать сегмент и вычесть из кампании Директа.
При создании сегмента в Директе ВАЖНО расшарить сегмент еще и на ПОХОЖИХ: Чтобы и похожие на этих ботов так же бы минусовались. Т.е. при создании аудитории ботов в Директе обязательно выберите «Выбранный сегмент И похожие пользователи»:
Если нужна реально большая аудитория для минусации (от 500к-4млн), то можно заморочаться и создать аудиторию на основании сегмента ботов в метрике через Яндекс Аудитории.
5. Минусуем ОБЩУЮ по всем сайтам аудиторию ботов
Хочется, чтобы реклама НЕ показывалась не только ботам твоего сайта (и похожим), но и другим ботам.
Поэтому есть вариант подключить к своей кампании Яндекс.Директ общие аудитории ботов, которые формируют сторонние сервисы на основании данных сразу с большого количества сайтов.
Общая аудитория ботов по всем сайтам формируется так же по одному принципу: антибот сервисы помечают ботные визиты в метрике в параметрах посетителей, и на основании этих визитов по всем сайтам формируют общую аудиторию.
Общие аудитории подключаем так же. В личном кабинете Яндекс.Директа создаем аудиторию на основе общего сегмента ботов:
В настройках рекламной кампании Яндекс.Директ выставляем корректировку ставок на аудиторию «-100%»:
ВАЖНО!
Если вы используете общие аудитории для минусации, вы должны четко понимать, как именно они работают и какие именно визиты в них попадают. Некачественно собранная аудитория будет урезать показы и конверсии.
6. Лайфхак для всех: Доказываем, что заявку оставляет именно бот
Эта схема подойдет для ЛЮБОЙ рекламной системы.
Идея — нужно поменять кодировку на сайте, сайт будет выглядеть как «кракозябры». Пользователь зайдёт на сайт, увидит кракозябры и уйдет. А ботик с радостью ознакомится с контентом, покликает и обязательно что‑нибудь «прикупит»:
Делаем так:
Определяемся с сайтом и создаём для него кампанию
Выбираем стратегию «конверсии» с целью «Отправка формы». ИЛИ конверсию — «посмотрел более 4х страниц», например — так тоже будет работать.
Проходим модерацию.
Запускаем рекламу.
На сайт добавляем JS скрипт, который сменит кодировку страницы.
Ниже скрипт для смены кодировки сайта, его нужно разместить в head:
<script>
// После полной загрузки страницы делаем перекодировку
// ВНИМАНИЕ! тут перекодируется ВСЯ страница - и названия полей формы в том числе.
// Чтобы бот гарантированно понял бы что на форме написано -
// надписи на форме лучше сделать на английском
// (или доработайте этот скрипт чтобы он текст формы бы не перекодировал).
window.addEventListener('DOMContentLoaded', function() {
document.body.innerHTML = new TextDecoder('windows-1251').decode(
new TextEncoder().encode(document.body.innerHTML)
);
});
</script>
Все, после добавления этого кода ваш сайт будет как на скрине выше. Обратите внимание, что скрипт перекодирует всю страницу. Поэтому названия полей формы лучше напишите на английском или форму НЕ перекодируйте — чтобы бот точно смог бы прочитать названия).
Понятно, что реальный пользователь с таким сайтом дел иметь НЕ будет, а Вебвизоре вы увидите, что по сайту ходят боты, и что заявку оставляют боты.
НО заплатить за эти клики придется БЕЗ ВОЗВРАТА. То есть, убедиться в том, что визит действительно был ботом, можно исключительно для себя. Деньги никто не вернет.
Пожалуйста, кто‑нибудь сделайте такой кейс и выложите — будет очень интересно почитать.
Я уже достаточно потратился и больше не хочу:‑)