Запускаемся
- Глава
- 1 / 12
- Время
- 2 мин
- Код
- 4
Ура, ты решил перейти на telegrinder. Возможно, потому что хочешь что-то новое и прикольное. Или, может быть, это твой первый опыт с ботами. Этот туториал подойдет для обоих случаев. Начнем с инициализации основной сущности - самого бота.
Для начала нужно создать токен через BotFather и импортировать несколько классов из модуля:
from telegrinder import Telegrinder, API, Token
api = API(Token("your-token-here"))
bot = Telegrinder(api)Здесь мы создаем три сущности:
Твой токен, который в telegrinder — это не просто строка, а экземпляр Token. Это нужно для строгой типизации и соображений безопасности. Еще у Token есть некоторые методы, которые могут понадобиться позже.
Далее API — это экземпляр для обращения к Telegram API. Позже в туториале мы разберем, как с ним работать.
И наконец, основная сущность — Telegrinder, который собирает все компоненты, чтобы запускать бота.
Теперь, когда мы создали основную сущность, нужно описать в ней логику. Боты пишутся на основе событий. Мы получаем событие от Telegram, например: "Георгий прислал сообщение с текстом 'privetik'" или "Арсений прислал стикер". В telegrinder мы декларируем хендлеры для каждого типа события, которое нам надо обработать. Для объявления хендлеров удобно использовать декораторы — так проще привязать функцию к событию.
Допустим, мы хотим обрабатывать любое сообщение и отправлять его обратно. Добавим хендлер в код:
# Добавим импорт
from telegrinder import Message
@bot.on.message()
async def message_handler(message: Message):
if message.text:
await message.answer(message.text.unwrap())В конце файла обязательно нужно добавить эту строку:
bot.run_forever()Она запустит бота в асинхронном режиме, и будет получать и обрабатывать обновления в цикле.
Разберем код. Мы создали новый хендлер, который реализует логику. Строка @bot.on.message() понятна — мы говорим, что этот хендлер будет вызываться при каждом получении сообщения.
Когда приходит сообщение, функция получает его как расширенный объект события (так называемый CuteType в telegrinder).
Если используешь приемлемую IDE вроде VS Code с Pylance, будут подсказки по содержимому всех типов данных, так как telegrinder полностью типизирован.
Мы использовали метод answer, который уже встроен в CuteType Message. Он вызывает метод send_message в Telegram с уже указанным chat_id.
Перед отправкой сообщения мы проверяем, что в нем есть текст, ведь сообщение может быть пустым - например просто фото или стикер. В telegrinder используются функциональные типы, чтобы мы всегда контролировали что у нас в объектах: поэтому мы вызываем .unwrap(). Мы детальнее разберем это позже.
Для примера, немного доработаем код — если текста нет, будем отправлять "Нет текста" вместо того, чтобы ничего не отвечать.
@bot.on.message()
async def message_handler(message: Message):
await message.answer(message.text.unwrap_or("Нет текста"))Вот так это работает.
Если ты не забыл добавить bot.run_forever() в конце, то все должно работать: можно получать эхо-ответы на сообщения.
В следующей части туториала разберем правила — важную вещь, чтобы добавить разнообразие в хендлеры. Каждый хендлер будет выполнять свое, а для того чтобы распределнить события, необходима фильтрация.