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

Сегодня хочу рассмотреть несколько способов отсеивания дубликатов лидов, а также бороться с нежелательными пользователями, которые пытаются поднасрать в формах на наших лендингах.
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;
}
Подводя итог, использование скриптов для отсечения дубликатов лидов и ограничения числа отправок заявок помогает существенно повысить качество трафика. Это делает вашу работу более эффективной и приносит пользу всей команде. Внедряйте эти методы и делитесь своими результатами в нашем телеграмм канале. Ваша обратная связь очень важна!
И по традиции для тех кому весь этот разбор по большому счету боком, прикрепляю файл с обеими функциями внутри)

