Создание простого бота
Регистрация аккаунта
Для того, чтобы создавать ботов - мы будем пользоваться специальной библиотекой aiogram. Установить её можно, вписав в терминал следующую команду:
pip install aiogram
python -m pip install aiogram
Для создания аккаунта бота нужно использовать специального бота в Telegram - @BotFather. Он является главным ботом, порождающим других.
Делается это следующим образом:
- В поиске Telegram вбиваем - @BotFather
- Выбираем аккаунт с галочкой.
- Нажимаем кнопку START
- Отправляем ему команду -
/newbot - Он предложит ввести его имя. Оно может быть любым.
- Затем необходимо будет отправить имя пользователя для бота, которое обязано заканчиваться на bot, например:
my_test_bot - Если всё сделано правильно, то бот отправит нам сообщение, содержащее HTTP Token, который является специальным ключем для подключения к нашему боту.
Warning
Токен является ключем доступа к боту. Его нельзя никому передавать, иначе кто-то другой сможет вспользоваться вашим ботом!
bot.py
Переходим к Python. Для создания бота можно использовать любой понравившийся вам редактор. Создадим файл bot.py в котором будет храниться основная логика программы:
Импорт основных объектов
Для начала импортируем классы Bot, Dispatcher и подмодуль types.
Bot- основной класс нашего бота, из которого наша программа будет подключаться к серверам TelegramDispatcher- специальный класс, который будет прослушивать сервера на наличие новых сообщений и вызывать реакции на них.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())