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

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..

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