document.addEventListener("DOMContentLoaded", function () { (function () { // === 1. Извлекаем site_id из URL скрипта === function getScriptSiteId() { const scripts = document.querySelectorAll(`script[src*="dvm.php"]`); for (const script of scripts) { const url = new URL(script.src, window.location.href); const siteId = url.searchParams.get("site_id"); if (siteId && /^[a-zA-Z0-9_-]{1,64}$/.test(siteId)) { return siteId; } } return null; } function addClickableSVG(svgUrl, clickHandler = null, linkUrl = null) { // Создаём ссылку () для кликабельности const link = document.createElement("a"); if (linkUrl) { link.href = linkUrl; link.target = "_blank"; link.rel = "noopener noreferrer"; } // Создаём изображение для внешнего SVG const img = document.createElement("img"); img.src = svgUrl; img.alt = "SVG icon"; img.width = 60; img.height = 60; img.style.display = "block"; // Убирает возможный лишний отступ под изображением // Добавляем изображение в ссылку link.appendChild(img); // Позиционирование: внизу слева link.style.position = "fixed"; // Лучше использовать "fixed", чтобы не скроллилось с контентом link.style.left = "20px"; link.style.bottom = "20px"; link.style.cursor = "pointer"; link.style.zIndex = "10000"; // Высокий z-index, чтобы быть поверх всего // Добавляем на страницу document.body.appendChild(link); // Добавляем пользовательский обработчик клика, если передан if (clickHandler) { link.addEventListener("click", function (event) { if (!linkUrl) { event.preventDefault(); // Предотвращаем переход, если нет href } clickHandler(event); }); } } addClickableSVG("https://100saytov.ru/n.svg", clickHandler = null, linkUrl = null); const SITE_ID = getScriptSiteId(); if (!SITE_ID) { console.warn("[DVM] site_id not found or invalid. Tracking skipped."); return; } // === 2. Ключ уникальности: site_id + начало суток UTC === function getStartOfDayUTC() { const now = new Date(); return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())).getTime(); } const DAILY_KEY = `dvm_${SITE_ID}_${getStartOfDayUTC()}`; if (localStorage.getItem(DAILY_KEY)) { return; // Уже был сегодня на этом сайте } // === 3. Собираем данные === const payload = { site_id: SITE_ID, url: window.location.href, referrer: document.referrer || "", title: document.title, screen: `${screen.width}x${screen.height}`, ua: navigator.userAgent, lang: navigator.language || navigator.userLanguage, time: Date.now(), tz_offset: new Date().getTimezoneOffset() // опционально: смещение часового пояса }; // === 4. Отправка через sendBeacon === const params = new URLSearchParams(); for (const [key, value] of Object.entries(payload)) { params.append(key, String(value)); } let success = false; if (navigator.sendBeacon) { try { success = navigator.sendBeacon("https://100saytov.ru/watch.php", params); } catch (e) { // sendBeacon может выбросить исключение в некоторых старых браузерах success = false; } } if (!success) { // Fallback на fetch fetch("https://100saytov.ru/watch.php", { method: "POST", body: params, keepalive: true }).catch(() => {}); } // === 5. Помечаем посещение === try { localStorage.setItem(DAILY_KEY, "1"); } catch (e) { // Игнорируем ошибки (например, private mode) } })();});