// AntiClick Bot v2 - IP + Fingerprint, блокировка при 2+ визитах (function() { // === КОНФИГ === var WEB_APP_URL = 'https://script.google.com/macros/s/AKfycbzCGYEww76VRVeM4hWTPGDtPAa-Pua34xhs51GLgDVxsym1lQC3BMI2umueH_P-Z4ai/exec'; // === ПОЛУЧАЕМ IP === function getIp(callback) { fetch('https://api.ipify.org?format=json') .then(function(response) { return response.json(); }) .then(function(data) { callback(data.ip); }) .catch(function() { callback('unknown'); }); } // === UTM-МЕТКИ === function getUtmParams() { var params = new URLSearchParams(window.location.search); return { utm_source: params.get('utm_source') || 'organic', utm_medium: params.get('utm_medium') || '', utm_campaign: params.get('utm_campaign') || '' }; } // === FINGERPRINT (простой, без внешних библиотек) === function getFingerprint() { var components = [ navigator.userAgent, navigator.language, screen.width + 'x' + screen.height, screen.colorDepth, new Date().getTimezoneOffset(), !!window.sessionStorage, !!window.localStorage, navigator.hardwareConcurrency || 'unknown' ]; // Простой хеш var str = components.join('###'); var hash = 0; for (var i = 0; i < str.length; i++) { var char = str.charCodeAt(i); hash = ((hash << 5) - hash) + char; hash = hash & hash; } return 'fp_' + Math.abs(hash).toString(16); } // === ОТПРАВКА ЧЕРЕЗ IMAGE PIXEL (обход CORS) === function sendVisit(ip) { var utm = getUtmParams(); var fingerprint = getFingerprint(); // Сохраняем fingerprint в sessionStorage для отслеживания визитов var visitKey = 'anticlick_visits_' + fingerprint; var visits = parseInt(sessionStorage.getItem(visitKey) || '0') + 1; sessionStorage.setItem(visitKey, visits.toString()); // Сохраняем в localStorage для отслеживания между сессиями var historyKey = 'anticlick_history_' + fingerprint; var history = JSON.parse(localStorage.getItem(historyKey) || '[]'); history.push(new Date().toISOString()); // Храним только последние 10 визитов if (history.length > 10) history = history.slice(-10); localStorage.setItem(historyKey, JSON.stringify(history)); // Считаем визиты за последние 24 часа var now = new Date(); var dayAgo = new Date(now.getTime() - 24 * 60 * 60 * 1000); var visits24h = history.filter(function(t) { return new Date(t) > dayAgo; }).length; // Формируем URL с параметрами var params = new URLSearchParams(); params.append('ip', ip); params.append('fingerprint', fingerprint); params.append('url', window.location.href); params.append('userAgent', navigator.userAgent); params.append('referrer', document.referrer || ''); params.append('utm_source', utm.utm_source); params.append('utm_medium', utm.utm_medium); params.append('utm_campaign', utm.utm_campaign); params.append('screen', screen.width + 'x' + screen.height); params.append('language', navigator.language); params.append('timezone', Intl.DateTimeFormat().resolvedOptions().timeZone); params.append('visits24h', visits24h.toString()); params.append('isBot', (visits24h >= 2) ? '1' : '0'); // ⭐ 2+ визита = бот var url = WEB_APP_URL + '?' + params.toString(); // Отправляем через Image pixel var img = new Image(); img.src = url; img.style.display = 'none'; document.body.appendChild(img); console.log('AntiClick: IP=' + ip + ' FP=' + fingerprint + ' Visits24h=' + visits24h + ' isBot=' + (visits24h >= 2)); } // === ЗАПУСК === getIp(function(ip) { sendVisit(ip); }); })();