Как создать бота в Telegram
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
С помощью serverless-технологий можно создать бота для Telegram, который будет отвечать на сообщения в чате.
Чтобы создать бота:
- Подготовьте окружение.
- Подготовьте ресурсы.
- Зарегистрируйте Telegram-бота.
- Опубликуйте изображение для бота.
- Создайте API-шлюз.
- Создайте функцию.
- Настройте связь между функцией и Telegram-ботом.
- Проверьте работу Telegram-бота.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки Telegram-бота входят:
- плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions);
- плата за объем хранилища, занятый данными, количество операций с данными и исходящий трафик (см. тарифы Object Storage);
- плата за количество запросов к созданному API-шлюзу и исходящий трафик (см. тарифы Yandex API Gateway).
Подготовьте ресурсы
- Скачайте
архив с файлами, необходимыми для создания бота. - Создайте сервисный аккаунт и назначьте ему роли
editor
иfunctions.functionInvoker
на ваш каталог.
Зарегистрируйте Telegram-бота
Зарегистрируйте вашего бота в Telegram и получите токен.
-
Для регистрации нового бота запустите бота BotFather
и отправьте команду:/newbot
-
В поле
name
укажите имя создаваемого бота, напримерServerless Hello Telegram Bot
. Это имя увидят пользователи при общении с ботом. -
В поле
username
укажите имя пользователя создаваемого бота, напримерServerlessHelloTelegramBot
. По имени пользователя можно будет найти бота в Telegram. Имя пользователя должно оканчиваться на...Bot
или..._bot
.В результате вы получите токен. Сохраните его, он потребуется в дальнейшем.
-
Установите иконку для бота — файл
sayhello.png
из сохраненного архива. Отправьте боту BotFather команду:/setuserpic
Опубликуйте изображение для бота
Чтобы бот отправлял изображение в ответ на сообщения пользователя, создайте бакет в Object Storage и загрузите в него файл sayhello.png
из сохраненного архива.
Создайте бакет в Object Storage
-
В консоли управления
выберите каталог, в котором хотите создать бакет. -
Выберите сервис Object Storage.
-
Нажмите кнопку Создать бакет.
-
На странице создания бакета:
-
Введите имя бакета. Сохраните имя бакета, оно потребуется в дальнейшем.
-
Укажите настройки бакета:
- Макс. размер —
1 ГБ
; - Доступ на чтение объектов —
Публичный
; - Класс хранилища —
Стандартное
.
- Макс. размер —
-
Нажмите кнопку Создать бакет.
-
Загрузите изображение в бакет
- В консоли управления
выберите каталог, в котором находится ранее созданный бакет. - Выберите сервис Object Storage.
- Выберите ранее созданный бакет.
- Нажмите Загрузить.
- В появившемся окне выберите файл
sayhello.png
из сохраненного архива. Консоль управления отобразит файл, выбранный для загрузки. - Нажмите Загрузить.
Получите ссылку на загруженное изображение
- В консоли управления
выберите каталог, в котором находится ранее созданный бакет. - Выберите сервис Object Storage.
- Выберите ранее созданный бакет.
- Выберите файл
sayhello.png
. - Нажмите кнопку Получить ссылку.
- Проверьте доступность изображения по ссылке в браузере.
Создайте API-шлюз
Создайте и сконфигурируйте API-шлюз.
-
В консоли управления
выберите каталог, в котором хотите создать API-шлюз. -
Выберите сервис API Gateway.
-
Нажмите кнопку Создать API-шлюз.
-
Введите имя шлюза —
for-serverless-hello-telegram-bot
. -
Очистите содержимое поля Спецификация и вставьте в него следующий код:
openapi: 3.0.0 info: title: for-serverless-hello-telegram-bot version: 1.0.0 paths: /sayhello.png: get: x-yc-apigateway-integration: type: object_storage bucket: <имя_бакета> object: sayhello.png presigned_redirect: false service_account_id: <идентификатор_сервисного_аккаунта> operationId: static
Где:
bucket
— имя бакета;service_account_id
— идентификатор сервисного аккаунта, созданного ранее при подготовке ресурсов.
-
Нажмите кнопку Создать.
-
Выберите созданный API-шлюз. Сохраните значение поля Служебный домен, оно потребуется в дальнейшем.
Создайте функцию
Чтобы Telegram-бот отвечал на команды /start
, /help
и отправлял изображение в ответ на любой другой текст, создайте функцию.
-
В консоли управления
выберите каталог, в котором хотите создать функцию. -
Выберите сервис Cloud Functions.
-
Нажмите кнопку Создать функцию.
-
Введите имя функции —
fshtb-function
. -
Нажмите кнопку Создать.
-
В блоке Редактор выберите среду выполнения
Node.js
и нажмите Продолжить. -
В блоке Код функции очистите содержимое файла
index.js
и вставьте в него следующий код. Вместо<домен_API-шлюза>
укажите служебный домен API-шлюза.const { Telegraf } = require('telegraf'); const bot = new Telegraf(process.env.BOT_TOKEN); bot.start((ctx) => ctx.reply(`Hello. \nMy name Serverless Hello Telegram Bot \nI'm working on Cloud Function in the Yandex Cloud.`)) bot.help((ctx) => ctx.reply(`Hello, ${ctx.message.from.username}.\nI can say Hello and nothing more`)) bot.on('text', (ctx) => { ctx.replyWithPhoto({url: '<домен_API-шлюза>/sayhello.png'}); ctx.reply(`Hello, ${ctx.message.from.username}`); }); module.exports.handler = async function (event, context) { const message = JSON.parse(event.body); await bot.handleUpdate(message); return { statusCode: 200, body: '', }; };
-
В блоке Код функции создайте файл
package.json
и вставьте в него следующий код:{ "name": "ycf-telegram-example", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "MIT", "dependencies": { "telegraf": "^4.12.0" } }
-
Укажите следующие параметры:
- Среда выполнения —
nodejs16
; - Точка входа —
index.handler
; - Таймаут, c —
5
.
- Среда выполнения —
-
Добавьте переменную окружения
BOT_TOKEN
. В поле Значение укажите токен Telegram-бота. -
Нажмите Сохранить изменения.
-
Убедитесь, что функция публичная. Для этого на странице Обзор, в разделе Общая информация, переведите переключатель Публичная функция в активное состояние.
-
Сохраните идентификатор вашей функции, он потребуется в дальнейшем.
Настройте связь между функцией и Telegram-ботом
-
В консоли управления
выберите каталог. -
Выберите сервис API Gateway.
-
Выберите API-шлюз
for-serverless-hello-telegram-bot
. -
Измените спецификацию API-шлюза — после имеющихся строчек кода добавьте секцию
fshtb-function
:/fshtb-function: post: x-yc-apigateway-integration: type: cloud_functions function_id: <идентификатор_функции> operationId: fshtb-function
Где
function_id
— идентификатор функцииfshtb-function
. -
Нажмите кнопку Сохранить.
-
Выполните запрос в терминале:
-
Linux, macOS:
curl \ --request POST \ --url https://api.telegram.org/bot<токен_бота>/setWebhook \ --header 'content-type: application/json' \ --data '{"url": "<домен_API-шлюза>/fshtb-function"}'
-
Windows (cmd):
curl ^ --request POST ^ --url https://api.telegram.org/bot<токен_бота>/setWebhook ^ --header "content-type: application/json" ^ --data "{\"url\": \"<домен_API-шлюза>/fshtb-function\"}"
-
Windows (PowerShell):
curl.exe ` --request POST ` --url https://api.telegram.org/bot<токен_бота>/setWebhook ` --header '"content-type: application/json"' ` --data '"{ \"url\": \"<домен_API-шлюза>/fshtb-function\" }"'
Где:
<токен_бота>
— токен Telegram-бота.<домен_API-шлюза>
— служебный домен API-шлюза.
Результат:
{"ok":true,"result":true,"description":"Webhook was set"}
-
Проверьте работу Telegram-бота
Поговорите с ботом:
-
Откройте Telegram и найдите бота по имени пользователя
username
, созданному ранее. -
Отправьте в чат сообщение
/start
.Бот должен ответить:
Hello. My name Serverless Hello Telegram Bot I'm working on Cloud Function in the Yandex Cloud.
-
Отправьте в чат сообщение
/help
.Бот должен ответить:
Hello, <username>. I can say Hello and nothing more
-
Отправьте в чат любое текстовое сообщение. Бот должен в ответ прислать изображение и сообщение:
Hello, <username>
.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: