function initPixel() { if (dados_script_markting && dados_script_markting.facebook_pixel_ids) initFacebook(dados_script_markting.facebook_pixel_ids); if (dados_script_markting && dados_script_markting.google_pixel_ids) initGoogleAds(dados_script_markting.google_pixel_ids); if (dados_script_markting && dados_script_markting.tiktok_pixel_ids) initTikTok(dados_script_markting.tiktok_pixel_ids); console.log("Cookies aceitos com sucesso!"); } function initFacebook(dados) { window.initMatching = async function () { var dadosImp = await getFormInputsData(); var event_fb = { em: dadosImp.email_hash, ph: dadosImp.phone_hash, fn: dadosImp.firstname, ln: dadosImp.lastname, external_id: dadosImp.external_id, }; // const em = getQueryValue("email").toLowerCase(); // const name = getQueryValue("name") || getQueryValue("nome"); // const nameArray = name.toLowerCase().split(" "); // const fn = nameArray[0]; // const ln = nameArray[nameArray.length - 1]; // const ph = (window.countryCode + getQueryValue("phone")).replace(/\D/g, ""); for (let a = 0; a < dados.length; a++) { let pixel = dados[a]; window.fbq("init", pixel.pixel, event_fb); console.log(event_fb, pixel); } }; !(function (f, b, e, v, n, t, s) { if (f.fbq) return; n = f.fbq = function () { n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments); }; if (!f._fbq) f._fbq = n; n.push = n; n.loaded = !0; n.version = "2.0"; n.queue = []; t = b.createElement(e); t.async = !0; t.src = v; s = b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t, s); t.onload = function () { next(); }; })( window, document, "script", "https://connect.facebook.net/en_US/fbevents.js" ); async function next() { await window.initMatching(); for (let a = 0; a < dados.length; a++) { let pixel = dados[a]; for (let index = 0; index < pixel.events_load.length; index++) { const event_element = pixel.events_load[index]; fbq( "track", event_element, {}, { eventID: getCookie("external_id") + "-" + event_element } ); } } } } function initTikTok(dados) { !(function (w, d, t) { w.TiktokAnalyticsObject = t; var ttq = (w[t] = w[t] || []); (ttq.methods = [ "page", "track", "identify", "instances", "debug", "on", "off", "once", "ready", "alias", "group", "enableCookie", "disableCookie", "holdConsent", "revokeConsent", "grantConsent", ]), (ttq.setAndDefer = function (t, e) { t[e] = function () { t.push([e].concat(Array.prototype.slice.call(arguments, 0))); }; }); for (var i = 0; i < ttq.methods.length; i++) ttq.setAndDefer(ttq, ttq.methods[i]); (ttq.instance = function (t) { for (var e = ttq._i[t] || [], n = 0; n < ttq.methods.length; n++) ttq.setAndDefer(e, ttq.methods[n]); return e; }), (ttq.load = function (e, n) { var r = "https://analytics.tiktok.com/i18n/pixel/events.js", o = n && n.partner; (ttq._i = ttq._i || {}), (ttq._i[e] = []), (ttq._i[e]._u = r), (ttq._t = ttq._t || {}), (ttq._t[e] = +new Date()), (ttq._o = ttq._o || {}), (ttq._o[e] = n || {}); n = document.createElement("script"); (n.type = "text/javascript"), (n.async = !0), (n.src = r + "?sdkid=" + e + "&lib=" + t); e = document.getElementsByTagName("script")[0]; e.parentNode.insertBefore(n, e); }); next(); })(window, document, "ttq"); function next() { // Busca dados sensíveis dos cookies primeiro, query como fallback var phoneValue = getSensitiveValue([ "phone", "celular", "cel", "phonenumber", "phoneac", "telephone", ]); var emailValue = getSensitiveValue(["email", "em"]); for (let index = 0; index < dados.length; index++) { const numero_pixel = dados[index].pixel; ttq.load(numero_pixel); if (phoneValue || emailValue) { sendQueryTiktok(numero_pixel, emailValue, phoneValue); } else { ttq .instance(numero_pixel) .track( "Pageview", {}, { event_id: getCookie("external_id") + "-Pageview" } ); } } ttq.page(); } window.onSubmitTiktok = async function (e) { const data = new FormData(e.target); const formValues = {}; data.forEach((value, key) => { formValues[key] = value; }); // Form inputs têm maior prioridade; fallback para cookies/query const emailRaw = formValues["email"] || getSensitiveValue(["email", "em"]); const phoneRaw = formValues["phone"] || getSensitiveValue([ "phone", "celular", "cel", "phonenumber", "phoneac", "telephone", ]); const email = await textToHash(emailRaw); const phone_number = await textToHash( (window.countryCode + phoneRaw).replace(/\s/g, "") ); for (let index = 0; index < dados.length; index++) { const numero_pixel = dados[index].pixel; ttq.instance(numero_pixel).identify({ email, phone_number }); ttq .instance(numero_pixel) .track( "CompleteRegistration", {}, { event_id: getCookie("external_id") + "-CompleteRegistration" } ); } }; async function sendQueryTiktok(numero_pixel, emailValue, phoneValue) { // Dados já vêm resolvidos com prioridade: cookies > query const email = await textToHash(emailValue); const phone_number = await textToHash( (window.countryCode + phoneValue).replace(/\s/g, "") ); ttq.instance(numero_pixel).identify({ email, phone_number }); ttq .instance(numero_pixel) .track( "Pageview", {}, { event_id: getCookie("external_id") + "-Pageview" } ); } } function initGoogleAds(dados) { window.dataLayer = window.dataLayer || []; window.gtag = function () { window.dataLayer.push(arguments); }; window.gtag("js", new Date()); var callback = function () { return; }; for (let index = 0; index < dados.length; index++) { const id_pixel_gg = dados[index].pixel; const pixel = dados[index]; window.gtag("config", id_pixel_gg, { allow_enhanced_conversions: true, }); let script = document.createElement("script"); script.src = "https://www.googletagmanager.com/gtag/js?id=" + id_pixel_gg; script.async = true; // Asynchronous loading document.body.appendChild(script); for (let index = 0; index < pixel.events_load.length; index++) { const event_element = pixel.events_load[index]; gtag("event", "conversion", { send_to: pixel.pixel + "/" + event_element, event_callback: callback, }); } } window.onSubmitGoogle = function () { for (let a = 0; a < dados.length; a++) { let pixel = dados[a]; for (let index = 0; index < pixel.event_subscription.length; index++) { const event_element = pixel.event_subscription[index]; gtag("event", "conversion", { send_to: pixel.pixel + "/" + event_element, event_callback: callback, }); } } }; } window.acceptCookies = function () { document.cookie = "lgpd_accept" + "=" + true + ";path=/"; document.getElementById("lgpd_consent").style.display = "none"; initPixel(); }; window.checkLgpdCookieV2 = function () { const cookieValue = document.cookie.includes("lgpd_accept=true"); if (!cookieValue) { document.getElementById("lgpd_consent").style.display = "flex"; } else { initPixel(); } }; document.addEventListener("DOMContentLoaded", function () { var cookies = listarCookies(); if (!cookies.external_id) setCookie("external_id", cookies.session_id); window.checkLgpdCookieV2(); }); window.refusedCookies = function () { document.getElementById("lgpd_consent").style.display = "none"; }; function listarCookies() { try { const cookiesString = document.cookie; if (!cookiesString) { return {}; } const cookiesArray = cookiesString.split("; "); const cookiesObj = {}; cookiesArray.forEach((cookie) => { const [chave, valor] = cookie.split("="); cookiesObj[chave] = decodeURIComponent(valor); // Decodifique o valor do cookie }); return cookiesObj; } catch (error) { return {}; } } function getQueryParams() { try { const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); const params = {}; for (let pair of urlParams.entries()) { const [key, value] = pair; params[key] = value; } return params; } catch (error) { return {}; } } /** * Lê os dados sensíveis da query original salvos pelo middleware server-side * (cookie sfx_original_query) e/ou do sessionStorage. * Retorna um objeto com as chaves originais (ex: phone, email, name). */ function getOriginalQueryData() { try { var queryData = {}; // 1. Tenta ler do sessionStorage try { var stored = JSON.parse( sessionStorage.getItem("sfx_original_query") || "{}" ); for (var k in stored) { if (stored[k]) queryData[k] = stored[k]; } } catch (e) {} // 2. Tenta ler do cookie sfx_original_query (salvo pelo middleware server-side) var cookies = listarCookies(); if (cookies.sfx_original_query) { try { var cookieData = JSON.parse(cookies.sfx_original_query); for (var key in cookieData) { if (cookieData[key]) queryData[key] = cookieData[key]; } } catch (e) {} } return queryData; } catch (e) { return {}; } } /** * Retorna o primeiro valor não vazio encontrado no objeto para a lista de chaves. * Útil para buscar dados que podem estar em diferentes nomes de parâmetros * (ex: phone, celular, phonenumber são todos telefone). */ function getFirstAvailable(obj, keys) { for (var i = 0; i < keys.length; i++) { if (obj[keys[i]]) return obj[keys[i]]; } return ""; } /** * Busca um valor sensível com prioridade: original_query cookies/sessionStorage → cookies regulares → query params. * @param {string[]} aliases - Lista de nomes de parâmetros possíveis (ex: ["phone", "celular", "cel"]) * @returns {string} O valor encontrado ou string vazia */ function getSensitiveValue(aliases) { var originalData = getOriginalQueryData(); var cookies = listarCookies(); var queryParams = getQueryParams(); // 1. Original query data (cookie sfx_original_query + sessionStorage) - maior prioridade var fromOriginal = getFirstAvailable(originalData, aliases); if (fromOriginal) return fromOriginal; // 2. Cookies regulares var fromCookies = getFirstAvailable(cookies, aliases); if (fromCookies) return fromCookies; // 3. Query params - fallback var fromQuery = getFirstAvailable(queryParams, aliases); if (fromQuery) return fromQuery; return ""; } async function getFormInputsData(form, mask, custom_params) { // Busca os parâmetros de consulta (GET) const queryParams = getQueryParams(); let inputsData = { name: "", email: "", phone: "" }; if (queryParams.fbclid) setCookie("fbclid", queryParams.fbclid); if (queryParams.ttclid) setCookie("ttclid", queryParams.ttclid); if (queryParams.gclid) setCookie("gclid", queryParams.gclid); var cookies = listarCookies(); var originalData = getOriginalQueryData(); inputsData.external_id = cookies.external_id; // ---- Prioridade: query params (fallback) → cookies regulares → original query cookies (+ recente) ---- // 1. Query params como fallback (menor prioridade) if (queryParams.name || queryParams.nome) { inputsData.name = queryParams.name || queryParams.nome; } else if ( queryParams.fn || queryParams.firstname || queryParams.first_name ) { var _fn = queryParams.fn || queryParams.firstname || queryParams.first_name; var _ln = queryParams.ln || queryParams.lastname || queryParams.last_name || ""; inputsData.name = _ln ? _fn + " " + _ln : _fn; } if (queryParams.email || queryParams.em) inputsData.email = queryParams.email || queryParams.em; if ( queryParams.phone || queryParams.celular || queryParams.cel || queryParams.phonenumber || queryParams.phoneac || queryParams.telephone ) inputsData.phone = queryParams.phone || queryParams.celular || queryParams.cel || queryParams.phonenumber || queryParams.phoneac || queryParams.telephone; // 2. Cookies regulares sobrescrevem query params if (cookies.name) inputsData.name = cookies.name; if (cookies.email) inputsData.email = cookies.email; if (cookies.phone) inputsData.phone = cookies.phone; // 3. Original query cookies/sessionStorage sobrescrevem tudo (dados mais recentes da URL processada) var oqName = getFirstAvailable(originalData, ["name", "nome"]); if (!oqName) { var _oqFn = getFirstAvailable(originalData, [ "fn", "firstname", "first_name", ]); var _oqLn = getFirstAvailable(originalData, [ "ln", "lastname", "last_name", ]); if (_oqFn) oqName = _oqLn ? _oqFn + " " + _oqLn : _oqFn; } var oqEmail = getFirstAvailable(originalData, ["email", "em"]); var oqPhone = getFirstAvailable(originalData, [ "phone", "celular", "cel", "phonenumber", "phoneac", "telephone", ]); if (oqName) inputsData.name = oqName; if (oqEmail) inputsData.email = oqEmail; if (oqPhone) inputsData.phone = oqPhone; if (cookies.fbclid) inputsData.fbclid = cookies.fbclid; if (cookies.ttclid) inputsData.ttclid = cookies.ttclid; if (cookies.gclid) inputsData.gclid = cookies.gclid; // Define Iinput do form, sobreescrrever se existir no form if (form) { const nameInput = form.querySelector('input[name="name"]') || form.querySelector('input[name="nome"]'); const emailInput = form.querySelector('input[name="email"]') || form.querySelector('input[type="email"]') || form.querySelector('input[name="e-mail"]'); const phoneInput = form.querySelector('input[name="phone"]') || form.querySelector('input[type="tel"]') || form.querySelector('input[name="whatsapp"]') || form.querySelector('input[name="telefone"]'); if (nameInput) { inputsData.name = nameInput.value; } if (emailInput) { inputsData.email = emailInput.value; } if (phoneInput) { inputsData.phone = phoneInput.value; } } // console.log(JSON.stringify(inputsData), window.country_code) if (custom_params) inputsData = { ...inputsData, ...custom_params }; inputsData.phone = formatPhone(inputsData.phone, mask || cookies.phone_mask); if (!isValidEmail(inputsData.email)) delete inputsData.email; if (inputsData.email) inputsData.email = inputsData.email.toLowerCase(); setCookie("name", inputsData.name); setCookie("email", inputsData.email); setCookie("phone", inputsData.phone); var dname = processName(inputsData.name); inputsData.firstname = dname.firstname; inputsData.lastname = dname.lastname; //console.log(JSON.stringify(inputsData), window.country_code) // var dados = getFormInputsData(null, mask) if (inputsData.email) inputsData.email_hash = await textToHashEdi(inputsData.email); if (inputsData.phone) inputsData.phone_hash = await textToHashEdi(inputsData.phone); // console.log(isValidEmail(inputsData.email)) return inputsData; } function setCookie(name, value, years = 10) { if (!value) return; const date = new Date(); date.setFullYear(date.getFullYear() + years); const expires = "expires=" + date.toUTCString(); document.cookie = name + "=" + encodeURIComponent(value) + ";" + expires + ";path=/"; } function formatPhone(phone, mask) { if (!phone) return; if (phone.startsWith("+")) return phone; return `+${normalizePhoneNumber(phone)}`; } // Função para normalizar o número do telefone function normalizePhoneNumber(phone) { if (!phone) return ""; phone = phone.trim(); if (phone.startsWith("+")) return phone; const cleanedPhone = phone.replace(/\D/g, ""); if (cleanedPhone.startsWith(window.country_code)) { return cleanedPhone; } else { // Se não, retorna o número concatenado com o country_code return window.country_code + cleanedPhone; } } async function textToHashEdi(input) { if (!input) return ""; input = processString(input); const textAsBuffer = new TextEncoder().encode(input); const hashBuffer = await window.crypto.subtle.digest("SHA-256", textAsBuffer); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hash = hashArray .map((item) => item.toString(16).padStart(2, "0")) .join(""); return hash; } function processString(input) { if (typeof input !== "string") { return ""; } // Remove espaços em branco, faz trim e lowercase let trimmedString = input.trim(); // Remove espaços no início e no final let lowerCaseString = trimmedString.toLowerCase(); // Converte para minúsculas let noWhitespaceString = lowerCaseString.replace(/\s+/g, ""); // Remove todos os espaços em branco return noWhitespaceString; } function isValidEmail(email) { // Definindo uma expressão regular para validar o email const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; // Testando o email contra a expressão regular return regex.test(email); } function processName(input) { if (typeof input !== "string" || !input) return {}; // Faz trim, lowercase e remove espaços extras let cleanedInput = input.trim().toLowerCase(); // Divide o nome em partes usando espaços como delimitador let nameParts = cleanedInput.split(/\s+/); // Se houver mais de uma parte, assume que a última é o sobrenome let firstName = nameParts[0]; let lastName = nameParts.length > 1 ? nameParts[nameParts.length - 1] : ""; return { firstname: firstName, lastname: lastName, }; } let dados_script_markting = {"_page_id":119111,"google_pixel_ids":null,"tiktok_pixel_ids":null,"facebook_pixel_ids":[{"pixel":"744769117726464","events_load":["PageView"],"event_subscription":["PageView"]}]};