Telegram-бот на Python и aiogram: быстрый старт

Telegram-боты становятся все более популярным инструментом для автоматизации, общения и решения множества задач. Эта статья поможет вам создать простейший Telegram-бот с использованием Python и библиотеки aiogram.

Что такое Telegram-бот?

Telegram-бот — это автоматизированный аккаунт, который может выполнять определенные действия по запросу пользователя: отправлять сообщения, обрабатывать команды, взаимодействовать с API сторонних сервисов и многое другое. Итак, начнем.

Установка необходимых инструментов

Нам понадобится, собственно, Python, а также пакет aiogram. Устанавливаем Python, крайне рекомендую установить и создать виртуальное окружение, и уже внутри него устанавливать все библиотеки:

pip install aiogram

Получение токена у BotFather

BotFather — это официальный бот в Telegram (ссылка для Telegram web), который помогает создавать и управлять вашими Telegram-ботами.

  1. Откройте Telegram и найдите BotFather.
  2. Отправьте команду /newbot.
  3. Следуйте инструкциям: укажите название и уникальное имя пользователя бота.

После регистрации BotFather предоставит токен доступа. Этот токен потребуется для работы с API Telegram. Сохраните его в надежном месте.

Создание простейшего бота

Базовый скелет

Создайте файл my_credentials.py в папке проекта и добавьте следующий код:

API_TOKEN = "ВАШ_ТОКЕН"

Создайте файл bot.py в папке проекта и добавьте следующий код:

import asyncio
import logging
import sys

from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.filters import CommandStart
from aiogram.types import Message

from my_credentials import API_TOKEN


dp = Dispatcher()


async def main() -> None:
    bot = Bot(token=API_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
    await dp.start_polling(bot)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    asyncio.run(main())

Почему мы добавили дополнительный файл с единственной целью - объявить token?

Потому что так проще управлять секретными переменными. Например, теперь можно (если вы используете git) добавить файл в .gitignore; или просто, если Вы будете делиться кодом бота, можете просто не добавлять этот файл в архив, вместо того, чтобы удалять переменные из главного файла.

Первая команда бота

Добавим обработчик команды /start (это самая первая команда, которую отправляет каждый пользователь при первом запуске бота):

@dp.message(CommandStart())
async def send_welcome(message: Message) -> None:
    await message.reply("Привет! Я ваш первый Telegram-бот.")

Декоратор dp.message заставляет функцию выполняться при получении ботом сообщения от пользователя.

Аргумент CommandStart() указывает на то, что эта функция будет вызываться только при получении ботом (от любого пользователя) команды start (то есть пользователь вводит /start, а конкретно эта команда также отправляется автоматически по кнопке Start bot в Telegram).

Реализация эхо-бота

Реализуем обработку всех текстовых сообщений:

@dp.message()
async def echo(message: Message) -> None:
    await message.answer(message.text)

dp.message без аргументов заставляет функцию выполняться при получении ботом любого сообщения от пользователя.

Очередность поиска идет сверху вниз, поэтому этот обработчик не вызовется при вводе команды /start.

Полный код будет выглядеть так:

import asyncio
import logging
import sys

from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.filters import CommandStart
from aiogram.types import Message

from my_credentials import API_TOKEN


dp = Dispatcher()


@dp.message(CommandStart())
async def send_welcome(message: Message) -> None:
    await message.reply("Привет! Я ваш первый Telegram-бот.")


@dp.message()
async def echo(message: Message) -> None:
    await message.answer(message.text)


async def main() -> None:
    bot = Bot(token=API_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML))
    await dp.start_polling(bot)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO, stream=sys.stdout)
    asyncio.run(main())

Запуск и тестирование бота

  1. Откройте командную строку в директории проекта
  2. (Если создавали окружение) Активируйте виртуальное окружение
  3. Запустите бота: python bot.py

Найдите своего бота в Telegram и введите команду /start.

В веб-версии можно найти своего бота по ссылке https://t.me/НИКНЕЙМ_БОТА_ПРИ_СОЗДАНИИ

Убедитесь, что бот отвечает приветственным сообщением. Затем отправьте любое сообщение и проверьте, что бот повторяет его.

Далее

Теперь у вас есть работающий Telegram-бот, который обрабатывает команды и эхо-сообщения. Это основа, с которой можно развивать более сложные функции, например обработка пользовательских данных, интеграция с API и создание интерактивных меню.

В дальнейших статьях мы добавим боту полезный функционал.