Как создать бота в Telegram
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
С помощью serverless-технологий можно создать бота для Telegram, который будет отвечать на сообщения в чате.
Смотреть видео в Yandex Cloud Video
Чтобы создать бота:
- Подготовьте окружение.
- Подготовьте ресурсы.
- Зарегистрируйте Telegram-бота.
- Опубликуйте изображение для бота.
- Создайте API-шлюз.
- Создайте функцию.
- Настройте связь между функцией и Telegram-ботом.
- Проверьте работу Telegram-бота.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки Telegram-бота входят:
- плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions);
- плата за объем хранилища, занятый данными, количество операций с данными и исходящий трафик (см. тарифы Object Storage);
- плата за количество запросов к созданному API-шлюзу и исходящий трафик (см. тарифы Yandex API Gateway).
Подготовьте ресурсы
-
Клонируйте репозиторий
с исходным кодом, необходимым для создания бота, для этого в терминале выполните команду git :git clone https://git@git.sourcecraft.dev/yandex-cloud-examples/yc-telegram-bot-serverless.git -
Создайте сервисный аккаунт и назначьте ему роли
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; - Таймаут —
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>.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: