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