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.

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


  1. Xaser
    30.06.2015 22:19

    Жаль что пока Telegram API не позволяет работать с файлами


    1. BupycNet Автор
      30.06.2015 22:23

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


    1. BupycNet Автор
      30.06.2015 22:30


      Можно слать много всего. При приеме сообщения вроде как если там контент — есть его ID и по нему можно скачать файл.


      1. Xaser
        30.06.2015 22:33

        вот именно что файл средствами этого 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.


        1. BupycNet Автор
          30.06.2015 22:38

          Тогда прошу прощения :( Но думаю эта функция будет 100% как и функции вроде множественной рассылки сообщений, которая мне так нужна.


    1. yahorfilipcyk
      30.06.2015 22:30
      +16

      Ведь можно пользоваться другими файлообменниками

      image


  1. kapuletti
    30.06.2015 23:40

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


    1. BupycNet Автор
      30.06.2015 23:46

      Chat_id = айди пользователя.
      Я думаю это сделано с целью, чтобы не могли спамить по базе логинов через бота. Т.е. пока юзер сам не даст свой ID вы ему ничего не пошлете.

      Да он будет действовать вечео. У группового чата — свой айди.


      1. kapuletti
        30.06.2015 23:48

        Спасибо, теперь все ясно. Я почему-то подумал что этот ID выдается именно как ID сессии чата :)
        Значит буду сохранять в БД эти значения.


        1. BupycNet Автор
          30.06.2015 23:57

          Там даже по ответу это видно. Оно кидает 2 массива, один массив — пользователя, второй чата. Если пользователь пишет сам — то они идентичны. Если он вас кинул в чат с кем то еще, то вы можете слать в чат и видеть кто именно пишет вам из него.


      1. sferrka
        01.07.2015 00:56

        chat_id — это ID чата и все. Есть групповые чаты, поэтому нужно отдельное поле, а не просто ID пользователя. Объяснение про спам не нужно, оно бессмысленно, никто не мешает просто не давать слать пользователю, который еще не писал боту, без всякого chat_id.


        1. BupycNet Автор
          01.07.2015 02:26

          Да это понятное дело. Просто я как пример привел, почему этот ID не будет меняться, потому что если это чат с пользователем, то айди его чата равен айди пользователя.


  1. AterCattus
    01.07.2015 09:13

    А обработка каждого занимает около 50-100 мс, что достаточно долго.

    Это еще хорошо. С MPNS можно это время смело умножать на 10.


  1. tgz
    01.07.2015 09:34
    -17

    "№;%!!!
    Все таки в телеграме работают безрукие. Ну почему нельзя иметь имя бота начинающееся с [0-9] ???


    1. tgz
      01.07.2015 12:10
      -10

      Как и ожидалось набежала куча минусующих дебилов, ни один из которых словами выразить ничего не смог.


    1. akaluth
      01.07.2015 12:35
      +5

      Для Вас настолько критично иметь бота с именем, начинающимся с цифры, что вы моментально перешли на личности?


      1. tgz
        01.07.2015 13:53
        -1

        Я никуда не переходил. Мне вообще поровну что там. Просто количество косяков в телеграмме зашкаливает и это один из них. Что косвенно свидетельствует об уровне разработчиков. В том же самом slack все работает просто и сразу. В телеграмм какие-то приседания в противогазе. Вроде и не мешает, но нахрен так жыть?


    1. CCgames
      01.07.2015 14:59

      напиши свое, сам пользуйся, сам радуйся


      1. tgz
        01.07.2015 15:35

        Зачем? Есть slack.


  1. sochix
    01.07.2015 12:58

    Нужно было отсылать сообщения в Телеграм из JS еще до появления их бот платформы, использовал Notificatio чтобы не мучаться с Telegram.API. Думал перейти на bot-api, но судя по комментариям он еще сыроват. Подожду…


    1. BupycNet Автор
      01.07.2015 14:26


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

      Моё решение кстати уже лучше по нескольким параметрам:

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


      А вам нужно было именно чисто в телеграм?


    1. BupycNet Автор
      01.07.2015 14:44

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

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

      Но проект на самом деле надо как то монетизировать. То есть я хочу отделить тех, у кого денег нет — они могут пользоваться бесплатно как по акции. А те, кто на самом деле повышают эффективность своей деятельности засчет моего сервиса — должны это оплачивать, хотя бы немного, хотя бы рублей 200.


  1. tonkado
    01.07.2015 15:01

    Когда разбирался с API столкнулся с ограничением.
    К примеру, webhook можно поднять только по HTTPS, то есть если на сервере нет SSL, то система не дает повесить обработчик.
    В своих экспериментах использовал сервер без SSL, который методом getUpdates забирает с сервера Telegram сообщения.

    Поделитесь опытом, у вас через HTTPS все работает или есть еще какой-то способ?


    1. BupycNet Автор
      01.07.2015 15:09

      Конечно через HTTPS. В статье даже описан метод как был сделан обработчик.


      1. tonkado
        01.07.2015 15:55

        Да, описание обработчика я заметил, спасибо. Хорошо когда на сервере есть SSL )


    1. AlexeiZhuravlev
      01.07.2015 16:51

      С такими же ограничениями столкнулся. Пришлось купить домен и добавить его в сертификат. Причем замечу, что самоподписанные сертификаты не работают.


      1. kapuletti
        03.07.2015 14:20

        Сделал аналогичным образом. Не приходят никакие данные от телеграма. Если вручную забить, то все ОК. У вас работает?


        1. BupycNet Автор
          03.07.2015 16:18

          Вы сделали как в статье? php://input
          Я вообще отлаживал через редис сохранял данные от телеграма в редис а читал в другом месте.


          1. kapuletti
            03.07.2015 17:23

            Уже разобрался. Проблема была в неправильно настроенном сертификате. В Firefox он нормально работал, а в хроме жаловался :) Сервер на Node.js.

            Все таки не хватает функции проверки вебхуков у телеграма. Так сиди, гадай, в чем проблема была :)


            1. SonkoDmitry
              14.07.2015 19:14

              Это еще ладно, мы двух ботов зарегистрировали. Установили хук, не приходит ничего и все тут. Руками отправляешь пост на адрес хука — все ок, от телеграма не приходит. Бились с сертификатом, бились с хостером, оказалось все прозаичней, наша система установила адрес хука одному боту, а писали мы другому :-)


              1. BupycNet Автор
                14.07.2015 19:20

                Да весело, когда тестируешь на одном сервере, а на самом деле ты подключен к другому и не можешь понять почему ничего не меняется.


  1. druidvav
    01.07.2015 18:55

    Сделал уведомления просто зарегистрировав обычного юзера на левый номер телефона и подняв на сервере telegram-cli. Неудобно то, что юзер должен сообщать номер телефона, но такой бот умеет сам инициировать общение, в отличие от ботов которые предложили в телеграм.


    1. BupycNet Автор
      01.07.2015 19:04

      Тут еще одна деталь — ограничения. Бот расчитан на рассылку сообщений тем, кто инициировал с ним диалог. А вот бот через пользователя может иметь жесткие рамки по рассылкам.
      Итого
      — Нужно знать номер телефона. Многие люди не любят им делиться. А по законну это вроде как еще и считается чуть ли не персональными данными
      — Больше ограничений
      — Нужно держать в фоновом процессе консольного бота, вместо того, чтобы просто отвечать на webhook-запрос.

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

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


      1. druidvav
        01.07.2015 19:09

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

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


        1. BupycNet Автор
          01.07.2015 19:32

          В том то вся и суть что они ленивы. У меня вход в один клик, подписка в один клик.
          А дальше в одик клик добавляешь любой метод получения уведомлений.

          Любой пользователь у меня в системе может подписаться на любой канал без ввода номеров и т.д. нажав одну кнопку.
          У вас же если у человека нет телеграма — он уже не сможет получать уведомлений. У меня же можно поставить приложение или получать уведомления через Push API в хроме без установки приложений.


    1. akaluth
      02.07.2015 11:30

      Вроде как телеграм сейчас поддерживает логины вместо номера телефона, посмотрите в настройках.


      1. druidvav
        02.07.2015 11:32

        Так и есть, но telegram-cli пока что не умеет.