Платформа подписки на Push-уведомления
64,38
рейтинг
30 июня 2015 в 20:49

Разработка → Push-уведомления через Telegram



25 июня Telegram открыл платформу для ботов. Первая моя мысль была — ведь можно слать через него уведомления! При помощи уведомлений через телеграм можно решить сразу несколько проблем, хотя бы частично:
  • Поддержка iOS
  • Поддержка Windows Phone
  • Получение уведомлений без установки лишних приложений

Таким образом, PushAll теперь может отправлять уведомления на устройства Android, Chrome и в Telegram через бота.



Под катом небольшая инструкция по настройке и детали разработки. (небольшая инструкция для тех, кто собрался делать такого же бота)

Привязываем


Нужно всего лишь открыть ссылку — telegram.me/PushAllBot и написать боту все что угодно.
В ответ он даст ссылку, по которой нужно перейти для установки связи.



После перехода вам предложат авторизироваться, если вы еще не вошли в систему, либо будет выведено сообщение, что устройство привязано.

Из недостатков этого метода приема можно выделить:
  • Невозможность последующей модификации уведомлений
  • Невозможность отслеживания доставки (возможно временно)
  • Невозможность присылать иконку к сообщению (передавать каждый раз файл с картинкой так себе вариант)


Технические детали


Работает все достаточно просто.
Тут есть документация по API.
Я создал бота командой /newbot и следовал инструкциям, дальше задал пикчу, командой /setuserpic
Используя полученный токен, я привязал Webhook для получения сообщений.
Тут нужно понять одну небольшую вещь: если вы работаете с PHP вы не получите данные в переменной $_POST.
Данные JSON можно получить при помощи команды:

file_get_contents('php://input')


А дальше уже можно парсить JSON ответ.
Отправка идет по ID чата. Оно же равно ID пользователя.
Я не нашел каких-либо ограничений на использование API или кол-во отправки сообщений. Поэтому данная функция будет еще долго тестироваться. Как минимум, мне не нравится, что для каждого сообщения нужно делать отдельный запрос. Это значит, что мне либо придется делать их в несколько потоков по несколько сотен в секунду, либо делать их по очереди. А обработка каждого занимает около 50-100 мс, что достаточно долго. Если же еще там есть какие-либо ограничения, я могу столкнуться с проблемой, когда я смогу разослать 1000 уведомлений лишь за несколько минут.

Примерно так работает Webhook у меня:

$gram=json_decode(file_get_contents('php://input'),true);

$message='Привет, '
.$gram['message']['chat']['last_name'].' '
.$gram['message']['chat']['first_name'].'. Твой ID в Telegram: '
.$gram['message']['chat']['id'];

file_get_contents('https://api.telegram.org/botTOKEN/sendMessage?chat_id='
.$gram['message']['chat']['id'].'&text='
.urlencode($message));


Как мне кажется, можно делать неплохих ботов для «слепого» чата. Когда собеседники ничего не знают друг о друге. Через Redis сделать взаимодействие. При приеме сообщения через Webhook отправлять сообщение другому ожидающему сообщение. После создания связи — пересылать сообщения используя разные chat_id пользователей.

API у Telegram оказалось очень простым. Никаких аккаунтов разработчика и тому подобное — не нужно. Создаешь бота сразу получаешь токен, сразу работаешь с API.
Автор: @BupycNet
PushAll
рейтинг 64,38
Платформа подписки на Push-уведомления

Комментарии (39)

  • 0
    Жаль что пока Telegram API не позволяет работать с файлами
    • 0
      Позволяет, можно слать файлы и принимать вроде как. Даже обменник на боте сделал кто то слышал
    • 0

      Можно слать много всего. При приеме сообщения вроде как если там контент — есть его ID и по нему можно скачать файл.
      • 0
        вот именно что файл средствами этого API пока не скачать :)
        Вот ответ саппорта
        Downloading files for bots isn't supported in the API for the moment. But this is just the beginning — a lot more will be possible soon.
        • 0
          Тогда прошу прощения :( Но думаю эта функция будет 100% как и функции вроде множественной рассылки сообщений, которая мне так нужна.
    • +16
      Ведь можно пользоваться другими файлообменниками

      image
  • 0
    Сейчас тоже пишу бота. Немного не понимаю, почему нужно указывать именно chat_id, а не просто указать имя пользователя для отправки. И насколько этот chat_id будет актуален через какое-то время? Может ли он обновиться? Надо разбираться :)
    • 0
      Chat_id = айди пользователя.
      Я думаю это сделано с целью, чтобы не могли спамить по базе логинов через бота. Т.е. пока юзер сам не даст свой ID вы ему ничего не пошлете.

      Да он будет действовать вечео. У группового чата — свой айди.
      • 0
        Спасибо, теперь все ясно. Я почему-то подумал что этот ID выдается именно как ID сессии чата :)
        Значит буду сохранять в БД эти значения.
        • 0
          Там даже по ответу это видно. Оно кидает 2 массива, один массив — пользователя, второй чата. Если пользователь пишет сам — то они идентичны. Если он вас кинул в чат с кем то еще, то вы можете слать в чат и видеть кто именно пишет вам из него.
      • 0
        chat_id — это ID чата и все. Есть групповые чаты, поэтому нужно отдельное поле, а не просто ID пользователя. Объяснение про спам не нужно, оно бессмысленно, никто не мешает просто не давать слать пользователю, который еще не писал боту, без всякого chat_id.
        • 0
          Да это понятное дело. Просто я как пример привел, почему этот ID не будет меняться, потому что если это чат с пользователем, то айди его чата равен айди пользователя.
  • 0
    А обработка каждого занимает около 50-100 мс, что достаточно долго.

    Это еще хорошо. С MPNS можно это время смело умножать на 10.
  • –17
    "№;%!!!
    Все таки в телеграме работают безрукие. Ну почему нельзя иметь имя бота начинающееся с [0-9] ???
    • –10
      Как и ожидалось набежала куча минусующих дебилов, ни один из которых словами выразить ничего не смог.
    • +5
      Для Вас настолько критично иметь бота с именем, начинающимся с цифры, что вы моментально перешли на личности?
      • –1
        Я никуда не переходил. Мне вообще поровну что там. Просто количество косяков в телеграмме зашкаливает и это один из них. Что косвенно свидетельствует об уровне разработчиков. В том же самом slack все работает просто и сразу. В телеграмм какие-то приседания в противогазе. Вроде и не мешает, но нахрен так жыть?
    • 0
      напиши свое, сам пользуйся, сам радуйся
      • 0
        Зачем? Есть slack.
  • 0
    Нужно было отсылать сообщения в Телеграм из JS еще до появления их бот платформы, использовал Notificatio чтобы не мучаться с Telegram.API. Думал перейти на bot-api, но судя по комментариям он еще сыроват. Подожду…
    • 0

      Мне кажется, у них сейчас бизнес рухнет.

      Моё решение кстати уже лучше по нескольким параметрам:
      • Есть нативная поддкажка Android и Chrome, будет еще нативная iOS и возможно WP
      • Какие у них цены? Я вижу только 100 бесплатных соощений.
      • Не могу посмотреть цены, т.к. нет авторизации через соц сети
      • Пользователи опять никак не контролируют процесс подписки отписки? :)


      А вам нужно было именно чисто в телеграм?
    • 0
      А забыл насчет цен, у меня сейчас 5000 уведомлений в сутки беслпатно. Правда никто до такого количества добраться не может, поэтому возможно я буду уменьшать это количество. Но при этом думаю, что к примеру 2000 сообщений в сутки будет стоить в районе 200 рублей в месяц. Это где то 62 тысячи уведомлений в месяц, по 1 копейке за 3 уведомления.
      Но как и обещал — все кто сейчас получают безлимит до 5000 уведомлений. А те, кто продвинали сервис в самом начаще так и будут пользоваться полным безлимитом.

      Не радует только то, что сейчас никто вообще не платит, т.е. как такового дохода с проекта практически нет. Сегодня зарегалось более 100 новых пользователей, один хороший человек кинул 100 рублей. Один рекламный баннер адсенса принесет мне в месяц в районе 300 рублей думаю. Как раз хватит ровно на оплату сервера.

      Но проект на самом деле надо как то монетизировать. То есть я хочу отделить тех, у кого денег нет — они могут пользоваться бесплатно как по акции. А те, кто на самом деле повышают эффективность своей деятельности засчет моего сервиса — должны это оплачивать, хотя бы немного, хотя бы рублей 200.
  • 0
    Когда разбирался с API столкнулся с ограничением.
    К примеру, webhook можно поднять только по HTTPS, то есть если на сервере нет SSL, то система не дает повесить обработчик.
    В своих экспериментах использовал сервер без SSL, который методом getUpdates забирает с сервера Telegram сообщения.

    Поделитесь опытом, у вас через HTTPS все работает или есть еще какой-то способ?
    • 0
      Конечно через HTTPS. В статье даже описан метод как был сделан обработчик.
      • 0
        Да, описание обработчика я заметил, спасибо. Хорошо когда на сервере есть SSL )
    • 0
      С такими же ограничениями столкнулся. Пришлось купить домен и добавить его в сертификат. Причем замечу, что самоподписанные сертификаты не работают.
      • 0
        Сделал аналогичным образом. Не приходят никакие данные от телеграма. Если вручную забить, то все ОК. У вас работает?
        • 0
          Вы сделали как в статье? php://input
          Я вообще отлаживал через редис сохранял данные от телеграма в редис а читал в другом месте.
          • 0
            Уже разобрался. Проблема была в неправильно настроенном сертификате. В Firefox он нормально работал, а в хроме жаловался :) Сервер на Node.js.

            Все таки не хватает функции проверки вебхуков у телеграма. Так сиди, гадай, в чем проблема была :)
            • 0
              Это еще ладно, мы двух ботов зарегистрировали. Установили хук, не приходит ничего и все тут. Руками отправляешь пост на адрес хука — все ок, от телеграма не приходит. Бились с сертификатом, бились с хостером, оказалось все прозаичней, наша система установила адрес хука одному боту, а писали мы другому :-)
              • 0
                Да весело, когда тестируешь на одном сервере, а на самом деле ты подключен к другому и не можешь понять почему ничего не меняется.
            • 0
              А что было настроено не правильно? А то у меня ни один браузер на сертификат не ругается, SSL Labs оценил его на «A+», да и всё остальное настроено, а сервера телеграма даже не пытаются подключаться.
              • 0
                Мне WoSign прислал файлы сертификатов, короче, я не те файлы для NGINX указал. В Firefox работали, а в Chrome хрен.
  • 0
    Сделал уведомления просто зарегистрировав обычного юзера на левый номер телефона и подняв на сервере telegram-cli. Неудобно то, что юзер должен сообщать номер телефона, но такой бот умеет сам инициировать общение, в отличие от ботов которые предложили в телеграм.
    • 0
      Тут еще одна деталь — ограничения. Бот расчитан на рассылку сообщений тем, кто инициировал с ним диалог. А вот бот через пользователя может иметь жесткие рамки по рассылкам.
      Итого
      — Нужно знать номер телефона. Многие люди не любят им делиться. А по законну это вроде как еще и считается чуть ли не персональными данными
      — Больше ограничений
      — Нужно держать в фоновом процессе консольного бота, вместо того, чтобы просто отвечать на webhook-запрос.

      К слову если брать в расчет мой сервис, то получаем еще вот что — при смене номера телефона или аккаунта телеграма, канал не теряет связи с человеком — человек просто привязывает другой телеграм аккаунт.
      В дальнейшем я думаю у меня вообще будет система выходов. Т.е. пользователи смогут прикручивать свои callback и слать уведомления вообще в ЛЮБУЮ систему у которой есть API.

      Сейчас же еще доступен андроид и хром напрямую. И уведомление можно слать бродкастом всем пользователям канала за один запрос, а потом вторым запросом собирать статистику приема.
      • 0
        Это всё прекрасно, только ограничения для многих сервисов (и моего в том числе) будут не такими уж большими, а пользователям гораздо проще ввести номер либо логин в телеграме. Обезличенный номер телефона не является персональными данными.

        Хорошо, конечно, что вы сделали такого бота, тут я совершенно не против. Но нужно думать как упрощать получение уведомлений, потому что реальные пользователи, в отличие от гиков, ленивы.
        • 0
          В том то вся и суть что они ленивы. У меня вход в один клик, подписка в один клик.
          А дальше в одик клик добавляешь любой метод получения уведомлений.

          Любой пользователь у меня в системе может подписаться на любой канал без ввода номеров и т.д. нажав одну кнопку.
          У вас же если у человека нет телеграма — он уже не сможет получать уведомлений. У меня же можно поставить приложение или получать уведомления через Push API в хроме без установки приложений.
    • 0
      Вроде как телеграм сейчас поддерживает логины вместо номера телефона, посмотрите в настройках.
      • 0
        Так и есть, но telegram-cli пока что не умеет.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка