Перейти к основному содержимому

Telegram bot в Yandex.Cloud Serverless функции

· 3 мин. чтения

Начнем с того, что набросаем небольшого тестового бота поверх фреймворка Telegraph.

import {Telegraf, Markup} from 'telegraf';
import makeHandler from "lambda-request-handler";

const token = process.env.BOT_TOKEN
if (token === undefined) {
throw new Error('BOT_TOKEN must be provided!')
}

const bot = new Telegraf(token, {
telegram: {webhookReply: true}
})

const keyboard = Markup.inlineKeyboard([
Markup.button.url('❤️', 'http://telegraf.js.org'),
Markup.button.callback('Delete', 'delete')
])

bot.start((ctx) => ctx.reply('Hello'))
bot.on("text", (ctx) => {
ctx.telegram.copyMessage(ctx.message.chat.id, ctx.message.chat.id, ctx.message.message_id, keyboard)
})
bot.action('delete', (ctx) => ctx.deleteMessage())

export const handler = makeHandler(
bot.webhookCallback(process.env.BOT_HOOK_PATH ?? '/')
)

Он нам понадобится для того чтобы мы смогли указать webHook в Telegram API. Здесь репо, откуда его можно себе склонировать https://github.com/nikolaymatrosov/yc-telegram-support-bot.

Наверное в Телеграме в качестве webHook урла можно указать и технический домен, который будет автоматически заведен в API Gateway, но мне захотелось поэкспериментировать с preview-функциональностью привязки домена. И так…

Создаем сертификат

У вас же наверняка завалялся домен, который вы когда-то купили и давно хотели развернуть на нем свой pet project. Ну что ж настало твое время, Валера.

Начнем с сертификата.

В отличие от домена, сертификата у меня не завалялось, поэтому я выберу опцию создания сертификата через Let’s Encrypt.

Выбираем Let’s Encrypt.

Тип проверки оставлю DNS, так планирую использовать его не напрямую в Object Storage, а в API Gateway.

Отлично. Теперь кликаем по секциям внизу страницы, находим те, что содержат строки для проверки через TXT записи и прописываем их в настройках вашего регистратора доменных имен.

У меня на reg.ru это выглядело примерно вот так.

Теперь пожалуй самый долгий этап: дождаться пока пройдет валидации сертификата. Я сидел и проверял некоторое время, но потом мне надоело и пошел пить чай, а когда вернулся, то все закончилось. Короче процесс может спокойно занять от получаса и дольше. Судя по timestamp’ам со следующего скриншота отработало за час.

Привязываем домен

Теперь при помощи этого сертификата можно подтвердить владение доменом, ведь для выпуска сертификата, мы подтверждали, что домен принадлежит нам.)

Теперь у нас все готово, чтобы использовать этот сертификат в API Gateway.

Заводим бота

Но сначала нам понадобится раздеплоить функцию что мы написали в начале. Для этого пишем в телеграме боту @BotFather. Через него создаем своего нового бота. Наша цель получить токен.

Токен секретный, поэтому я его не покажу. 🤐

Деплоим функцию

Теперь можем заполнить файл .env скопировав скелет из .env.template. Затем функцию можно развернуть при помощи команды

npm run deploy

Следующий шаг создание API Gateway.

openapi.yaml
openapi: 3.0.0
info:
title: Telegram Support Bot
version: 1.0.0
servers:
- url: https://%api_gw_id%.apigw.yandexcloud.net
- url: https://%custom_domain%
paths:
/telegram:
get:
x-yc-apigateway-integration:
type: cloud_functions
function_id: %function_id%
tag: $latest
service_account_id: %service_account_id%
responses:
200:
description: Ok
post:
x-yc-apigateway-integration:
type: cloud_functions
function_id: %function_id%
tag: $latest
service_account_id: %service_account_id%
responses:
200:
description: Ok

Замените переменные между % на свои значения.

Дальше нужно прописать у регистратора CNAME запись указывающую на технический домен API Gateway %api_gw_id%.apigw.yandexcloud.net..

Теперь у нас все готово. Можно добавить себе ваш бот и отправить ему тестовое сообщение.