И так, появилась как-то у меня задача: Интегрировать на сайт кнопку Обратного звонка, т.е. кнопку с возможностью оставить телефон посетителя, и чтобы ему перезвонили менеджеры. Без сторонних(платных) сервисов.
Telegram очень мощная и удобная вещь. Очень уж мне он нравится. Особенно его тема с ботами.
Поэтому было решено все эти уведомления с сайта слать именно в телеграмм.
Начнем с фронтенда.
Все супер изи. Простенькая формочка + CSS +JS.
Думаю без особого труда интегрируете в любую платформу, CMS …
Открываем главный файл шаблона сайта и прописываем стили в <head> + добавляем форму.
Стили можете запихнуть в основной файл стилей style.css или прописываем их там же, обрамляя <style></style>. Кому как удобнее.
Код CSS:
.telButton .telButton_border{border-color:#51aaac}
.telButton .telButton_background{background-color:#088789}
.telButton{z-index:90;width:60px;height:60px;opacity:.7;position:fixed;right:40px;bottom:40px;}
.telButton svg{width:40px;height:40px;position:absolute;top:50%;left:50%;margin-left:-20px;margin-top:-20px;}
.telButton:hover{opacity:1;}
.telButton .telButton_background{background-position:center center;background-size:100% 100%;z-index:5010;width:60px;height:60px;border-radius:50%;position:absolute;animation-name:pulse;animation-duration:5s;animation-iteration-count:infinite;}
.telButton .telButton_background span{display:table-cell;vertical-align:middle;}
.telButton .telButton_background:hover{background-color:#fe9126;cursor:pointer;opacity:1;}
.telButton .telButton_border{position:absolute;top:-1px;left:-1px;width:56px;height:56px;border-radius:50%;border-style:solid;border-width:3px;animation-name:shadow;animation-duration:1.5s;animation-iteration-count:infinite;animation-timing-function:ease-out;
}
.telButton_hover{width:150px; border:3px solid #fe9126; background-color:#FFFFFF; border-radius:15px; padding:10px; margin-left:-140px; margin-top:9px; font-size:1.0em; line-height:1.2; font-family:Arial; color:#000000; display:none; opacity:0; z-index:1}
.telButton_hover.open{display:block; opacity:1;}
@keyframes pulse{
0%{width:60px; height:60px;top:0px; left:0px }
5%{width:66px; height:66px;top:-3px; left:-3px }
10%{width:60px; height:60px;top:0px; left:0px }
15%{width:66px; height:66px;top:-3px; left:-3px }
20%{width:60px; height:60px;top:0px; left:0px }
25%{width:66px; height:66px;top:-3px; left:-3px }
30%{width:60px; height:60px;top:0px; left:0px }
59%{transform:rotate(0deg);}
60%{transform:rotate(10deg);}
65%{transform:rotate(-10deg);}
70%{transform:rotate(10deg);}
75%{transform:rotate(-10deg);}
80%{transform:rotate(10deg);}
85%{transform:rotate(-10deg);}
90%{transform:rotate(0deg);}
100%{width:60px; height:60px; top:0px; left:0px }
}
@keyframes shadow{
0%{top:0px; left:0px; width:56px; height:56px}
100%{top:-22px; left:-22px; width:96px; height:96px}
}
.window_wrap{display:none;position:fixed;left:0;top:0;width:100%;height:100%;background:rgba(54,54,54,0.95);text-align:center;z-index:5005}
.window_wrap.open{display:block;}
.window_wrap:after{display:inline-block;height:100%;width:0;vertical-align:middle;content: ''}
.window_close{display: block;position: absolute;top: 10px;right: 10px;width: 18px;height: 18px;padding: 8px;border-radius: 50%;cursor: pointer;background: #088789;text-align: center;font-family: arial;font-size: 18px;line-height: 18px;color: #fff;text-decoration: none;font-weight: bold;cursor:pointer;box-sizing: content-box !important;}
.window_close:hover{background: #ff6600;}
.window{display:inline-block;width:96%;hyphens:none}
.window p{color:#fff;font-family: "Arial",sans-serif;font-size: 18px;line-height: 24px;text-align: center;text-transform: uppercase;}
#telForm{background:#fafafa none repeat scroll 0 0;border: medium none;border-radius: 5px 0 0 5px;float: left;height: 35px;text-align: center;width: 58%;}
#telButton{background: #e03f58 none repeat scroll 0 0;border: medium none;border-radius: 0 5px 5px 0;color: #fff;cursor: pointer;float: right;height: 37px;transition: all 0.6s ease 0s;width: 40%;}
.hide{display:none}
.notify{color: #fff;text-align: center;display: inline-block;width: 100%;font-size: 18px;margin-top: 20px;font-family: arial;}
Сама Форма HTML + Javascript(православный, а не jquery) к нему.
Вставляете в конце файла, перед </body>
HTML Форма:
<div class="window_wrap" id="window-callme">
<div class="window"><div class="window_close" id="window_close">X</div>
<div class="frmm" id="frmm">
<p>Оставьте ваш телефон<br/>и наш менеджер свяжется с вами В течение нескольких минут</p>
<form id="backPhone" name="backPhone" method="post">
<input name="phone" type="tel" id="telForm" maxlength="20" placeholder="Введите ваш телефон" required="required" autocomplete="off">
<button id="telButton" type="submit" form="backPhone">Заказать звонок</button>
</form>
</div>
<div class="notify" id="notify"> </div>
</div>
</div>
<div class="telButton anim" id="callme">
<div class="telButton_background"><span>
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="50.000000pt" height="50.000000pt" viewBox="0 0 50.000000 50.000000" preserveAspectRatio="xMidYMid meet"><g transform="translate(0.000000,50.000000) scale(0.100000,-0.100000)" fill="#fff" stroke="none"><path d="M100 472 c-8 -2 -27 -16 -42 -30 -59 -55 -26 -144 102 -273 87 -87 169 -139 221 -139 31 0 89 59 89 90 0 13 -20 33 -55 57 -55 36 -56 36 -89 20 l-34 -16 -56 57 c-38 38 -54 61 -50 72 18 41 15 62 -15 109 -33 52 -46 61 -71 53z m45 -74 c27 -41 27 -43 12 -71 -21 -36 -16 -46 61 -120 64 -61 73 -64 112 -43 22 13 28 11 68 -16 l44 -30 -28 -30 c-22 -22 -34 -28 -54 -23 -96 24 -300 236 -300 311 0 17 37 64 50 64 4 0 20 -19 35 -42z"/></g></svg>
</span></div>
<div class="telButton_hover" id="telhover" >Заказать звонок</div>
</div>
Следом после этого вставляем такой js код:
<script>
document.getElementById("callme").addEventListener("mouseover", hovertxt);
document.getElementById("callme").addEventListener("mouseout", hovertxt);
document.getElementById("callme").addEventListener("click", window_call);
document.getElementById("window_close").addEventListener("click", window_call);
function hovertxt(){var x = document.getElementById("telhover");if (x.className === "telButton_hover") {x.className += " open";} else {x.className = "telButton_hover";}}
function window_call(){
var x = document.getElementById("window-callme");if (x.className === "window_wrap") {x.className += " open";} else {x.className = "window_wrap";}
var x = document.getElementById("callme");if (x.className === "telButton anim") {x.className += " hide";} else {x.className = "telButton anim";}}
var cc = backPhone.telForm,
events = ['input', 'change', 'blur', 'keyup'];
for (var i in events) {
cc.addEventListener(events[i], formatCardCode, false);}
function formatCardCode() {
var cardCode = this.value.replace(/[^\d]/g, '').substring(0,12);
cardCode = cardCode !== '' ? cardCode.match(/.{1,3}/g).join(' ') : '';
this.value = cardCode;
}
window.addEventListener("load", function () {
function sendData() {
if (window.XMLHttpRequest) {
XHR = new XMLHttpRequest();
} else if (window.ActiveXObject) {
XHR = new ActiveXObject("Microsoft.XMLHTTP");
}
var FD = new FormData(form);
XHR.addEventListener("load", function(event) {
return_response_ok(event.target.responseText);
});
XHR.addEventListener("error", function(event) {
return_response_err('Произошла ошибка. Попробуйте позже');
});
XHR.open("POST", location.protocol + "//" + location.host + "/callback.php");
XHR.send(FD);
}
function return_response_ok(e){
e=JSON.parse(e);
if(e.status == 'success'){
document.getElementById("notify").innerHTML = e.message;
document.getElementById("frmm").className += " hide";
setTimeout(window_call, 3000);
}else if(e.status == 'error'){
document.getElementById("notify").innerHTML = e.message;
}
}
function return_response_err(e){
document.getElementById("notify").innerHTML = e;
}
var form = document.getElementById("backPhone");
form.addEventListener("submit", function (event) {
event.preventDefault();
sendData();
});
});
</script>
На этом с фронтэндом мы закончили. Переходим к настройке телеграмма.
Создание и Настройка Бота Telegram
Далее нам нужно создать бота который будет принимать все эти сообщения с запросами обратного звонка и отправлять их в нужный чат.
1. Создаем бота.
Иструкций на эту тему предостаточно и кому захочется копнуть глубже, Вы знаете где это делать. А здесь я вкратце опишу нужные телодвижения…:)
В поиске Telegram пишем @botfather. Открываем бота и пишем ему:
/start.
Он вывалит свои команды. Нам же нужно:
/newbot
Далее, Следуя подсказкам создаем своего бота. По итогу вам должно выдать что-то типа того:
Done! Congratulations on your new bot…
…..
Use this token to access the HTTP API:
…..
Из этого сообщения нам будет нужен этот токен. Запишите его куда-то.
2. Создаем Группу(Канал)
Теперь нам необходимо создать чат куда все эти заявки будут поступать. Ну тут даже как бы и объяснять особо нечего…
- Жмем в телеграмм «Создать Группу» ( ну или «Создать Канал» тут уж зависит от цели и кому как удобнее будет…)
- Как-то по умному называем ее.. ну и добавляем картинку.
- Теперь добавляем в группу(канал) нашего бота. Жмем кнопку «Добавить участников», пишем имя бота и добавляем его.
- Добавляем в группу участников которые будут обрабатывать эти звонки.
Ремарка: Делайте Частный чат/канал, чтобы никто не мог без вашего ведома в него добавиться или просматривать его.
Следующий этап. Теперь нам нужно получить ID нашего чата.
Для этого нужно написать сообщение в созданную группу.
Затем вспоминаем токен из пункта 1 и переходим:
https://api.telegram.org/bot<BOTToken>/getUpdates
где <BOTToken> — это тот самый наш токен.
Ищем значение «id» из объекта «chat». Это и будет нужный идентификатор чата.
Для групповых чатов он будет со знаком минус.
Теперь у нас есть все, чтобы перейти к следующему этапу.
Переходим к Бекэнду
Создадим файл callback.php в корне вашего сайта и разместим в нем следующий код.
В нем необходимо указать свои TELEGRAM_TOKEN и TELEGRAM_CHATID.
Скрипт бекэнда для отправки сообщений в чат:
<?php
// сюда нужно вписать токен вашего бота
define('TELEGRAM_TOKEN', '111111111:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');
// сюда нужно вписать ваш внутренний айдишник
define('TELEGRAM_CHATID', '-0000000000000');
function message_to_telegram($text) {
$ch = curl_init();
curl_setopt_array(
$ch,
array(
CURLOPT_URL => 'https://api.telegram.org/bot' . TELEGRAM_TOKEN . '/sendMessage',
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 10,
CURLOPT_POSTFIELDS => array(
'chat_id' => TELEGRAM_CHATID,
'text' => $text,
'parse_mode' => 'html',
),
)
);
curl_exec($ch);
}
if(isset($_POST['phone'])){
$phone = str_replace(" ","",$_POST['phone']);
$httpReferer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null;
if (strlen($phone) >=10){
if (substr( $phone, 0, 1 )=== "0" || substr( $phone, 0, 2 )=== "38" ) {
$message = "<i>Перезвоните мне:</i>\n\n<b>$phone</b>\n\nОтправлено со страницы:\n$httpReferer";
message_to_telegram($message);
$response['status'] = 'success';
$response['message'] = "Спасибо за Ваше обращение.<br> В течение нескольких минут с Вами свяжется наш менеджер.";
}else{
$response['status'] = 'error';
$response['message'] = "<span style='color:yellow'>Возможно, Вы не верно ввели номер телефона.<br> Номера телефонов Украины должны начинаться с 0 или 380<br>Проверьте и повторите попытку</span>";
}
}else{
$response['status'] = 'error';
$response['message'] = "<span style='color:yellow'>Возможно, Вы не верно ввели номер телефона.<br>Проверьте и повторите попытку.<br>*Подсказка:Номер должен содержать в себе не менее 10 знаков(с кодом города или оператора).<br>Пример: 099 999 99 99</span>";
}
header('Content-type: application/json');
echo json_encode($response);}
На этом все, интеграция скрипта обратного звонка окончена.
Если я, что-то упустил задавайте вопросы в комментариях, т.к. это решение делал давненько, мог что-то и подзабыть.
Если Вам был полезен этот скрипт, не стесняйтесь поставить обратную ссылку на него. Вам все равно, а мне приятно:)