Criando um serviço simples de rastreamento de chamadas, parte 1

O artigo considerará uma das opções possíveis para implementar o rastreamento de chamadas no site. Este material foi escrito exclusivamente para fins educacionais e não tem o objetivo de substituir os serviços especializados existentes que fornecem o serviço de rastreamento de chamadas.

Requisitos funcionais


  1. O serviço deve fornecer a capacidade de substituir números (números) pela origem da transição para o site - a transição dos mecanismos de pesquisa, a transição para a publicidade, a passagem de links com tags utm.
  2. O serviço deve fixar o número exibido ao visitante do site e exibir esse número em uma visita adicional.
  3. Ao iniciar uma chamada para o número exibido, o serviço deve iniciar a criação de um evento no Google Analytics.

Mecânica geral


Quando você acessa o site, determinamos a origem da transição e, em seguida, verificamos se o número está atribuído a esse visitante. Se o visitante visitou o site pela primeira vez, atribuímos a ele um identificador exclusivo, após o qual atribuímos um número do pool de números relacionados a essa fonte de referência. No futuro, quando o visitante retornar ao site, exibiremos o número atribuído a ele anteriormente.

Gostaria de me concentrar no registro de chamadas. Substituir o número, atribuí-lo ao usuário é um problema técnico, o principal é poder comparar uma chamada específica e o número atualmente atribuído ao usuário. Se a telefonia usada permitir que você receba informações detalhadas das chamadas em andamento de forma contínua, sabendo o momento de uma chamada para um número específico e tendo informações sobre qual número foi exibido naquele momento no site de qual usuário, é possível iniciar a criação de um evento no Google Analytics e associá-lo à ROK.

Estrutura


  1. ct-server.ru - um script executável de serviço da web será colocado aqui, um banco de dados para armazenar configurações da sala e registrar visitantes;
  2. refer-to-site-with-ct-code.ru - neste site emularemos a transição da rede de pesquisa;
  3. site-with-ct-code.ru - o site no qual o script de substituição de número será colocado.

Vamos começar


O exemplo abaixo será implementado no servidor local.

Crie um host virtual site-with-ct-code.ru , no qual colocamos o arquivo index.html do seguinte conteúdo.

<!DOCTYPE HTML> <html> <head> <meta charset='utf-8'> <title>CT</title> <script src="http://ct-server.ru/script.js"></script> <script> //  google id document.cookie = '_ga=GA1.2.1212121212.1212121212; expires=Thu, 18 Dec 2077 12:00:00 UTC; path=/'; </script> </head> <body> <p id='calltracking'>79000000000</p> </body> </html> 

Como você pode ver no exemplo, conectamos um script externo ct-server.ru/script.js , que "comunicará" entre site-with-ct-code.ru e ct-server.ru , além de interagir com a árvore DOM do site site-with-ct-code.ru . O número será substituído pelo id do elemento - 'calltracking'.

Agora crie um refer-to-site-with-ct-code.ru , que conterá um link para site-with-ct-code.ru para a capacidade de verificar o número do pino na transição do referenciador.

 <!DOCTYPE HTML> <html> <head> <meta charset='utf-8'> <title>CT</title> </head> <body> <a href="http://site-with-ct-code.ru"></a> </body> </html> 

Depois disso, criaremos o host ct-server.ru , que terá a seguinte estrutura:

index.php - um arquivo de script executável que aceita solicitações de postagem do site-with-ct-code.ru e interage com o banco de dados;

script.js - arquivo de script que será conectado nos sites onde a substituição de número será realizada.

Banco de Dados


Vamos precisar criar duas placas. Na tabela ct , armazenaremos números e configurações para a exibição deles; na tabela de números , registraremos a exibição dos números.

 CREATE TABLE `ct` ( `id` int(11) NOT NULL, `phone` varchar(200) NOT NULL, `refer` varchar(200) NOT NULL, `utm` varchar(200) NOT NULL, `host` varchar(200) NOT NULL, `ga` varchar(200) NOT NULL, `login` varchar(200) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `ct` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `id` (`id`); ALTER TABLE `ct` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1; 

Uma pequena explicação dos campos adicionados:

telefone - número de telefone substituído;
refer - a fonte da transição;
utm - link para a página na qual a substituição de número deve ocorrer;
host - o site no qual o script de substituição de número está localizado;
ga - id do contador do Google Analytics;
login - login do proprietário do número.

Encha o prato com dados.

 INSERT INTO `ct` (`id`, `phone`, `refer`, `utm`, `host`, `ga`, `login`) VALUES (2, '78000000001', '', 'http://site-with-ct-code.ru/?utm_medium=cpc', 'http://site-with-ct-code.ru', 'UA-12345678-1', ''), (3, '78000000002', 'http://refer-to-site-with-ct-code.ru/', 'http://site-with-ct-code.ru/', 'http://site-with-ct-code.ru', 'UA-12345678-1', ''), (4, '78000000003', 'http://refer-to-site-with-ct-code.ru/', 'http://site-with-ct-code.ru/', 'http://site-with-ct-code.ru', 'UA-12345678-1', ''), (5, '78000000004', 'http://refer-to-site-with-ct-code.ru/', 'http://site-with-ct-code.ru/', 'http://site-with-ct-code.ru', 'UA-12345678-1', ''), (6, '78000000005', '', 'http://site-with-ct-code.ru/', 'http://site-with-ct-code.ru', 'UA-12345678-1', ''); 

imagem

Agora crie a placa de números.

 CREATE TABLE `numbers` ( `id` int(11) NOT NULL, `phone` varchar(200) DEFAULT NULL, `ct_user` varchar(200) DEFAULT NULL, `refer` varchar(200) DEFAULT NULL, `gid` varchar(200) DEFAULT NULL, `page` varchar(200) DEFAULT NULL, `time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `numbers` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `id` (`id`), ALTER TABLE `numbers` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;COMMIT; 

Nesta placa, registraremos qual visitante, qual número e em que momento é exibido no site. No futuro, esses dados poderão ser comparados com o registro de chamadas para iniciar a ação de destino - enviando um evento para o Google Analytics, criando um lead no CRM, enviando um email, etc.

telefone - número de telefone;
ct_user - ID do visitante;
refer - a fonte da transição;
gid - cookie do Google Analytics
página - a página na qual o número é exibido;
hora - hora de exibição do número.

Crie um manipulador de solicitações


A interação entre o serviço da web ct-server.ru e o site que hospeda o script será feita por meio de solicitações POST XHR (XMLHttpRequest) entre domínios.

Vamos abrir o arquivo ct-server.ru/index.php criado anteriormente e adicionar uma verificação para receber dados de hosts permitidos; no nosso caso, são site-with-ct-code.ru , site-with-ct-code2.ru e site-with -ct-code3.ru .

 <?php if (isset($_SERVER["HTTP_ORIGIN"]) === true) { $host = $_SERVER["HTTP_ORIGIN"]; //   $allowHosts = array("http://site-with-ct-code.ru", "http://site-with-ct-code2.ru", "http://site-with-ct-code3.ru"); if (in_array($host, $allowHosts, true) === true) { header('Access-Control-Allow-Origin: ' . $host); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Allow-Methods: POST'); header('Access-Control-Allow-Headers: Content-Type'); //    post-      } if ($_SERVER["REQUEST_METHOD"] === "OPTIONS") { exit; } } ?> 

Escrevemos valores variáveis ​​de solicitações POST provenientes de site-with-ct-code.ru

 $phone = $_POST["phone"]; $ct_user = $_POST["ct_user"]; $gid = $_POST["gid"]; $refer = $_POST["ref"]; $page = $_POST["page"]; 

O cozinheiro _ga tem o formato _ga = GA1.2.1212121212.12.1212121212, o trazeremos para o formato "1212121212.12121212121212".

 if ($gid) { $pos = strpos($gid, '.', strpos($gid, '.') + 1); $gid = substr($gid, $pos + 1); } 

Estabeleceremos uma conexão com o banco de dados onde criamos anteriormente nossas tabelas.

 $conn = new mysqli("localhost", "root", "", "calltracking"); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } 

A interação com o serviço da web será feita por dois métodos - get_num_first e get_num .

O método get_num_first é chamado quando o visitante interage pela primeira vez com o site para obter um número selecionando no banco de dados de acordo com os critérios - mail, referrer, utm, host. Se o resultado da seleção retornar um valor, exibimos o número de telefone.

Além disso, enviamos o evento para o Google Analytics por meio do Protocolo de avaliação do Google . O mesmo método é aplicável ao rastreamento de ações offline; no futuro, ele pode ser usado ao comparar o registro de chamadas e o registro de números na tabela de números.

 if ($_POST['method'] == 'get_num_first') { $sql = "SELECT * FROM `ct` where `host` = '" . $host . "' and `refer` = '" . $refer . "' and `utm` = '" . $page . "' ORDER BY RAND() LIMIT 1 "; $result = $conn->query($sql); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { print_r($row["phone"]); $event = file_get_contents('https://www.google-analytics.com/collect?v=1&tid=UA-12345678-1&cid=' . $gid . '&t=event&ec=GetNumber&ea=number&z=' . $row["phone"] . ''); } } else { //echo "0"; $sql = "SELECT * FROM `ct` where `host` = '" . $host . "' and `refer` = '" . $refer . "' ORDER BY RAND() LIMIT 1 "; $result = $conn->query($sql); print_r($row["phone"]); $event = file_get_contents('https://www.google-analytics.com/collect?v=1&tid=UA-12345678-1&cid=' . $gid . '&t=event&ec=GetNumber&ea=number&z=' . $row["phone"] . ''); } } 

O método get_num é necessário para registrar entradas na tabela de números.

 else if ($_POST['method'] == 'get_num') { $sql = "INSERT INTO `numbers` (`phone`, `ct_user`, `gid`, `refer`,`page`) VALUES ( '" . $phone . "', '" . $ct_user . "', '" . $gid . "', '" . $refer . "', '" . $page . "');"; $result = $conn->query($sql); $sql = "SELECT * FROM `numbers` where `ct_user` = '" . $ct_user . "' ORDER BY `id` DESC LIMIT 1 "; $result = $conn->query($sql); if ($result->num_rows > 0) { while ($row = $result->fetch_assoc()) { print_r($row["phone"]); $event = file_get_contents('https://www.google-analytics.com/collect?v=1&tid=UA-12345678-1&cid=' . $gid . '&t=event&ec=ShowNumber&ea=number&z=' . $row["phone"] . ''); } } else { //echo "0"; } } $conn->close(); 

Script de substituição numérica


Em seguida, seguiremos para o script ct-server.ru/script.js , que conectamos no site-with-ct-code.ru

Para começar, vamos criar duas funções - setcookie para criar e getcookie para ler cookies. Nós os usaremos para gravar e obter o ID do cookie do usuário e número de telefone.

 //  function setcookie(phone, value, expires, path, domain, secure) { document.cookie = phone + "=" + escape(value) + (expires ? "; expires=" + new Date(expires) : "") + (path ? "; path=" + path : "") + (domain ? "; domain=" + domain : "") + (secure ? "; secure" : ""); } //  function getcookie(phone) { var cookie = " " + document.cookie; var search = " " + phone + "="; var setStr = null; var offset = 0; var end = 0; if (cookie.length > 0) { offset = cookie.indexOf(search); if (offset != -1) { offset += search.length; end = cookie.indexOf(";", offset); if (end == -1) { end = cookie.length; } setStr = unescape(cookie.substring(offset, end)); } } return setStr; } 

Depois disso, adicione a função makeid para gerar o ID para o usuário.

 // id  function makeid(length) { var result = ""; var user_id = "abcdefghijklmnopqrstuvwxyz0123456789"; var user_idLength = user_id.length; for (var i = 0; i < length; i++) { result += user_id.charAt(Math.floor(Math.random() * user_idLength)); } return result; } 

Agora vamos criar uma função para gerar cookies contendo um ID de usuário de 33 dígitos.

 // id  function generateuser_id() { var ct_user_id = makeid(33); setcookie("ct_user", ct_user_id, new Date().getTime() + 60 * 60 * 1000); //  } 

O cookie ct_user resultante é armazenado por 1 hora.

Prosseguimos para gerar uma solicitação de número através do método get_num_first . O número resultante de ct-server.ru é gravado no cookie por 1 hora e realizamos a primeira substituição do número na página pelo ID do elemento.

 //    ,  ,       id  function getNumberFirstTime() { var method = "get_num_first"; var ct_user = getcookie("ct_user"); var gid = getcookie("_ga"); var ref = document.referrer; var host = window.location.origin; var page = document.location.href; var xhr = new XMLHttpRequest(); var body = "&method=" + encodeURIComponent(method) + "&page=" + encodeURIComponent(page) + "&ct_user=" + encodeURIComponent(ct_user) + "&ref=" + encodeURIComponent(ref) + "&host=" + encodeURIComponent(host) + "&gid=" + encodeURIComponent(gid); xhr.open("POST", "http://ct-server.ru", true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.withCredentials = true; xhr.send(body); xhr.onreadystatechange = function() { //console.log(xhr.responseText); var t = xhr.responseText; document.getElementById("calltracking").innerHTML = t; setcookie("phone", t, new Date().getTime() + 60 * 60 * 1000); //  }; } 

Vamos criar uma função que enviará periodicamente o número exibido, ID do usuário, endereço da página, valor do cookie do Google Analytics, fonte de referência para ct-server.ru.

 function getNumberPeriodically() { var method = "get_num"; var ct_user = getcookie("ct_user"); var phone = getcookie("phone"); var gid = getcookie("_ga"); var ref = document.referrer; var page = document.location.href; var host = window.location.origin; var xhr = new XMLHttpRequest(); var body = "&method=" + encodeURIComponent(method) + "&page=" + encodeURIComponent(page) + "&ct_user=" + encodeURIComponent(ct_user) + "&ref=" + encodeURIComponent(ref) + "&host=" + encodeURIComponent(host) + "&phone=" + encodeURIComponent(phone) + "&gid=" + encodeURIComponent(gid); xhr.open("POST", "http://ct-server.ru", true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.withCredentials = true; xhr.send(body); xhr.onreadystatechange = function() { //console.log(xhr.responseText); var t = xhr.responseText; //document.getElementById('calltracking').innerHTML = t; }; } 

No final, adicionamos a função sendToCalltracking, que verifica a presença do número de telefone do cookie e da ID do usuário.

 function sendToCalltracking() { var ggg = getcookie("ct_user"); var ccc = getcookie("phone"); var gac = getcookie("_ga"); if ( typeof ggg === "undefined" || ggg === null || ccc === "undefined" || ccc === null || ccc.length < 1 || ggg.length < 1 || ccc === "" || ggg === "" ) { //console.log('false'); generateuser_id(); getNumberFirstTime(); } else { //console.log('true'); document.getElementById("calltracking").innerHTML = ccc; getNumberPeriodically(); } } 

No início do script, chamamos nossa função timer.

 var myTimer = setTimeout(sendToCalltracking, 500); //        setInterval(sendToCalltracking, 1 * 60 * 1000); 

imagem

Se os cookies forem excluídos durante a próxima operação, a função atribuirá um novo ao visitante de acordo com a seleção recebida por host e fonte. Além disso, é possível gravar os valores recebidos no navegador localStorage.

imagem

A cada minuto, o script enviará o valor do número do cookie e da ID do usuário, indicando a página em que foi aplicado sem recarregá-lo. Entende-se que o script será colocado em todas as páginas do domínio.

imagem

No próximo artigo, discutiremos o desenvolvimento de uma interface simples para adicionar e configurar números.

Source: https://habr.com/ru/post/pt473372/


All Articles