программирование,

Базовые сведения о Telegram Bot API

Aug 22, 2022 · 13 мин. на прочтение
Базовые сведения о Telegram Bot API
Поделиться

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

Что такое Telegram Bot? Официальный сайт даёт такое определение:

Боты — это сторонние приложения, которые работают внутри Telegram. Пользователи могут взаимодействовать с ботами, отправляя им сообщения, команды и встроенные запросы. Вы управляете своими ботами, используя HTTPS-запросы к Telegram Bot API.

Для того, чтобы создать простейшего бота не нужно ничего, кроме самого Telegram. Пользователи смогут отправлять вашему боту сообщения через Telegram-клиента (мессенджер) или через API. А для того, чтобы взаимодействовать со своим ботом как владелец, не нужно ничего, кроме браузера (или другой программы, которая будет отправлять HTTPS-запросы). Но это будет самый простейший бот и простейшее взаимодествие. Чтобы научить ваш бот сложным вещам, чтобы автоматизировать получение и обработку сообщений, придётся немного покодить. Но это очень просто и можно использовать любой язык программирования, который вы знаете. Я покажу пример на JavaScript, вы легко его можете адаптировать под тот язык, который знаете.

Создание (регистрация) Telegram-бота.

По сути, боты Telegram — это специальные аккаунты, для настройки которых не требуется дополнительный номер телефона. Вам нужно зарегистрировать (создать) бота, а потом пользователи смогут отправлять ему сообщения или команды, а он сможет им отвечать.

assets/images/linux-filesystem-operations/1.png

За регистрацию и управление ботами отвечает другой бот - BotFather. Это официальный бот от разработчиков Telegram. Сперва нужно найти его в Telegram и сообщить ему, что вы хотите зарегистрировтаь нового бота. После ответов на серию простейших вопросов вы получите Token, используя который сможете взаимодествовать со своим ботом через Bot API, как владелец. А пользователи смогут отправлять ему сообщения и команды через Telegram или API.

Найдите в своём мессенджере BotFather (https://t.me/botfather), так же как любого другого пользователя и отправте ему команду /newbot. Вас попросят сообщить название и имя вашего нового бота, а взамен дадут Token.

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

assets/images/linux-filesystem-operations/1.png

С этого момента вы можете начинать взаимодействовать с вашим ботом. Например, используя метод getMe, вы можете отправить GET запрос в Telegram Bot API и получить информацию о вашем боте. Вставьте в адресную строку вашего браузера следующую ссылку и перейдите по ней.

https://api.telegram.org/bot{TOKEN}/{METHOD_NAME}

где:

  • TOKEN - token, который вы получили от BotFather
  • METHOD_NAME - метод Bot API, которую вы хотит использовать

Например

https://api.telegram.org/bot0123456789:AAFYNwvkDdfgHJ3jhgrs3cUH4oSOEAVSZp8/getMe

Если вы сделали всё правильно, то в ответ вы получите JSON объект примерно такого вида:

{
  "ok": true,
  "result": {
    "id": 0123456789,
    "is_bot": true,
    "first_name": "DanshinMS - тестовый бот",
    "username": "DanshinMS_bot",
    "can_join_groups": true,
    "can_read_all_group_messages": false,
    "supports_inline_queries": false
  }
}

id - это идентификатор вашего бота. Любой пользователь, чат или канал Telegram имеет подобный ID. Именно этот ID используется для взаимедойствия бота с пользователем.

значение true в параметре is_bot говорит, что тип этого пользователя bot.

first_name и username говорят сами за себя. Это то, что вы сообщали BotFather при регистрации бота.

"can_join_groups": true - говорит о том, что вашего бота можно добавлять в группы.

"can_read_all_group_messages": false - говорит о том, что ваш бот не может читать сообщения пользователей в группе. Вы можете изменить это значение на True и тогда бот сможет читать, что пишут другие пользователи.

"supports_inline_queries": false - говорит о том, что вашему боту нельзя отправлять команды, используя символ @. Вы можете изменить это значение на True и тогда пользователи смогу это делать.

Чтение сообщений

Как только бот зарегистрирован, ему можно отправлять сообщения. Находите его в Telegram, нажимаете Start и отправляете сообщение.

assets/images/linux-filesystem-operations/1.png

Все сообщения попадают на сервера Telegram и хранятся там не более 24 часов. Чтобы получить список сообщений, есть два способа.

  1. Вызвать метод getUpdates, так же, как мы это делали с методом getMe.
  2. Настроить webHook. Про этот способ я расскажу чуть позже.

Давайте воспользуемся первым способом, вызовем метод getUpdates.

https://api.telegram.org/bot0123456789:AAFYNwvkDdfgHJ3jhgrs3cUH4oSOEAVSZp8/getUpdates

Метод вернёт объект, похожий на этот:

{
  "ok": true,
  "result": [
    {
      "update_id": 206369231,
      "message": {
        "message_id": 1,
        "from": {
          "id": 0123456789,
          "is_bot": false,
          "first_name": "Mikhail",
          "last_name": "Danshin",
          "username": "mdanshin",
          "language_code": "en"
        },
        "chat": {
          "id": 0123456789,
          "first_name": "Mikhail",
          "last_name": "Danshin",
          "username": "mdanshin",
          "type": "private"
        },
        "date": 0123456789,
        "text": "/start",
        "entities": [
          {
            "offset": 0,
            "length": 6,
            "type": "bot_command"
          }
        ]
      }
    },
    {
      "update_id": 206369232,
      "message": {
        "message_id": 2,
        "from": {
          "id": 0123456789,
          "is_bot": false,
          "first_name": "Mikhail",
          "last_name": "Danshin",
          "username": "mdanshin",
          "language_code": "en"
        },
        "chat": {
          "id": 0123456789,
          "first_name": "Mikhail",
          "last_name": "Danshin",
          "username": "mdanshin",
          "type": "private"
        },
        "date": 1661089150,
        "text": "Hello, my new bot! How are you?"
      }
    }
  ]
}

Поле "text" будет содержать тект сообщения. Теперь эти сообщения можно читать и как-то обрабатывать. А позже я покажу, как удалить уже прочитанные сообщения.

Очевидно, что получать обновления таким способом не очень удобно. Нужно каждый раз отправлять запрос к серверу телеграм и делать это нужно с очень высокой частотой. Лучше воспользоваться технологией webHook. В этом случае, при получении каких-то обновлений, Telegram сам будет их отправлять туда, куда мы скажем. С помощью метода setWebhook мы можем передать url и тогда каждый раз, как на сервер Telegram будут приходить какие-то изменения для нашего бота, Telegram сам будет их отправлять по указанному нами url. Естественно, что в этом случае нужно, чтобы кто-то прослушивал этот URL. Это может быть наш самописный сервис, работающий на каком-нибудь хостинге. В следующей статье я покажу как это реализовать на бесплатном хостинге. Сначала я думал взять для этого Heroku, но т.к. они отказываются от бесплатных тарифных планов, то мне ещё предстоит подобрать подходящего хостера. Так что подписывайтесь на новости или присоединяйтесь к группе в Telegram.

Отправка сообщений от имени бота

Самый простой сценарий использования бота, который не требует никакого программирования и специальных программ - это отправка сообщений от имени бота.

Например, вы моежет добавить бота в группу и используя Telegram Bot API отправлять от его имени сообщения в эту группу. Для этого нужно воспользоваться методом sendMessage. Вот как это делается.

В адресной строке вашего браузера, точно так же как вы это делали с методом getMe, вставьте URL следующего вида:

https://api.telegram.org/bot{TOKEN}>/sendMessage?chat_id={CHAT_ID}&text={TEXT}

где:
* TOKEN - token, который вы получили от BotFather.
* CHAT_ID - ID пользователя, группы или канала, которому вы хотите отправить сообщение (как узнать ID см. ниже, в этой статье).
* TEXT - Текст сообщения, который вы хотите отправить.

Например:

https://api.telegram.org/bot0123456789:AAFYNwvkDdfgHJ3jhgrs3cUH4oSOEAVSZp8/sendMessage?chat_id=0123456789&text=Hello World

Одним из практических примеров использования этого метода может быть система мониторинга или любая система, где требуется оповещение и которая может отправлять HTTPS запрос или выполнять скрипт. Например, при возникновении события, система мониторинга запускает Powershell скрип, который, в свою очередь, отправляет сообщение от имени бота. Делается это очень просто:

Invoke-WebRequest https://api.telegram.org/bot123456789:AAFYNwvkDdfgHJ3jhgrs3cUH4oSOEAVSZp8/sendMessage?chat_id=0123456789&text=Alert Message

Как узнать ID?

Чтобы отправить кому-то сообщение, вам нужно знать его ID. ID так же есть и у чатов и у каналов. И их ID тоже нужно знать, чтобы иметь возможность отправлять им сообщения.

Один из способов узнать ID чата - добавить бота в чат и вызвать метод getUpdates:

https://api.telegram.org/botTOKEN/getUpdates

например:

https://api.telegram.org/bot0123456789:AAFYNwvkDdfgHJ3jhgrs3cUH4oSOEAVSZp8/getUpdates

Вы получите список накопившихся обновлений и скорее всего последним обвнолвением будет именно добавление в группу. Оно будет иметь примерно такой вид:

{
    "update_id": 31405408,
    "message": {
        "message_id": 7,
        "from": {
            "id": 123456789,
            "is_bot": false,
            "first_name": "Mikhail",
            "last_name": "Danshin",
            "username": "mdanshin",
            "language_code": "en"
        },
        "chat": {
            "id": -0123456789012,
            "title": "Моя тестовая группа",
            "type": "supergroup"
        },
        "date": 123456789,
        "new_chat_participant": {
            "id": 123456789,
            "is_bot": true,
            "first_name": "DanshinMS - тестовый бот",
            "username": "DanshinMS_bot"
        },
        "new_chat_member": {
            "id": 123456789,
            "is_bot": true,
            "first_name": "DanshinMS - тестовый бот",
            "username": "DanshinMS_bot"
        },
        "new_chat_members": [
            {
                "id": 123456789,
                "is_bot": true,
                "first_name": "DanshinMS - тестовый бот",
                "username": "DanshinMS_bot"
            }
        ]
    }
}

Обратите внимание на объект chat. Его свойство "id" содержит отрицательное значение. Это и есть ID чата.

    "chat": {
        "id": -0123456789012,
        "title": "Моя тестовая группа",
        "type": "supergroup"
    }

Когда пользователь будет отправлять сообщение боту, то эти сообщения тоже можно будет получить через getUpdates и в них тоже будут содержаться ID пользователей.

Удаление прочитанных сообщений

Каждый раз вызывая метод getUpdates вы будете получать все сообщения за последние 24 часа. Чтобы удалить уже обработанные, в методе getUpdates нужно передать offset с номером обновления + 1.

Допустим вы получили от сервера объект.

{ ok: true, result: [
        {
            update_id: 31405473,
            message: [Object]
        }
    ]
}

Вы обработали его и хотите удалить, чтобы при следующем обновлении он не приходил. Обратите внимание на поле update_id. Передайте в методе getUpdates этот id + 1 в качестве значения параметра offset и вы больше не увидите ни одного обновления со значением меньшем, чем то, которое вы передали.

Вот как это можно сделать:

https://api.telegram.org/bot0123456789:AAFYNwvkDdfgHJ3jhgrs3cUH4oSOEAVSZp8?offset=31405474

Ниже пример кода на JavaScript + Node.js. Эту функцию легко адаптировать под любые другие методы из Telegram Bot API и даже написать свой фреймворк.

const https = require("https");
const apiToken = "0123456789:AAFYNwvkDdfgHJ3jhgrs3cUH4oSOEAVSZp8"

function getUpdates(offset) {
    const options = {
        hostname: `api.telegram.org`,
        path: `/bot${apiToken}/getUpdates`,
        method: "POST",
        headers: { 'content-type': 'application/json' },
    }

    const bodyContent = JSON.stringify({
        "offset": `${offset}`
    })

    const req = https.request(options, (response) => {

        response.on('data', (d) => {
            const data = JSON.parse(d)
            console.log(data);
        });
    });

    req.write(bodyContent);
    req.end();
}

getUpdates("123");

Теперь, имея представление о том, как создавать и взаимодействовать с ботами, используя любой язык программирования, вы сможете без труда автоматизировать рутиные операции - получение новых сообщений и их обработку. Посмотрите все методы Telegram Bot API. Их не так много и с ними можно легко разобраться.

Периодически разработчики Telegram делают что-то новое. А сообщество уже давно выпустило фреймворки, которые облегчают жизнь. Некоторые из них стали очень популярны:

Node JS

Node.js Telegram Bot API

telegraf.js

Python

Python Telegram Bot

C#

.NET Client for Telegram Bot API

Читайте статью Взаимодействие с Telegram Bot API через Postman. В ней вы узнаете о том, как взаимодействовать с Telegram Bot API при помощи мощного инструмента разработчиков Postman.

Заходите в группу Telegram
Если есть вопросы или хотите пообщаться, то заходите в мою группу Telegram.