Эта статья навеяна популярностью ресурса среди студентов-программистов, но я постараюсь рассказать всё максимально просто для совсем начинающих программистов. В итоге создадим простого Эхо-бота, как заготовку для различных модификаций.
P.S. Также статья навеяна отсутствием туториала на языке Python, на Nodejs есть хороший туториал.
Ссылка на документацию Yandex Cloud Functions
Ссылка на документацию Telegram API.
Шаг 1: Регистрация и вход в платформу Яндекс облако
Шаг 2: Вход в Functions. Здесь нужно в левой панели «Консоли управления» выбрать «Cloud Functions»
Шаг 3: Жмем кнопку . После чего задаем осмысленное имя функции и описание.
Например telegram-study-bot, weather-get-api и т.д.
В описании же можно указать технологии. Например language=python3.7, lib=telebot
Шаг 4: Выбираем вкладку «Редактор»
После чего у нас откроется окно управления кодом нашей функции. Здесь мы можем выбрать:
1) «Среду выполнения», в нашем случае это python3.7
2) «Способы» отвечают за то, как будет передан код в функцию. В данной статье мы будет использовать прямой «Редактор код» в качестве наипростейшего примера.
3) «Точка входа» отвечает на то, какая функция будет принимать запрос и будет является стартом действия нашей функции, укажем её чуть позже.
4) Далее идут «Параметры», предлагаю их оставить как есть.
Шаг 5: Убеждаемся, что у нас выставлены нужные «Среда выполнения» и «Способ»
Затем кликаем на «Создать файл», назовем его main.py.
Шаг 6: У вас откроется редактор кода, где мы можем создать функцию-обработчик запроса. Назовем её handler и вставим данный код:
import json
def handler(event, context):
body = json.loads(event['body'])
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json'
},
'body': json.dumps({
'method': 'sendMessage',
'chat_id': body['message']['chat']['id'],
'text': body['message']['text']
}),
'isBase64Encoded': False
}
Функция handler у нас принимает два аргумента, первое это данные запроса, второе данные функции. Про них можно прочитать тут.
Далее в переменную body мы заносим Python словарь преобразовывая его функцией json.loads из body запроса.
Далее, по документации webhook telegram мы возвращаем нужного формата ответ, упаковывая в body, с помощью json.dumps, словарь с нужными нам данными.
ВНИМАНИЕ!!!
В «Точке входа» нужно указать данную функцию как начало работы скрипта. Пишем main.handler. Должно быть так:
После чего кликаем «Создать версию» и ждем, пока нас перекинет на вкладку «Обзор».
Шаг 7: Тут нас интересует «Ссылка для вызова» и переключатель «Публичная функция». Жмем переключатель и запоминаем где лежит ссылка для вызова.
Шаг 8: Создаем телеграм бота и копируем его токен. Вам нужно создать запрос типа:
https://api.telegram.org/bot<bot_token>/setWebHook?url=<webhook_url>
Где bot_token — ваш токен бота из телеграма, а webhook_url это «Ссылка для вызова» из функций (шаг 7). Данный запрос следует собранным вставить в строку браузера.
https://api.telegram.org/bot1234567:AAAAAAAAAAAAAAA/setWebHook?url=https://functions.yandexcloud.net/asdjaskjdasdjasd
Шаг 9: Отправим боту «привет» и посмотрим, что в итоге получили.
Спасибо за внимание! Если вы дочитали данную статью, то я буду рад различным предложением по улучшению/дополнению/замечаниям данной статьи.
tmnhy
Ура, наконец-то бот, который отвечает сообщением, которое получил! Никогда такого не было и вот опять эхо-бот.
Ну да, действительно, зачем нам сохранение состояния бота, вызовы методов API внешних систем, разграничение пользователей по ролям и т.д. и т.п.? Лишнее это.
Как преподователь, вы должны понимать, что задача где и как запускать бота он вторична, на первом месте стоит что и как бот делает. И один хендлер на хуке не делает бота ботом.
Намного интереснее описать структуру и выделить подсистемы, например, транспортную и работу с хранилищем. Отдельно часть реализующую функциональность, продумать возможность расширения этой самой функциональности. Администрирование — управление контентом, пользователями и получение статистики.
Много чего можно придумать для интересной статьи.
denisromanenko
Не мешайте идее serverless-приложений, это лучшее на что они способны, а вы все портите, недостаточно вам видите ли, заелись
Chronicler
Кстати, у MS Azure Functions есть собственная BD которую serverless C# код может использовать.
APXEOLOG
Уже третий 15-летний легаси продукт переписываем на serverless. Костылей конечно много, но в принципе все работает
Nireko Автор
Спасибо за критику. Я планирую сделать небольшую серию по серверлесс ботам, и данный пример идёт как вводная часть.
У Яндекс Клауд функций есть возможность подключения стореджей, до этого планирую дойти в дальнейшем.