5 октября

Serverless телеграм бот с использованием Яндекс облака

PythonЯндекс APIМикросервисы
Из песочницы
Всем привет! Меня зовут Павлов Виктор, я являюсь практикантом-преподавателем информатики в одном из колледжей России. Так вот, для студентов мы стараемся внедрить в учебный процесс новейшие технологии и «Serverless» боты являются одним из таких направлений.

Эта статья навеяна популярностью ресурса среди студентов-программистов, но я постараюсь рассказать всё максимально просто для совсем начинающих программистов. В итоге создадим простого Эхо-бота, как заготовку для различных модификаций.

P.S. Также статья навеяна отсутствием туториала на языке Python, на Nodejs есть хороший туториал.

Ссылка на документацию Yandex Cloud Functions
Ссылка на документацию Telegram API.



Шаг 1: Регистрация и вход в платформу Яндекс облако

Примечание
Вы можете активировать пробный период на небольшое время. Его скорее всего хватит на несколько проектов, но Serverless боты для обучения выйдут вам определенно дешевле VPS. На месяц использования хватит закинутой «сотки» на счет после истечения пробного периода.

Шаг 2: Вход в Functions. Здесь нужно в левой панели «Консоли управления» выбрать «Cloud Functions»

image

Шаг 3: Жмем кнопку image. После чего задаем осмысленное имя функции и описание.

Совет
Мы используем названием функций в формате <целевая платформа>-<действие>-<определение>.

Например telegram-study-bot, weather-get-api и т.д.

В описании же можно указать технологии. Например language=python3.7, lib=telebot

Шаг 4: Выбираем вкладку «Редактор»

image

После чего у нас откроется окно управления кодом нашей функции. Здесь мы можем выбрать:

1) «Среду выполнения», в нашем случае это python3.7

По поводу зависимостей
я выбираю preview версию, так как в только ней можно устанавливать различные зависимости (На состояние 02.10.2020 года)

2) «Способы» отвечают за то, как будет передан код в функцию. В данной статье мы будет использовать прямой «Редактор код» в качестве наипростейшего примера.

3) «Точка входа» отвечает на то, какая функция будет принимать запрос и будет является стартом действия нашей функции, укажем её чуть позже.

4) Далее идут «Параметры», предлагаю их оставить как есть.

Если захотите использовать авторизации
В самом последнем пункте можно выставить переменные окружения, например для различных токенов и другой информации, которую не следует показывать другим людям.

Шаг 5: Убеждаемся, что у нас выставлены нужные «Среда выполнения» и «Способ»

image

Затем кликаем на «Создать файл», назовем его 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
    }

Разбираем код
Первой строкой мы импортируем модуль «json», он нам нужен чтобы перевести body запроса из json-строки в python dict.

Функция handler у нас принимает два аргумента, первое это данные запроса, второе данные функции. Про них можно прочитать тут.

Далее в переменную body мы заносим Python словарь преобразовывая его функцией json.loads из body запроса.

Далее, по документации webhook telegram мы возвращаем нужного формата ответ, упаковывая в body, с помощью json.dumps, словарь с нужными нам данными.

ВНИМАНИЕ!!!


В «Точке входа» нужно указать данную функцию как начало работы скрипта. Пишем main.handler. Должно быть так:

image

После чего кликаем «Создать версию» и ждем, пока нас перекинет на вкладку «Обзор».

Шаг 7: Тут нас интересует «Ссылка для вызова» и переключатель «Публичная функция». Жмем переключатель и запоминаем где лежит ссылка для вызова.

image

Шаг 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: Отправим боту «привет» и посмотрим, что в итоге получили.

image

Спасибо за внимание! Если вы дочитали данную статью, то я буду рад различным предложением по улучшению/дополнению/замечаниям данной статьи.
Теги:Pythontelegramyandex cloudfunctionsserverless
Хабы: Python Яндекс API Микросервисы
+6
3,3k 55
Комментарии 11
Похожие публикации
PHP developer (микросервисы)
от 100 000 ₽ВсеИнструменты.руМожно удаленно
Senior PHP developer (микросервисы)
от 130 000 ₽ВсеИнструменты.руМожно удаленно
Back-end разработчик (Laravel, REST API)
от 100 000 до 140 000 ₽GBMSМожно удаленно
Python/Django разработчик
от 1 900 до 2 400 $FloshipМожно удаленно
Python Developer
от 80 000 до 200 000 ₽kt.teamМожно удаленно
Лучшие публикации за сутки