Главное Авторские колонки Вакансии Образование
27 483 9 В избр. Сохранено
Авторизуйтесь
Вход с паролем

Push-уведомления в Telegram для чайников

Наверняка Вы уже видели похожую статью на Спарке. Использовав только ту статью я лично не смог сделать 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. Все что пишется боту, можно обрабатывать двумя способами:

  1. Забирать обновления, т.е. все что написали боту с помощью метода getUpdates: https://api.telegram.org/bot#token#/getUpdates
  2. Задать 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 чата
Шаг 4. Обучение бота

Я реализовал связку чата в 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 глиса.

+1
В избр. Сохранено
Авторизуйтесь
Вход с паролем