Push-уведомления в Telegram для чайников
Наверняка Вы уже видели похожую статью на Спарке (http://spark.ru/startup/pushall/blog/9872/push-uve...). Она мне помогла, но пришлось еще прилично повозиться и использовать другие материалы, чтобы сделать PUSH-уведомления на моем сервисе отслеживания объявлений.
Небольшое вступление. Когда Glisa обнаруживает новые объявления на Авито, Из рук в руки или Dromе, то сервис слал пользователю сообщение по электронной почте с текстом найденных объявлений. Учитывая, что хорошие товары уходят быстро, очень важна оперативность доставки. Доставка через электронную почту даже с установкой мобильного клиента занимала до 5 минут. Альтернатива в виде СМС - мгновенна, но обходится естественно дорого. Поэтому, в очередной раз возник вопрос разработки приложения. В процессе обдумывания обнаружились другие, более простые варианты. Первым попался сервис уведомлений PushAll - отвергнут в первую очередь из-за отсутствия iOs-приложения, а во вторую - за слабое юзабилити Android-приложения. Вторым вариантом, стал мессенджер Telegram: API без заморочек, удобный, охватывает и iOs, и Android, минус - отсутствие русского языка в базовой установке.
Теперь по порядку, как все это реализовать с учетом того, что у меня вызвало сложности. Шаг 1. Создание бота.
Если еще не зарегистрированы, регистрируемся в Telegram. Мне удобнее через веб-интервейс: https://web.telegram.org.
Набираем в поиске BotFather - папа ботов)), шлем ему команду на создание нового бота /newbot. Далее следуя инструкциям задаем название и имя бота. Также пригодятся команды: /setdescription - изменить описание, /setuserpic - задать иконку. Папаша выдаст token бота, который нужен будет дальше.
Итак, есть бот, но он ничего не умеет. Для моего сервиса особо ничего и не нужно, нужно только, чтобы бот слал сообщения пользователю, но для того чтобы их слать, нужно узнать ID чата пользователя с ботом. А для этого, пользователь должен написать первым, а мы должны обработать сообщение и выудить ID. Шаг 2. Выбор метода обработки сообщений боту.
Тут нужна документация по API Telegram. Все что пишется боту, можно обрабатывать двумя способами:
- Забирать обновления, т.е. все что написали боту с помощью метода getUpdates: https://api.telegram.org/bot#token#/getUpdates
- Задать Webhook, т.е. адрес, на который будут приходить все обновления и скрипт будет их обрабатывать (метод setWebhook)
Второй метод лучше, но уведомления шлются на https, а лично у меня его нет, да он и не нужен. Задав в качестве Вебхука обычный адрес с http долго мучался и гадал почему оно не работает. Когда дошло, опять помучался с поиском халявного https - в итоге нашел, но сделал по первому методу, вызывая скрипт кроном раз в минуту. Поэтому бот получился слегка тормозным, но для моих целей подходит.
Итак палю, халявный https у меня получился через https://www.cloudflare.com/ - ничего не стОит, работает, правда заработал дня через 3, когда я уже все сделал. Дальше буду описывать по первому методу. Шаг 3. Обработка сообщений боту
$boturl="https://api.telegram.org/bot".$botToken; $url=$boturl."/getUpdates?offset=$cur_id"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); $html = curl_exec($ch); $gram=json_decode($html,true); foreach ($gram["result"] as $message)
Несколько пояснений по коду. В методе getUpdates используем параметр offset, чтобы считывать только новые события. Получаем данные curlом и преобразуем полученный json ответ в массив и перебираем циклом сообщения.
В сообщении меня интересуют:
- $message["update_id"] - номер события
- $message["message"]["text"] - текст сообщения
- $message["message"]["chat"]["id"] - и самое главное ID чата
Я реализовал связку чата в Telegram с аккаунтом пользователя через цифровой код вида <11.1111111.on>, который пользователь видит в личном кабинете, а затем отправляет боту. Соответственно, если в тексте сообщения встретилась такая последовательность, нашелся внутренний ID пользователя (цифры до первой точки) и совпал проверочный код (цифры между точками), то в данный аккаунт записывается номер чата Telegram (был еще вариант слать боту email, под которым пользователь зарегистрирован на Глисе) и уже все готово для отсылки уведомлений.
Отправку ответов бота, а также уведомлений делается с помощью метода sendMessage, у которого два обязательных параметра: номер чата и текст сообщения.
$url=$boturl."/sendMessage?chat_id=".$message["message"]["chat"]["id"]."&disable_web_page_preview=true&text=".urlencode($answer); curl_setopt($ch, CURLOPT_URL,$url); $html = curl_exec($ch);
Еще осталось соблюсти пользовательское соглашение Телеграма и анализируя текст сообщения обучить бота командам /start и /help, выдавая соответствующие ответы.
Ссылка на бота telegram.me/glisa_bot, либо его можно найти набрав в поиске в Telegram глиса.