Одна из моих любимых рубрик: Полезности.
Сегодня рассмотрим несколько скриптов, которые я использую в команде.
Не устану повторять, что задача разработчика в любой команде не только делать интеграции и дальше передавать дело байерам, но и максимально быть включенным в процессы команды. Он должен делать все возможное для оптимизации и повышения качества трафика. Если байер не может особо повлиять на качество лидов со своей стороны, то технарь – это тот человек, который должен всеми средствами повысить этот показатель. И хотя об этом в основном в команде особо никто не знает, такой путь мы выбрали сами. Будем называть себя Бэтменами! 🦇

Сегодня хочу рассмотреть несколько способов отсеивания дубликатов лидов, а также бороться с нежелательными пользователями, которые пытаются поднасрать в формах на наших лендингах.
1. Запрещаем отправлять более 2-х лидов за 24 часа с одного устройства.
Этот код предназначен для предотвращения множественных отправок формы пользователем в течение 24 часов. Давайте разберем его пошагово:
- Прослушивание события загрузки DOM:
document.addEventListener("DOMContentLoaded", function () {
Этот код ждет, пока вся структура HTML страницы полностью загрузится и проанализируется браузером перед выполнением скрипта.
- Нахождение формы на странице:
const form = document.querySelector("form");
Этот код ищет первый элемент <form>
на странице и сохраняет его в переменную form
.
- Прослушивание события отправки формы:
form.addEventListener("submit", function (event) {
Этот код добавляет обработчик события submit
к форме. Это означает, что когда форма отправляется, вызывается данная функция.
- Отмена стандартного поведения формы:
event.preventDefault();
При вызове event.preventDefault()
браузер не выполняет стандартное поведение отправки формы, что позволяет обработать данные формы программно.
- Получение текущего времени:
const now = Date.now();
Получает текущее время в миллисекундах с 1 января 1970 года (начало эпохи Unix).
- Получение логов запросов из
localStorage
:
const requestLogs = JSON.parse(localStorage.getItem('requestLogs')) || [];
Этот код получает лог запросов из localStorage
(если он существует) и парсит его в объект JavaScript. Если логов нет, создается пустой массив.
- Фильтрация логов старше 24 часов:
const filteredLogs = requestLogs.filter(log => (now - log.timestamp) < 24 * 60 * 60 * 1000);
Этот код фильтрует логи, оставляя только те, которые были созданы за последние 24 часа. Для этого проверяется разница между текущим временем и временем каждого лога.
- Проверка количества запросов за 24 часа:
if (filteredLogs.length >= 2) { window.location.href = 'error.php'; } else {
Если за последние 24 часа было больше двух попыток отправки формы (включая текущую), пользователь перенаправляется на страницу error.php
.
- Добавление текущей попытки в логи и сохранение их в
localStorage
:
filteredLogs.push({ timestamp: now }); localStorage.setItem('requestLogs', JSON.stringify(filteredLogs));
Если количество запросов за 24 часа меньше двух, текущая попытка добавляется в массив логов, который затем сохраняется в localStorage
.
- Отправка формы:
form.submit();
- После обновления логов форма отправляется как обычно.
Зачем нужен этот код на сайте?
Этот код предназначен для защиты от многократной отправки формы пользователем в течение 24 часов. Это может быть полезно, например, для предотвращения спама или перегрузки сервера многократными запросами.
- Защита от спама: Ограничивает количество раз, когда форма может быть отправлена, что препятствует злоупотреблению.
- Предотвращение ошибок пользователя: Если пользователь случайно пытается отправить форму несколько раз, это предотвратит многократные отправки.
- Снижение нагрузки на сервер: Уменьшает количество запросов к серверу, особенно если форма отправляет данные, требующие обработки на сервере.
Таким образом, этот скрипт помогает поддерживать стабильность и безопасность вашего веб-сайта.
Полный код скрипта ниже. Подключать на страницу index, перед закрывающим тегом head.
<script> document.addEventListener("DOMContentLoaded", function () { const form = document.querySelector("form"); form.addEventListener("submit", function (event) { event.preventDefault(); const now = Date.now(); const requestLogs = JSON.parse(localStorage.getItem('requestLogs')) || []; const filteredLogs = requestLogs.filter(log => (now - log.timestamp) < 24 * 60 * 60 * 1000); if (filteredLogs.length >= 2) { window.location.href = 'error.php'; } else { filteredLogs.push({ timestamp: now }); localStorage.setItem('requestLogs', JSON.stringify(filteredLogs)); form.submit(); } }); }); </script>
2. Запрещаем отправлять лиды с одинаковыми номерами телефонов и ведем логирование данных.
Этот код состоит из двух функций и логики, предназначенной для предотвращения дублирования телефонных номеров в системе заявок. Давайте разберем его подробно:
Функция isDuplicateLead
function isDuplicateLead($phone) { $file = 'leads.txt'; if (!file_exists($file)) { file_put_contents($file, ''); } $leads = file_get_contents($file); $escapedPhone = preg_quote($phone, '/'); $phonePattern = '/' . $escapedPhone . "\n/"; if (preg_match($phonePattern, $leads)) { return true; } else { file_put_contents($file, $phone . "\n", FILE_APPEND); return false; } }
- Проверка наличия файла:
$file = 'leads.txt'; if (!file_exists($file)) { file_put_contents($file, ''); }
Определяется имя файла leads.txt
, в котором будут храниться номера телефонов. Если файл не существует, он создается.
- Чтение содержимого файла:
$leads = file_get_contents($file);
Содержимое файла leads.txt
считывается и сохраняется в переменной $leads
.
- Экранирование специального символа в номере телефона:
$escapedPhone = preg_quote($phone, '/');
Номер телефона экранируется, чтобы его можно было безопасно использовать в регулярных выражениях.
- Создание шаблона для поиска номера телефона:
$phonePattern = '/' . $escapedPhone . "\n/";
Создается шаблон регулярного выражения, который будет искать номер телефона, за которым следует символ новой строки.
- Поиск номера телефона в файле:
if (preg_match($phonePattern, $leads)) { return true; }
Если номер телефона найден в файле, функция возвращает true
.
- Добавление номера телефона в файл:
else { file_put_contents($file, $phone . "\n", FILE_APPEND); return false; }
- Если номер телефона не найден, он добавляется в файл, и функция возвращает
false
.
Функция cleanPhoneNumber
function cleanPhoneNumber($phoneNumber) { return preg_replace('/[^0-9]/', '', $phoneNumber); }
- Очистка номера телефона:
return preg_replace('/[^0-9]/', '', $phoneNumber);
Функция cleanPhoneNumber
удаляет все символы, кроме цифр, из номера телефона. Это полезно для унификации формата телефонных номеров и предотвращения ошибок при сравнении.
Основная логика
$cleanedPhone = cleanPhoneNumber($_POST['phone']); if (isDuplicateLead($cleanedPhone)) { header('Location: error.php'); exit; }
- Очистка номера телефона, полученного из формы:
$cleanedPhone = cleanPhoneNumber($_POST['phone']);
Номер телефона, полученный из формы, очищается с помощью функции cleanPhoneNumber
.
- Проверка на дублирование:
if (isDuplicateLead($cleanedPhone)) { header('Location: error.php'); exit; }
Если функция isDuplicateLead
возвращает true
, это означает, что номер телефона уже существует в файле leads.txt
. Пользователь перенаправляется на страницу error.php
, и выполнение скрипта прекращается с помощью exit
.
Зачем нужен этот код на сайте?
- Предотвращение дублирования заявок: Код предотвращает многократное добавление одного и того же номера телефона в систему, что может быть полезно для избежания спама или ошибочных повторных заявок.
- Упрощение управления заявками: Хранение номеров телефонов в файле
leads.txt
позволяет легко проверять, были ли уже добавлены определенные номера. - Улучшение пользовательского опыта: Если пользователь пытается отправить заявку с уже существующим номером телефона, его перенаправляют на страницу ошибки, что позволяет ему понять, что его заявка уже была получена.
Этот код помогает поддерживать целостность данных и предотвращает дублирование заявок, обеспечивая более эффективную работу системы.
Данный код необходимо использовать на странице api.php, сразу после открывающего тега <?php. Полный код:
function isDuplicateLead($phone) { $file = 'leads.txt'; if (!file_exists($file)) { file_put_contents($file, ''); } $leads = file_get_contents($file); $escapedPhone = preg_quote($phone, '/'); $phonePattern = '/' . $escapedPhone . "\n/"; if (preg_match($phonePattern, $leads)) { return true; } else { file_put_contents($file, $phone . "\n", FILE_APPEND); return false; } } function cleanPhoneNumber($phoneNumber) { return preg_replace('/[^0-9]/', '', $phoneNumber); } $cleanedPhone = cleanPhoneNumber($_POST['phone']); if (isDuplicateLead($cleanedPhone)) { header('Location: error.php'); exit; }
Подводя итог, использование скриптов для отсечения дубликатов лидов и ограничения числа отправок заявок помогает существенно повысить качество трафика. Это делает вашу работу более эффективной и приносит пользу всей команде. Внедряйте эти методы и делитесь своими результатами в нашем телеграмм канале. Ваша обратная связь очень важна!
И по традиции для тех кому весь этот разбор по большому счету боком, прикрепляю файл с обеими функциями внутри)