На прошлом занятии мы получили токен бота для взаимодействия с ним по API. Можем ли мы использовать API для отправки сообщения боту? Не будем спешить с ответом, который может удивить.
Для проверки работоспособности токена откройте браузер и введите в адресной строке запрос:
https://api.telegram.org/botTOKEN/getMe
, где вместо TOKEN вставьте токен своего бота. В случае правильного запроса и успешного его выполнения браузер выведет на странице информацию о боте. Токен бота состоит из двух частей — числа и строки, разделённых двоеточием. Из ответа видно, что число в токене является ID бота. Его можно использовать для получения информации о чате. Проверим это, выполнив запрос:
https://api.telegram.org/botTOKEN/getChat?chat_id=ID
, где вместо TOKEN и ID укажите соответствующие значения. Должно получиться что-то в таком виде:
https://api.telegram.org/bot123...:ABC.../getChat?chat_id=123...
В случае правильного запроса и успешного его выполнения браузер выведет на странице информацию о чате. В противном случае будет показана информация об ошибке. Бот и чат связаны друг с другом, но это разные сущности и при обращении к чату необходимо указать chat_id.
GET-запросы к серверам ТГ выглядят так:
Адрес сервера/токен бота/имя метода?параметры
Помимо GET-запросов для обращения к серверам ТГ можно использовать POST запросы, но для простоты мы пока будем использовать вариант с GET:
getMyName — запрос имени бота
https://api.telegram.org/bot0123456789:ABCDEFG.../getMyName
getMyDescription — запрос описания бота. Оно выводится в пустом чате
https://api.telegram.org/bot0123456789:ABCDEFG.../getMyDescription
getMyShortDescription – запрос короткого описание бота, которое выводится в окне настройки бота
https://api.telegram.org/bot0123456789:ABCDEFG.../getMyShortDescription
Одноимённые методы с префиксом set позволяют изменять данные:
setMyName — метод для изменения имени бота
https://api.telegram.org/bot0123456789:ABCDEFG.../setMyName?name=TEXT
setMyDescription — метод для изменения описания бота
https://api.telegram.org/bot0123456789:ABCDEFG.../setMyDescription?description=TEXT
setMyShortDescription – метод для изменения короткого описание бота
https://api.telegram.org/bot0123456789:ABCDEFG.../setMyShortDescription?short_description=TEXT
Если мы знаем ID бота, который также используется и как ID чата, то может возникнуть мысль отправить боту сообщение. Попробуем это сделать с помощью метода sendMessage:
https://api.telegram.org/bot123:ABC.../sendMessage?chat_id=123...&text=Привет
После выполнения в окне браузера отобразится ошибка - боты не могут отправлять сообщения ботам. Вот мы и получили ответ на исходный вопроc. Отправить по API сообщение боту нельзя, а в нашем случае он отправляет его самому себе.
Для уменьшения числа ошибок при использовании методов нужно понимать, кто является отправителем сообщения, а кто его получателем. От этого зависит успех или неудача при выполнении разных методов. Одни методы могут применяться к сообщениям от бота и от пользователя, например, удаление сообщений (но не во всех случаях), другие - только к сообщениям от бота, например редактирование сообщений.
В официальной документации не всегда понятно указано то, в каких случаях действует метод. По своей логике кажется, что вот это же должно железно работать, а разработчики реализовали работу иначе.
Чтобы набить руку в общении с ботом имеет смысл попрактиковаться с созданием запросов в Postman. "Какие запросы, какие постмены?! Когда мы на питоне начнём ботать?" - воскликнет нетерпеливый читатель. Можно прямо сейчас, но тогда могу порекомендовать зарегистрироваться на заморском форуме, чтобы по каждому поводу просить помощь на английском языке: "Помогите, парни! Всё делаю правильно, а не работает!".
Признаться, своего первого бота я так и пытался сделать. А что тут сложного? PHP, вроде, не первый год копаю. Запрос сделать - пара строк. Библиотеку выбрать - не вопрос, вот рекомендуют. Только вскоре выяснилось, что и выбранная библиотека как-то подглючивает, и нужно что-то с отладчиком придумывать, чтобы видеть, где затыки, и с официальной документацией сходу как-то не ладится. А там немало интересного можно найти, когда понял базу.
Для разных языков программирования существуют разные библиотеки для упрощения работы с Bot Api. Но в данном случае предпочитаю использовать чистый API по нескольким причинам:
Для отправки сообщений от бота в запросе нужно указать ID получателя - чата, канала и т.д. ID можно представить как адрес электронной почты и для пользователя он создаётся при регистрации в ТГ. Только в отличие от email узнать свой ID непросто. Для этого можно воспользоваться сторонними ботами. Но мы поступим хитрее и начнём работу не с приватным чатом, а с каналом. Зачем такие сложности?
При работе с каналом мы можем легко получить и chat_id канала, и id сообщения. Это позволит посмотреть методы для обновления созданных постов - текста, надписи, фотографии и др.
Создайте приватный канал. Добавьте в канал вашего бота администратором. На следующем занятии мы откроем официальную документацию и, надеюсь, не испугаемся.