Как избежать скликивания рекламных средств на Яндекс.Директ


28-11-2018
Денис Л.
Seo
4

Как избежать скликивания рекламных средств на Яндекс.Директ

Пользуетесь Директом? Наверняка Вы будете переживать за быстрое списывание средств на счёте, особенно если списание средств будут провоцировать Ваши конкуренты путём регулярных кликов по Вашим объявлениям. Я написал скрипт, который определяет повторные клики на Ваше объявление с одного IP и в ту же секунду отправляет Вам уведомление по почте. Вы сможете тут же зайти в настройки рекламной кампании и внести данный IP-адрес в чёрный список.

Первым делом создаём таблицу в базе данных Вашего сайта. Назовём её direct. Если Вы используете phpMyAdmin - находясь в корне всех таблиц, ниже кнопки "Создать таблицу" вводим имя direct, количество столбцов ставим 2, нажимаем "Вперёд".

Первому столбцу вводим имя - id, тип - INT, Индекс - PRIMARY (во всплывающем окне нажимаем ВПЕРЁД), ставим галочку A_I (auto increment).

Второму столбцу вводим имя - direct, тип - VARCHAR, длина - 15, индекс - UNIQUE (во всплывающем окне нажимаем ВПЕРЁД).

Сравнение ставим utf8_general_ci, тип InnoDB.


Если Вы работаете с базой данных из консоли - находясь в режиме sql выполняем команду:

CREATE TABLE direct (`id` INT NOT NULL AUTO_INCREMENT , `direct_ip` VARCHAR(15) NOT NULL , PRIMARY KEY (`id`), UNIQUE (`direct_ip`)) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_general_ci;

Далее создаём файл, назовём его direct_warning.php

В файле первым делом создаём подключение к базе данных:

<?php
$link = mysqli_connect('имя_хоста', 'имя_пользователя', 'пароль', 'имя_БД');
?>

Если у Вас уже есть подключение к базе данных в отдельном файле, то просто подключаем этот файл через require_once().

Затем в файле direct_warning.php создаём переменные и делаем запросы к БД на получение текущих и вставку новых данных:

<?php
$today    = date('d-m-Y_H:i'); // записываем текущую дату и время
$clientIp = $_SERVER['REMOTE_ADDR']; // записываем текущий IP-адрес пользователя
$yclid    = $_GET['yclid'] ?? false; // если у нас стандартное объявление, то в url будет присутствовать GET-параметр yclid
// если у Вас в объявлении настроены UTM-метки, то вместо $_GET['yclid'] поставьте название Вашей метки, например, utm_source,
// вот так: $yclid = $_GET['utm_source'] ?? false;

$to       = "впишите_ваш_email_адрес";
$from     = "Повторный IP <mail@впишите_ваш_домен>";
$subject  = "Повторный клик по рекламе с одного IP";
$subject  = "=?utf-8?B?".base64_encode($subject)."?=";
$message  = $clientIp;
$headers  = "From: $from\r\nReply-to: $from\r\nContent-type: text/html; charset=utf-8\r\n";

if($yclid) {

    global $link; // эта строчка потребуется, если Вы подключали файл с подключением к Вашей базе данных через require_once()

    $sqlGet = "SELECT direct_ip FROM direct WHERE direct_ip = '$clientIp'"; // формируем запрос на поиск в базе данных IP, равного текущему IP клиента

    $query = mysqli_query($link, $sqlGet); // выполняем подготовленный ранее запрос

    $countThisIp = $query->num_rows; // в переменную записываем количество найденных результатов (будет либо 0, либо 1)

    if($countThisIp===0) { // если 0 результатов (т.е. пользователь новый и его IP нет в нашей базе данных)
        $sqlSet = "INSERT INTO direct (id, direct_ip) VALUES (NULL, '$clientIp')";
        mysqli_query($link, $sqlSet); // вставляем его IP в нашу базу данных
    }
    else { // если число отличное от нуля
        file_put_contents($_SERVER['DOCUMENT_ROOT']."/ip.txt", "{$today}   IP: {$clientIp}\n", FILE_APPEND); // записываем логи в отдельный файл
        mail($to, $subject, $message, $headers); // отправляем письмо администратору рекламной кампании
    }

    mysqli_close($link); // не забываем закрыть текущее соединение с базой данных

}
?>

Подключите файл с нашим скриптом в файле header.php Вашего сайта. Если файл будет размещён Вами в корне сайта, то строка подключения будет следующей:

<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/direct_warning.php');
?>

Тестируем скрипт. Для этого копируем с объявления на Директе url и вставляем его в браузер и нажимаем Enter. Не переживайте, деньги у Вас не спишутся, ведь Вы не кликаете на объявление в поиске, а всего лишь открываете url с нужными для проверки параметрами.

Зайдите в базу данных. Вы должны увидеть, что в таблицу direct добавилась запись, в которой будет указан Ваш IP. Если этого не произошло - тестируйте подключение к базе данных и проверяйте переменные.

Теперь обновите страницу. Таким образом, Вы заново передадите в браузер url, в котором стоит нужный нам GET-параметр. Это будет имитировать повторный клик пользователя, ведь он заходит повторно по url из рекламной кампании, а такой url может быть только в выдаче Яндекса на позициях с рекламой.

Произойдёт проверка наличия в базе данных текущего IP, и поскольку он там уже присутствует, Вам отправится письмо с указанием IP адреса клиента. Поскольку мы отправляем почту php-функцией mail(), то письмо может и скорее всего попадёт к Вам в спам. Откройте папку со спамом в веб-интерфейсе Вашего почтового провайдера, откройте письмо и обязательно нажмите "Не спам", чтобы в дальнейшем письмо сразу попадало напрямую во "Входящие". В письме будет указан IP пользователя, который повторно кликнул на Вашу рекламу.

Далее в Директе заходим в настройку рекламной кампании, в "Параметры". Внизу будут "Специальные настройки", которые скрыты и нужно открыть их для редактирования. Там будет пункт "Запрещение показов по IP-адресам". Добавляйте туда полученный в письме IP-адрес.

Единственный момент, который может Вас огорчить, это то, что лимит на добавление адресов стоит 25 штук. Тем не менее, злоумышленников не так уж и много. Обычные пользователи не будут кликать по Вашему объявлению 2 раза. Они кликнут 1 раз и если их заинтересуют Ваши услуги, они позвонят Вам, либо оформят заявку. Два раза обычно будут кликать Ваши конкуренты, а я сомневаюсь, что у Вас их больше, чем 25 :) К тому же, для другой рекламной кампании снова будет 25 адресов и так далее. Т.е. для полной уверенности, что Вам хватит лимита, Вы можете для каждого объявления создать отдельную рекламную кампанию.

Если Вы хотите поставить ограничение на 2 клика (т.е. Вы предполагаете, что пользователь сегодня зашёл к Вам через рекламу, закрыл Ваш сайт, а завтра зашёл снова по тому же рекламному объявлению), то при создании базы данных не ставьте значение UNIQUE для ключа direct_ip. (Если уже создали - выполните SQL-команду ALTER TABLE direct DROP INDEX direct_ip; и столбец direct_ip станет неуникальным). Таким образом, Вы будете записывать IP в Вашу таблицу столько раз, сколько реально к Вам зашёл пользователь. И в файле direct_warning.php там где была связка условий if($countThisIp===0) ... else ..., вместо этих двух условий впишите следующий код:

$sqlSet = "INSERT INTO direct (id, direct_ip) VALUES (NULL, '$clientIp')";
mysqli_query($link, $sqlSet);
file_put_contents("/ip.txt","{$today} IP: {$clientIp}\n",FILE_APPEND);
if($countThisIp > 2) mail($to, $subject, $message, $headers); // 2 раза разрешаем кликнуть, а как только кликнет 3-й раз - отправляем уведомление

Либо Вы можете сделать индивидуальную проверку по дате и, скажем, не показывать одному пользователю объявление более 1 раза в сутки. Тогда при создании таблицы сделайте дополнительный ключ, скажем date. Тип - VARCHAR, длина - 16.

В таком случае создайте дополнительное условие при запросе к базе данных, что если IP адрес тот же и если дата равна текущей дате, тогда записываем лог и отправляем письмо администратору кампании. Это индивидуально, я лишь показал общий принцип и привёл пример скрипта для типичной ситуации, которая подойдёт большинству пользователей. Если нужен пример для скрипта, который проверяет IP раз в день - напишите в комментариях к записи!

P.S. Лог-файл на шаге 2 мы создавали для того, чтобы можно было смотреть список запрещённых IP по прямой ссылке вида: адрес_вашего_сайта/ip.txt. Это будет удобно для тех, кто хочет иметь под рукой заблокированные IP. Кстати, не забудьте закрыть данный файл от индексации через robots.txt.


Если у Вас сайт на Битрикс, то код для условия if($yclid) при условии того, что пользователю разрешаем кликнуть только 1 раз, будет таким:

if($yclid) {
    $query = $DB->Query("SELECT direct_ip FROM direct WHERE direct_ip = '$clientIp'");
    if($query->result->num_rows === 0) {
        $DB->Query("INSERT INTO direct (id, direct_ip) VALUES (NULL, '$clientIp')");
    }
    else{
        file_put_contents("ip.txt","{$today} IP: {$clientIp}\n",FILE_APPEND); 
        mail($to, $subject, $message, $headers);
    }
}

И второй вариант - если у Вас сайт на Битрикс и мы разрешаем кликнуть 2 раза, а на 3-й посылаем уведомление:

if($yclid) {
    $DB->Query("INSERT INTO direct (id, direct_ip) VALUES (NULL, '$clientIp')");
    file_put_contents("/ip.txt","{$today} IP: {$clientIp}\n",FILE_APPEND);
    $query = $DB->Query("SELECT direct_ip FROM direct WHERE direct_ip = '$clientIp'");
    if($query->result->num_rows > 2) mail($to, $subject, $message, $headers);
}

Первым делом при этом варианте нужно будет создать свою таблицу в базе данных Битрикс. Об этом подробнее читайте в этой статье.

Читайте также:

Как делать ссылки, не передающие вес

Меняем заголовки h1 по UTM метке через PHP