PHP скрипт от скликивания денег в Яндекс Директе


28-11-2018
Денис Л.
Seo
10
1121
PHP скрипт от скликивания денег в Яндекс Директе

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

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

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

Второму столбцу вводим имя - direct_ip, тип - 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
$link = mysqli_connect('имя_хоста', 'имя_пользователя', 'пароль', 'имя_БД');
$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;
// p.s. само собой, оператор ?? мы используем только если у нас PHP версии 7.0 и выше. Если ниже, то пишем так: if (isset($_GET['yclid'])) $yclid = $_GET['yclid'];

$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');
?>

Если Вам удобнее настроить отправку данных с помощью AJAX, тогда код отправки данных будет такой:

<script>
var locSearch = document.location.search;

if(/\?yclid=/i.test(locSearch)) {
    $.ajax({
        type: "POST",
        url: "/direct_warning.php",
        data: {
            yclid: locSearch
        },
        success: function(response) {
            console.log('Данные отправлены');
        }
    });
}
</script>

Тестируем скрипт. Для этого копируем с объявления на Директе 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($_SERVER["DOCUMENT_ROOT"]."/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($_SERVER["DOCUMENT_ROOT"]."/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);
}

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

Подписывайтесь на группу в ВКонтакте, вступайте в сообщество на Facebook, чтобы всегда быть в курсе актуальных выпусков
Web development blog!

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

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

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