Урок 1. Быстрый старт. Эхо-бот
Подготовка к запуску
Перед началом убедитесь, что у вас установлен интерпретатор языка Python версии не ниже 3.6 (актуальные версии посмотреть и скачать можно здесь). Первый и второй уроки будут проведены на версии 3.6.4, версия библиотеки aiogram 1.0.4, проверено на версии 1.1.
Этот пункт можно пропустить, если вы не новичок, и уже всё проверили.
Проверить версию интерпретатора можно следующим образом (справедливо для большинства систем): python --version
. Будет возвращено Python 3.6.4
. Если у вас установлено несколько версий интерпретатора, будет необходимо указать версию: python3 --version
.
Далее устанавливаем библиотеку командой pip install -U aiogram
. Если у вас установлено несколько интерпретаторов (например 2 и 3), то необходимо явно указать версию pip: pip3 install -U aiogram
. Если у вас установлено несколько версий 3 (например 3.4, 3.5, 3.6), то обращаемся к необходимому интерпретатору командой <python interpreter> -m pip ...
, то есть в данном случае python3.6 -m pip install -U aiogram
. Проверить версию библиотеки можно командой pip freeze | grep aiogram
(тут так же не забудьте правильно указать версию pip), вернется aiogram==1.0.4
. Возможно, у вас в Windows не будет работать команда grep
, тогда используйте просто команду pip freeze
и убедитесь в присутствии aiogram в результате выполнения команды.
Начинаем писать код
Давайте для знакомства с библиотекой создадим бота, который будет приветствовать пользователя и высылать в ответ присланный ему текст. Для этого создадим каталог для нашего бота и сохраним там два файла: bot.py
и config.py
.
Открываем последний любимым текстовым редактором и записываем туда токен, полученный от @BotFather:
TOKEN = '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11'
Теперь возьмемся за основной файл - приступаем к редактированию файла bot.py
. Для этого импортируем необходимые модули библиотеки aiogram и токен бота, а так же инициализируем объекты бота и диспетчера:
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from config import TOKEN
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
Команда, с которой начинается общение пользователя с ботом - /start
. Поэтому давайте научим нашего бота реагировать на эту команду. Создаем message_handler и объявляем там функцию ответа:
@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
await message.reply("Привет!\nНапиши мне что-нибудь!")
Ещё в ботах принято создавать обработчик команды /help
- вдруг пользователь заинтересуется возможностями бота.
Вообще, мы могли бы добавить просто help
в массив, передаваемый параметру commands
, чтобы получилось:
@dp.message_handler(commands=['start', 'help'])
Но зачем приветствовать пользователя снова? Поэтому создадим отдельный message_handler для этой команды:
@dp.message_handler(commands=['help'])
async def process_help_command(message: types.Message):
await message.reply("Напиши мне что-нибудь, и я отпрпавлю этот текст тебе в ответ!")
Обращу внимание новичка на то, что называть функции можно как угодно - хоть abc
, хоть qwerty
, однако называя функции понятным языком - process_start_command
, process_help_command
сразу понятно, какая за что отвечает. Главное, чтобы имена не повторялись. Называть как угодно можно также и имя параметра, покажу дальше.
Итак! Осталось сделать обработку текстового сообщения. Для этого пишем следующее:
@dp.message_handler()
async def echo_message(msg: types.Message):
await bot.send_message(msg.from_user.id, msg.text)
Объясняю, что мы только что написали:
Если не указывать тип обрабатываемого сообщения, то библиотека по умолчанию делает обработку только текстовых сообщений - то, что нам и нужно. Поэтому скобки на первой строчке остаются пустыми.
Параметр msg это всё то же сообщение, как и в предыдущих пунктах.
В данном случае на последней строчке мы отправляем пользователю сообщение не ответом, а простым сообщением. Для этого мы воспользовались методом send_message и передали в него два обязательных параметра - айди чата, куда отправляем, и сам текст сообщения. Их мы взяли из объекта msg, который является представителем класса Message. Параметр from_user ссылается на ещё один объект - данный параметр имеет класс User. У него есть параметр id
- уникальный идентификатор для чатов и каналов в телеграме. Ну и текст полученного сообщения мы получили из поля text.
Финальный штрих
Чтобы получать сообщения от серверов Telegram воспользуемся поллингом (polling. to poll - опрашивать) - постоянным опросом сервера на наличие новых обновлений. Для этого дописываем в bot.py
следующее:
if __name__ == '__main__':
executor.start_polling(dp)
Всё! Наш первый бот готов. Полный листинг программы:
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from config import TOKEN
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
await message.reply("Привет!\nНапиши мне что-нибудь!")
@dp.message_handler(commands=['help'])
async def process_help_command(message: types.Message):
await message.reply("Напиши мне что-нибудь, и я отпрпавлю этот текст тебе в ответ!")
@dp.message_handler()
async def echo_message(msg: types.Message):
await bot.send_message(msg.from_user.id, msg.text)
if __name__ == '__main__':
executor.start_polling(dp)
Осталось запустить программу. Для этого в командной строке переходим в директорию проекта и пишем
python bot.py
Теперь можно написать нашему боту: