Membuat layanan pelacakan panggilan sederhana, bagian 1

Artikel tersebut akan mempertimbangkan salah satu opsi yang memungkinkan untuk menerapkan pelacakan panggilan di situs. Materi ini ditulis semata-mata untuk tujuan pendidikan dan tidak membawa tujuan untuk mengganti layanan khusus yang ada yang menyediakan layanan calltracking.

Persyaratan Fungsional


  1. Layanan harus menyediakan kemampuan untuk mengganti angka (angka) dengan sumber transisi ke situs - transisi dari mesin pencari, transisi ke iklan, lewatnya tautan dengan tag utm.
  2. Layanan harus memperbaiki nomor yang ditampilkan kepada pengunjung situs dan menampilkan nomor ini pada kunjungan selanjutnya.
  3. Saat memulai panggilan ke nomor yang ditampilkan, layanan harus memulai pembuatan acara di Google Analytics.

Mekanika umum


Ketika Anda pergi ke situs, kami menentukan sumber transisi, dan kemudian memeriksa apakah nomor tersebut diberikan kepada pengunjung ini. Jika seorang pengunjung pertama kali mengunjungi situs tersebut, maka kami memberinya pengenal unik, setelah itu kami memberinya nomor dari kumpulan angka yang terkait dengan sumber rujukan ini. Di masa mendatang, ketika pengunjung kembali ke situs, kami menampilkan nomor yang diberikan kepadanya sebelumnya.

Saya ingin fokus pada log panggilan. Mengganti nomor, menetapkannya ke pengguna adalah masalah teknis, yang utama adalah untuk dapat membandingkan panggilan tertentu dan nomor yang saat ini ditetapkan untuk pengguna. Jika telepon yang Anda gunakan memungkinkan Anda untuk terus menerima detail tentang panggilan yang sedang berlangsung, maka mengetahui saat panggilan ke nomor tertentu dan memiliki informasi tentang nomor yang ditampilkan pada saat itu di situs web pengguna mana, dimungkinkan untuk memulai pembuatan acara di Google Analytics dan mengaitkannya dengan ROK.

Struktur


  1. ct-server.ru - skrip layanan web yang dapat dieksekusi akan ditempatkan di sini, database untuk menyimpan pengaturan ruang dan mencatat pengunjung;
  2. refer-to-site-with-ct-code.ru - di situs ini kami akan meniru transisi dari jaringan pencarian;
  3. site-with-ct-code.ru - situs di mana skrip substitusi nomor akan ditempatkan.

Mari kita mulai


Contoh di bawah ini akan diterapkan di server lokal.

Buat situs host virtual-dengan-ct-code.ru , di mana kami meletakkan file index.html dari konten berikut.

<!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> 

Seperti yang Anda lihat dari contoh, kami menghubungkan skrip eksternal ct-server.ru/script.js , yang akan "berkomunikasi" antara situs-with-ct-code.ru dan ct-server.ru , serta berinteraksi dengan pohon DOM situs situs-dengan-ct-code.ru . Nomor akan diganti oleh id elemen - 'calltracking'.

Sekarang buat referensi- ke- situs-dengan-ct-code.ru , yang akan berisi tautan ke situs-dengan-ct-code.ru untuk kemampuan memeriksa nomor pin pada transisi dari pengarah.

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

Setelah itu, kami akan menaikkan host ct-server.ru , yang akan memiliki struktur sebagai berikut:

index.php - file skrip yang dapat dieksekusi yang akan menerima permintaan-posting dari situs-dengan-ct-code.ru dan berinteraksi dengan database;

script.js - file skrip yang akan terhubung di situs tempat penggantian nomor akan dilakukan.

Basis data


Kita perlu membuat dua piring. Dalam tabel ct kita akan menyimpan angka dan pengaturan untuk tampilan mereka, dalam tabel angka kita akan mencatat tampilan angka.

 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; 

Penjelasan kecil dari bidang yang ditambahkan:

telepon - nomor telepon pengganti;
merujuk - sumber transisi;
utm - tautan ke halaman tempat penggantian nomor harus dilakukan;
host - situs tempat skrip substitusi angka berada;
ga - id dari penghitung Google Analytics;
login - login pemilik nomor.

Isi piring dengan data.

 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', ''); 

gambar

Sekarang buat plat angka.

 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; 

Di piring ini kami akan mencatat pengunjung mana, nomor mana dan pada titik waktu berapa ditampilkan di situs. Di masa mendatang, data ini dapat dibandingkan dengan log panggilan untuk memulai tindakan target - mengirim acara ke Google Analytics, membuat arahan dalam CRM, mengirim email, dll.

telepon - nomor telepon;
ct_user - id pengunjung;
merujuk - sumber transisi;
gid - cookie Google Analytics
halaman - halaman tempat nomor ditampilkan;
waktu - jumlah waktu tampilan.

Buat penangan permintaan


Interaksi antara layanan web ct-server.ru dan situs yang menampung skrip akan dilakukan melalui permintaan POST lintas-domain XHR (XMLHttpRequest).

Mari kita buka file ct-server.ru/index.php yang dibuat sebelumnya dan tambahkan cek untuk menerima data dari host yang diizinkan, dalam kasus kami ini adalah site-with-ct-code.ru , situs-with-ct-code2.ru dan situs-dengan -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; } } ?> 

Kami menulis dalam nilai variabel dari permintaan POST yang datang dari situs-dengan-ct-code.ru

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

Cook _ga memiliki bentuk _ga = GA1.2.1212121212.121212121212, kami akan membawanya ke bentuk "1212121212.12121212121212".

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

Kami akan membuat koneksi ke database tempat kami sebelumnya membuat tabel kami.

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

Interaksi dengan layanan web akan melalui dua metode - get_num_first dan get_num .

Metode get_num_first dipanggil ketika pengunjung pertama kali berinteraksi dengan situs untuk mendapatkan nomor dengan memilih dari database sesuai dengan kriteria - mail, referrer, utm, host. Jika hasil seleksi mengembalikan nilai, maka kami menampilkan nomor telepon.

Selain itu, kami mengirim acara ke Google Analytics melalui Protokol Pengukuran Google . Metode yang sama berlaku untuk melacak tindakan offline, di masa depan dapat digunakan saat membandingkan log panggilan dan nomor log dalam tabel angka.

 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"] . ''); } } 

Metode get_num diperlukan untuk mencatat entri dalam tabel angka.

 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(); 

Skrip pengganti angka


Selanjutnya, kita akan beralih ke skrip ct-server.ru/script.js , yang kita sambungkan di situs-with-ct-code.ru

Untuk memulai, mari kita buat dua fungsi - setcookie untuk membuat dan getcookie untuk membaca cookie. Kami akan menggunakannya untuk merekam dan mendapatkan id cookie dari pengguna dan nomor telepon.

 //  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; } 

Setelah itu, tambahkan fungsi makeid untuk menghasilkan id untuk pengguna.

 // 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; } 

Sekarang mari kita membuat fungsi untuk menghasilkan cookie yang berisi id pengguna 33 digit.

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

Cookie ct_user yang dihasilkan disimpan selama 1 jam.

Kami melanjutkan untuk menghasilkan permintaan nomor melalui metode get_num_first . Nomor yang dihasilkan dari ct-server.ru ditulis ke dalam cookie selama 1 jam dan kami melakukan substitusi pertama nomor pada halaman dengan id elemen.

 //    ,  ,       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); //  }; } 

Kami akan membuat fungsi yang secara berkala akan mengirimkan ke sisi ct-server.ru nilai-nilai nomor yang ditampilkan, id pengguna, alamat halaman, nilai cookie analitik google, sumber rujukan.

 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; }; } 

Pada akhirnya, kami menambahkan fungsi sendToCalltracking, yang memeriksa keberadaan nomor telepon cookie dan id pengguna.

 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(); } } 

Di bagian paling awal dari skrip, kita memanggil timer fungsi kita.

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

gambar

Jika cookie dihapus selama operasi berikutnya, fungsi akan menetapkan cookie baru kepada pengunjung sesuai dengan seleksi yang diterima oleh host dan sumber. Selain itu, dimungkinkan untuk menulis nilai yang diterima ke browser Penyimpanan lokal.

gambar

Sekali semenit, skrip akan mengirimkan nilai nomor cookie dan id pengguna yang menunjukkan halaman penerapannya tanpa memuat ulang. Dapat dipahami bahwa skrip akan ditempatkan pada semua halaman domain.

gambar

Pada artikel selanjutnya, kita akan membahas pengembangan antarmuka sederhana untuk menambah dan mengonfigurasi angka.

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


All Articles