Skip to content

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

Регистрация аккаунта

Для того, чтобы создавать ботов - мы будем пользоваться специальной библиотекой aiogram. Установить её можно, вписав в терминал следующую команду:

pip install aiogram
python -m pip install aiogram

Для создания аккаунта бота нужно использовать специального бота в Telegram - @BotFather. Он является главным ботом, порождающим других.

Делается это следующим образом:

  1. В поиске Telegram вбиваем - @BotFather
  2. Выбираем аккаунт с галочкой.
  3. Нажимаем кнопку START
  4. Отправляем ему команду - /newbot
  5. Он предложит ввести его имя. Оно может быть любым.
  6. Затем необходимо будет отправить имя пользователя для бота, которое обязано заканчиваться на bot, например: my_test_bot
  7. Если всё сделано правильно, то бот отправит нам сообщение, содержащее HTTP Token, который является специальным ключем для подключения к нашему боту.

Warning

Токен является ключем доступа к боту. Его нельзя никому передавать, иначе кто-то другой сможет вспользоваться вашим ботом!

bot.py

Переходим к Python. Для создания бота можно использовать любой понравившийся вам редактор. Создадим файл bot.py в котором будет храниться основная логика программы:

Импорт основных объектов

Для начала импортируем классы Bot, Dispatcher и подмодуль types.

  • Bot - основной класс нашего бота, из которого наша программа будет подключаться к серверам Telegram
  • Dispatcher - специальный класс, который будет прослушивать сервера на наличие новых сообщений и вызывать реакции на них.
  • types - подмодуль, в котором содержаться классы различных объектов Telegram, например: Сообщения.
from aiogram import Bot, Dispatcher, types

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

  • CommandStart - фильтрует сообщения так, что проходить будет лишь команда /start.
  • Command - фильтрует сообщения по указанной нами команде.
from aiogram.filters import CommandStart, Command

После нужно импортировать модуль asyncio для запуска асинхронных функций.

import asyncio

И в самом конце импортируем модуль logging, отвечающий за вывод отладочной информации в терминал.

import logging

Тело бота

Для начала создадим константу - API_TOKEN, в которой будем хранить токен нашего бота.

API_TOKEN = "ТУТ ТОКЕН БОТА"

Warning

В открытом виде токен лучше не хранить, необходимо пользоваться либо отдельными файлами, либо переменными окружения, однако для самого простого примера мы пока пренебрежем этим. НО никогда не делайте так в реальных проектах!

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

logging.basicConfig(level=logging.INFO)

Создаем экземпляры классов Bot, в который отправляем токен из константы, а также Dispatcher.

bot = Bot(token=API_TOKEN)
dp = Dispatcher()

Команда /start

Warning

Все функции команд являются ассинхронными, как и большая часть функций в проектах на библиотеке aiogram. Имейте это ввиду.

При помощи диспетчера создаем декоратор, принимающий команду /start, после чего создаем функцию, которая будет реагировать на эту команду. Для начала сделаем так, чтобы в ответ на эту команду, бот отправлял нам сообщение Привет!, используя метод reply у сообщения.

  • message.reply - Пересылает отправленное сообщение и отвечает на него каким-либо текстом.
@dp.message(CommandStart())
async def send_welcome(message: types.Message):
    await message.reply("Привет!")

Своя собственная команда

Чтобы создать свою команду, необходимо вместо класса CommandStart в декораторе указать Command с нужным названием для команды.

@dp.message(Command("test"))
async def send_test(message: types.Message):
    await message.reply("тестовая команда") 

Note

Вы можете также установить команды на русском языке, но Telegram не будет вам их подсказывать.

Получение всех сообщений

И напоследок, дабы получить любое сообщение без команды, нужно всего-лишь оставить список параметров декоратора пустым.

  • message.send_copy - Отправляет копию присланного сообщения в указанный чат с помощью его айди.
@dp.message()
async def echo_handler(message: types.Message):
    await message.send_copy(chat_id=message.chat.id)

Warning

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

Запуск бота

Создадим функцию main, которая будет запускать long-polling у диспетчера, при этом пропуская сообщения, которые пришли, пока бот не работал.

async def main():
    await dp.start_polling(bot, skip_updates=True)

С помощью модуля asyncio запускаем функцию main под защитным условием.

if __name__ == '__main__':
    asyncio.run(main())

Получаем подобный ответ:

INFO:aiogram.dispatcher:Start polling
INFO:aiogram.dispatcher:Run polling for bot @YOUR_BOT_USERNAME id=YOUR_BOT_ID - 'YOUR_BOT_NAME'

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

Возвращаемся в Telegram и видим, что бот начал отвечать на наши команды.

Итог

Таким образом мы реализовали простого бота, способного отвечать на стартовое сообщение, выполняющего созданные нами команды, а также пересылающего наше обычное сообщение.

Полный код бота

from aiogram import Bot, Dispatcher, types
from aiogram.filters import CommandStart, Command
import asyncio
import logging

API_TOKEN = "ТУТ ТОКЕН БОТА"

logging.basicConfig(level=logging.INFO)

bot = Bot(token=API_TOKEN)
dp = Dispatcher()

@dp.message(CommandStart())
async def send_welcome(message: types.Message):
    await message.reply("Привет!")

@dp.message(Command("test"))
async def send_test(message: types.Message):
    await message.reply("тестовая команда")

@dp.message()
async def echo_handler(message: types.Message):
    await message.send_copy(chat_id=message.chat.id)

async def main():
    await dp.start_polling(bot, skip_updates=True)

if __name__ == '__main__':
    asyncio.run(main())