May 16, 2019

Наш первый ЭХО бот.

Заждались писать код? В этой статье мы напишем простого ЭХО бота.

Совсем недавно мы установили наш редактор, PyCharm.

Его функциональность будет состоять в том, что он просто будет отвечать тем же сообщением, что и отправил пользователь.
  1. Открываем наш PyCharm, создаем новый проект. Для этого жмем на File в правом верхнем углу и New Project, как нибудь называем папку с проектом и нажимаем Create.
  2. Далее жмем правой кнопкой мыши по папке которая находится также в правом верхнем углу New>>Python File и даем ему название bot.py или любое другое ¯\_(ツ)_/¯

Открылось окно где мы можем писать свой код. Ура.

import logging

from aiogram import Bot, Dispatcher, executor, types

# Переменная с токеном
API_TOKEN = 'здесь должен быть ваш токен'

# Конфигурация логов
logging.basicConfig(level=logging.INFO)

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


# Хэндлер для принятия сообщений /start и /help
@dp.message_handler(commands=['start', 'help'])
async def send_welcome(message: types.Message):

    # Была сделана отдельная функция которая сразу отвечает на сообщение пользователя
    await message.reply("Hi!\nI'm EchoBot!\nPowered by aiogram.")


# Хэндлер для принятия остальных сообщений
@dp.message_handler()
async def echo(message: types.Message):

    # Отправляем сообщение обратно
    await bot.send_message(message.chat.id, message.text)


if __name__ == '__main__':
    
    # Начинаем получать сообщения и все события
    executor.start_polling(dp, skip_updates=True)

Поменяйте переменную с токеном и вместо здесь должен быть ваш токен вставьте токен от BotFather. Главное вставляйте между этими символами: '' это важно.

Вставьте этот код в ваш редактор PyCharm нажмите ПКМ и run bot.py(или другое название вашего файла).

Теперь посмотрите, автоматически открылась консоль где вышел юзернейм нашего бота(магия) и сообщение Start polling

Что это значит? Бот теперь получает все события приходящие в телеграм(в нашем случае все сообщения) и отвечает на них согласно нашей задумке(и соответственно коду).

Попробуйте своему роботу(в телеграм) отправить эту волшебную команду - /start а затем отправить любое текстовое сообщение.

На команду /start вам придет сообщение с текстом "Hi! I'm EchoBot! Powered by aiogram" а на второе придет точно такое же сообщение с текстом который вы отправили.

Побаловались, теперь нажмите на вкладку run и остановите ваш скрипт.

Теперь давайте разбираться, что да как и где.

import logging  #1

from aiogram import Bot, Dispatcher, executor, types  #2

# Переменная с токеном
API_TOKEN = 'ваш токен'  #3

#1 - мы импортируем встроенную библиотеку logging для того чтобы вышло сообщение с юзернеймом бота(в нашем случае, только для этого. Товарищи программисты не нужно меня закидывать комментариями с решеткой о том что logging нужен цыуацжуа....)

#2 - Мы импортируем объекты для работы бота, нужно импортировать для каждого раза. Также в будущем мы будем намного больше делать импортов.

#3 - Здесь создали мы переменную с токеном нашего бота. Благодаря этому, вместо того чтобы каждый раз вписывать весь токен, мы можем везде писать только API_TOKEN. Плюсом является то, что если нам понадобится изменить токен в коде, нам нужно будет его поменять только в значении переменной.

Учитывайте это, при написании будущих проектов.

# Конфигурация логов
logging.basicConfig(level=logging.INFO)  # 4

bot = Bot(token=API_TOKEN)  #5
dp = Dispatcher(bot)  #6

#4 - Если вы догадливые, то вы могли понять что эта строчка кода необходима для выведения сообщения о работе нашего бота и его юзернейма.

#5 - Здесь мы создаем основу бота, где указываем что его токен равен нашей переменной.

#6 - Диспетчер. Понадобится для принятия будущих сообщений.

# Хэндлер для принятия сообщений /start и /help
@dp.message_handler(commands=['start', 'help'])
async def send_welcome(message: types.Message):

    # Была сделана отдельная функция которая сразу отвечает на сообщение пользователя
    await message.reply("Hi!\nI'm EchoBot!\nPowered by aiogram.")


# Хэндлер для принятия остальных сообщений
@dp.message_handler()
async def echo(message: types.Message):

    # Отправляем сообщение обратно
    await bot.send_message(message.chat.id, message.text)

Что такое хэндлер? Это обработчик сообщений.

В переменных хэндлера номер 1 мы указываем, что он должен срабатывать только на сообщения которые являются командами пользователя(/start и /help)

Но так как мы создаем ЭХО бота, мы создаем еще один хэндлер который реагирует на все сообщения.

Может возникнуть вопрос, почему же при отправке /start срабатывает хэндлер номер 1 а не хэндлер который принимает все сообщения?

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

А теперь посмотрим что выполняется внутри хэндлеров. В первом случае это функция message.reply

Если вы заглянете выше, то заметите, что сообщение пользователя теперь равно переменной message

В переменной message содержится вся информация о сообщении. Кто отправитель, куда отправили, что отправили, когда отправили, а также значение сообщения и.т.д

И в нашей библиотеке aiogram был создан метод reply, который сразу отвечает на сообщение пользователя с заданным текстом.

Но если посмотреть внутрь хэндлера номер два, то мы видим, что там используется связка bot + send_message При этом текста сообщения, которое бот должен отправить, мы не видим.

Все потому что при использовании метода reply, нам не нужно указывать кому мы должны отправить сообщение. А в методе send_message мы указываем id пользователя который этому боту и написал.

ID - Это индивидуальный идентификатор пользователя. Он есть у всех и каждого и выдается автоматически.

Но вернемся к боту. Помните, я говорил что в переменной message содержится вся информация о сообщениии? А теперь также вспомним, что мы создаем бота который должен отвечать таким же сообщением, что и отправил пользователь. Поэтому в ответе, мы вписываем переменную message.text - в которой содержится текст сообщения присланный пользователем бота.

if __name__ == '__main__':

    # Начинаем получать сообщения и все события
    executor.start_polling(dp, skip_updates=True)

А теперь переходим к финальной стадии и просто пишите это к каждому вашему новому проекту. Мне будет сложно объяснить х)

Пример взят с официального репозитория библиотеки aiogram в котором содержится еще множество других примеров. Можете даже попробовать разобраться в парочке из них.

Фух. Статья окончена. Мы написали первого нашего бота. Надеюсь у вас не возникнет ошибок и ваш бот будет запущен.