Blog. Just Blog

Отправка сообщений в Telegram из PHP-скриптов

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Отправка сообщений в Telegram из PHP-скриптов
Отправка сообщений в Telegram из PHP-скриптов

Достаточно долгое время у меня были настроены уведомления с сайта на ICQ, это было очень удобно. Потом что-то изменилось в протоколе авторизации мессенджера, уведомления перестали приходить, разбираться с этим мне было лениво, в результате последние пару лет я жил без оперативного информирования. Решив исправить эту ситуацию, я начал искать альтернативы из числа мессенджеров, которыми постоянно пользуюсь. Viber отпал из-за сложностей регистрации бот-аккаунтов, остался Telegram. Вот на нем я и сделал своего информационного бота для сайта.

Первым делом надо зарегистрировать бота. Для этого надо зайти в приложение Telegram и открыть чат с @BotFather. Откроется список команд, где надо выбрать /newbot. Затем система попросит выбрать название бота и его имя, по которому бот будет доступен для поиска. Если к названию особых требований нет, то имя должно обязательно быть уникальным и заканчиваться на "bot".

Регистрируем бота
Регистрируем бота

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

Получаем токен
Получаем токен

Когда все основные параметры будут введены, система выдаст вам персональный токен, с помощью которого можно будет работать с ботом через HTTP-запросы. Никому не передавайте этот токен, чтобы никто посторонний не получил к нему доступ. Если все же произошла утечка данных, то через @BotFather можно сгенерировать новый токен для вашего бота.

Если в настройках бота включен режим приватности (а он включен по умолчанию), то все сообщения, отправляемые ботом конкретному пользователю, не будут видны остальным подписчикам этого бота. Именно это нам и надо, ведь мы же не хотим, чтобы кто-то, случайно подписавшись на нашего бота, перехватывал все наши уведомления. Чтобы бот отправлял сообщения только нам, надо узнать идентификатор нашего чата.

Отправляем сообщение боту
Отправляем сообщение боту

Для этого подпишитесь на своего бота и отправьте ему любое сообщение. После этого в браузере надо сформировать ссылку следующего вида:

https://api.telegram.org/bot[token]/getUpdates
где [token] - это токен, полученный при регистрации бота. Например, для нашего бота ссылка будет вот такой:

https://api.telegram.org/bot629705209:AAFhFqFbhR3VHHrOgOM7R4OnQT-usqJwTBk/getUpdates

Если все сделано правильно, то в браузере откроется что-то подобное:

{"ok":true,"result":[
  {
    "update_id":434540657,
    "message":{
      "message_id":3,
      "from":{
        "id":698237240,
        "is_bot":false,
        "first_name":"Dmitry",
        "language_code":"ru"
      },
      "chat":{
        "id":698237240,
        "first_name":"Dmitry",
        "type":"private"
      },
      "date":1536053889,
      "text":"Hello"
    }
  }
]}

Красным цветом выделен нужный нам идентификатор чата. Если ответ пустой, то напишите боту еще парочку сообщений в чат и сразу же обновите страницу в браузере. В связи с недавними событиями по неудачной блокировке Telegram недоумками из Роскомнадзора, сайт api.telegram.org у некоторых провайдеров может оказаться недоступен. В этом случае придется воспользоваться Tor Browser или каким-нибудь другим инструментом для обхода блокировок.

Теперь переходим к самому интересному - отправке сообщений из скрипта в наш чат. Для этого в API Telegram есть метод sendMessage. Он принимает как GET, так и POST запросы. Обязательными параметрами являются chat_id - идентификатор чата и text - текст сообщения. Пример вызова будет таким:
  1. // Токен бота и идентификатор чата
  2. $token='629705209:AAFhFqFbhR3VHHrOgOM7R4OnQT-usqJwTBk';
  3. $chat_id='698237240';
  4.  
  5. // Текст сообщения
  6. $text='Привет, мир!';
  7.  
  8. // Отправить сообщение
  9. $ch=curl_init();
  10. curl_setopt($chCURLOPT_URL,
  11.        'https://api.telegram.org/bot'.$token.'/sendMessage');
  12. curl_setopt($chCURLOPT_RETURNTRANSFER