SHOW:
|
|
- or go back to the newest paste.
| 1 | <script> | |
| 2 | document.addEventListener("DOMContentLoaded", function() {
| |
| 3 | // Настройки | |
| 4 | - | const webhookUrl = 'https://n8n-panel.ru/webhook/d998bdc2-2225-45f4-a490-9b4013de88d7'; // Замените на URL вашего вебхука |
| 4 | + | const webhookUrl = 'https://n8n-panel.ru/webhook/d998bdc2-2225-45f4-a490-9b4013de88d6'; // Замените на URL вашего вебхука |
| 5 | - | const yandexMetrikaID = '71553979'; // Замените на ID вашего счетчика Яндекс Метрики |
| 5 | + | const yandexMetrikaID = '89972470'; // Замените на ID вашего счетчика Яндекс Метрики |
| 6 | ||
| 7 | // Функция для генерации случайной строки | |
| 8 | function generateRandomString(length) {
| |
| 9 | const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; | |
| 10 | let result = ''; | |
| 11 | for (let i = 0; i < length; i++) {
| |
| 12 | const randomIndex = Math.floor(Math.random() * characters.length); | |
| 13 | result += characters[randomIndex]; | |
| 14 | } | |
| 15 | return result; | |
| 16 | } | |
| 17 | ||
| 18 | // Функция для установки cookie | |
| 19 | function setCookie(name, value, days) {
| |
| 20 | let expires = ""; | |
| 21 | if (days) {
| |
| 22 | const date = new Date(); | |
| 23 | date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); | |
| 24 | expires = "; expires=" + date.toUTCString(); | |
| 25 | } | |
| 26 | let secure = location.protocol === 'https:' ? "; Secure" : ""; | |
| 27 | document.cookie = name + "=" + (value || "") + expires + "; path=/" + secure; | |
| 28 | } | |
| 29 | ||
| 30 | // Функция для получения значения cookie по имени | |
| 31 | function getCookie(name) {
| |
| 32 | const nameEQ = name + "="; | |
| 33 | const ca = document.cookie.split(';');
| |
| 34 | for (let i = 0; i < ca.length; i++) {
| |
| 35 | let c = ca[i]; | |
| 36 | while (c.charAt(0) === ' ') c = c.substring(1, c.length); | |
| 37 | if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length); | |
| 38 | } | |
| 39 | return null; | |
| 40 | } | |
| 41 | ||
| 42 | // Функция для проверки и сохранения данных в localStorage, если куки не работают | |
| 43 | function saveData(key, value) {
| |
| 44 | try {
| |
| 45 | localStorage.setItem(key, value); | |
| 46 | } catch (e) {
| |
| 47 | console.error("Не удалось сохранить данные в localStorage:", e);
| |
| 48 | } | |
| 49 | } | |
| 50 | ||
| 51 | function loadData(key) {
| |
| 52 | try {
| |
| 53 | return localStorage.getItem(key); | |
| 54 | } catch (e) {
| |
| 55 | console.error("Не удалось загрузить данные из localStorage:", e);
| |
| 56 | return null; | |
| 57 | } | |
| 58 | } | |
| 59 | ||
| 60 | // Функция для отправки данных на вебхук | |
| 61 | function sendToWebhook(webhookUrl, data) {
| |
| 62 | fetch(webhookUrl, {
| |
| 63 | method: 'POST', | |
| 64 | headers: {
| |
| 65 | 'Content-Type': 'application/json' | |
| 66 | }, | |
| 67 | body: JSON.stringify(data) | |
| 68 | }) | |
| 69 | .then(response => response.json()) | |
| 70 | .then(data => console.log('Success:', data))
| |
| 71 | .catch((error) => console.error('Error:', error));
| |
| 72 | } | |
| 73 | ||
| 74 | // Функция для извлечения UTM-параметра из URL | |
| 75 | function getUTMParameter(name) {
| |
| 76 | const urlParams = new URLSearchParams(window.location.search); | |
| 77 | return urlParams.get(name); | |
| 78 | } | |
| 79 | ||
| 80 | // Извлекаем UTM-метки из URL и сохраняем в куки | |
| 81 | const utmSource = getUTMParameter("utm_source");
| |
| 82 | const utmCampaign = getUTMParameter("utm_campaign");
| |
| 83 | ||
| 84 | if (utmSource) {
| |
| 85 | setCookie("vechkasov_utm_source", utmSource, 30);
| |
| 86 | saveData("vechkasov_utm_source", utmSource);
| |
| 87 | } | |
| 88 | ||
| 89 | if (utmCampaign) {
| |
| 90 | setCookie("vechkasov_utm_campaign", utmCampaign, 30);
| |
| 91 | saveData("vechkasov_utm_campaign", utmCampaign);
| |
| 92 | } | |
| 93 | ||
| 94 | // Проверка, если куки не сохраняются, используем localStorage | |
| 95 | const generatedCode = getCookie("vechkasov_wa") || loadData("vechkasov_wa");
| |
| 96 | const codeGenerationTime = getCookie("vechkasov_code_time") || loadData("vechkasov_code_time");
| |
| 97 | const lastWebhookTime = getCookie("vechkasov_time") || loadData("vechkasov_time");
| |
| 98 | let currentTime = Math.floor(Date.now() / 1000); | |
| 99 | ||
| 100 | let shouldSendWebhook = false; | |
| 101 | ||
| 102 | // Проверяем, если код нужно обновить | |
| 103 | if (!generatedCode || !codeGenerationTime || (currentTime - parseInt(codeGenerationTime, 10)) > (7 * 24 * 60 * 60)) {
| |
| 104 | // Если кода нет или он старше 7 дней, генерируем новый | |
| 105 | const randomString = generateRandomString(8); | |
| 106 | setCookie("vechkasov_wa", randomString, 30);
| |
| 107 | setCookie("vechkasov_code_time", currentTime, 30);
| |
| 108 | ||
| 109 | // Сохраняем в localStorage на случай, если куки не работают | |
| 110 | saveData("vechkasov_wa", randomString);
| |
| 111 | saveData("vechkasov_code_time", currentTime.toString());
| |
| 112 | ||
| 113 | console.log("Generated new string:", randomString);
| |
| 114 | shouldSendWebhook = true; | |
| 115 | } else {
| |
| 116 | console.log("Using existing string:", generatedCode);
| |
| 117 | } | |
| 118 | ||
| 119 | // Проверяем, нужно ли отправить данные на вебхук (если прошло больше недели с последней отправки) | |
| 120 | if (!lastWebhookTime || (currentTime - parseInt(lastWebhookTime, 10)) > (7 * 24 * 60 * 60)) {
| |
| 121 | shouldSendWebhook = true; | |
| 122 | } | |
| 123 | ||
| 124 | // Получение clientID через API Яндекс Метрики | |
| 125 | function getYandexMetrikaClientID(callback) {
| |
| 126 | if (typeof Ya !== 'undefined' && typeof Ya.Metrika !== 'undefined') {
| |
| 127 | var counter = Ya.Metrika.counters[yandexMetrikaID]; | |
| 128 | if (counter) {
| |
| 129 | counter.getClientID(function(id) {
| |
| 130 | console.log("ClientID из API Метрики:", id);
| |
| 131 | callback(id); | |
| 132 | }); | |
| 133 | } else {
| |
| 134 | callback(null); | |
| 135 | } | |
| 136 | } else {
| |
| 137 | callback(null); | |
| 138 | } | |
| 139 | } | |
| 140 | ||
| 141 | // Проверка clientID через 1 секунду | |
| 142 | setTimeout(function() {
| |
| 143 | getYandexMetrikaClientID(function(clientID) {
| |
| 144 | if (!clientID) {
| |
| 145 | console.warn("Не удалось получить clientID");
| |
| 146 | clientID = getCookie("_ym_uid") || loadData("_ym_uid");
| |
| 147 | console.log("Используем clientID из куков:", clientID);
| |
| 148 | } else {
| |
| 149 | saveData("_ym_uid", clientID);
| |
| 150 | } | |
| 151 | ||
| 152 | if (shouldSendWebhook && clientID) {
| |
| 153 | // Готовим данные для отправки на вебхук | |
| 154 | const webhookData = {
| |
| 155 | clientID: clientID, | |
| 156 | generatedCode: generatedCode || getCookie("vechkasov_wa"),
| |
| 157 | generationTime: codeGenerationTime || currentTime, | |
| 158 | utmSource: utmSource || getCookie("vechkasov_utm_source") || loadData("vechkasov_utm_source"),
| |
| 159 | utmCampaign: utmCampaign || getCookie("vechkasov_utm_campaign") || loadData("vechkasov_utm_campaign")
| |
| 160 | }; | |
| 161 | ||
| 162 | console.log("Готовы отправить данные на вебхук:", webhookData);
| |
| 163 | ||
| 164 | // Отправляем данные на вебхук | |
| 165 | sendToWebhook(webhookUrl, webhookData); | |
| 166 | ||
| 167 | // Обновляем время последней отправки вебхука | |
| 168 | setCookie("vechkasov_time", currentTime, 30);
| |
| 169 | saveData("vechkasov_time", currentTime.toString());
| |
| 170 | } else if (!clientID) {
| |
| 171 | console.warn("ClientID не получен. Вебхук не отправлен.");
| |
| 172 | } | |
| 173 | ||
| 174 | // Функция для замены _NUMBER_ на сгенерированный код в href | |
| 175 | function replaceNumberInHref() {
| |
| 176 | const code = getCookie("vechkasov_wa") || loadData("vechkasov_wa");
| |
| 177 | if (code) {
| |
| 178 | const links = document.querySelectorAll('a[href*="_NUMBER_"]');
| |
| 179 | links.forEach(link => {
| |
| 180 | // Создаем новый URL-объект для безопасного изменения параметров | |
| 181 | const url = new URL(link.href); | |
| 182 | const textParam = url.searchParams.get("text");
| |
| 183 | ||
| 184 | if (textParam) {
| |
| 185 | // Заменяем _NUMBER_ на сгенерированный код | |
| 186 | const newTextParam = textParam.replace("_NUMBER_", code);
| |
| 187 | url.searchParams.set("text", newTextParam);
| |
| 188 | link.href = url.toString(); | |
| 189 | console.log("Ссылка изменена:", link.href);
| |
| 190 | } | |
| 191 | }); | |
| 192 | } else {
| |
| 193 | console.warn("Код для замены в href не найден.");
| |
| 194 | } | |
| 195 | } | |
| 196 | ||
| 197 | // Вызываем функцию замены _NUMBER_ на сгенерированный код | |
| 198 | replaceNumberInHref(); | |
| 199 | }); | |
| 200 | }, 1000); // Проверяем через 1 секунду | |
| 201 | }); | |
| 202 | ||
| 203 | </script> |