> For the complete documentation index, see [llms.txt](https://mahenzon.gitbook.io/aiogram-lessons/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mahenzon.gitbook.io/aiogram-lessons/chapter1.md).

# Урок 1. Быстрый старт. Эхо-бот

## Подготовка к запуску

Перед началом убедитесь, что у вас установлен интерпретатор языка Python версии не ниже 3.6 (актуальные версии посмотреть и скачать [можно здесь](https://www.python.org/downloads/)). Первый и второй уроки будут проведены на версии 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](http://t.me/BotFather):

```python
TOKEN = '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11'
```

Теперь возьмемся за основной файл - приступаем к редактированию файла `bot.py`. Для этого импортируем необходимые модули библиотеки aiogram и токен бота, а так же инициализируем объекты бота и диспетчера:

```python
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 и объявляем там функцию ответа:

```python
@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
    await message.reply("Привет!\nНапиши мне что-нибудь!")
```

Ещё в ботах принято создавать обработчик команды `/help`- вдруг пользователь заинтересуется возможностями бота.\
Вообще, мы могли бы добавить просто `help` в массив, передаваемый параметру `commands`, чтобы получилось:

```python
@dp.message_handler(commands=['start', 'help'])
```

Но зачем приветствовать пользователя снова? Поэтому создадим отдельный message\_handler для этой команды:

```python
@dp.message_handler(commands=['help'])
async def process_help_command(message: types.Message):
    await message.reply("Напиши мне что-нибудь, и я отпрпавлю этот текст тебе в ответ!")
```

**Обращу внимание новичка** на то, что называть функции можно как угодно - хоть `abc`, хоть `qwerty`, однако называя функции понятным языком - `process_start_command`, `process_help_command` сразу понятно, какая за что отвечает. Главное, чтобы имена не повторялись. Называть как угодно можно также и имя параметра, покажу дальше.

Итак! Осталось сделать обработку текстового сообщения. Для этого пишем следующее:

```python
@dp.message_handler()
async def echo_message(msg: types.Message):
    await bot.send_message(msg.from_user.id, msg.text)
```

Объясняю, что мы только что написали:\
Если не указывать тип обрабатываемого сообщения, то [библиотека по умолчанию делает обработку только текстовых сообщений](https://github.com/aiogram/aiogram/blob/39c935bcd8b4e58a457ab6ebfbb7d82f988feb9c/aiogram/dispatcher/__init__.py#L342) - то, что нам и нужно. Поэтому скобки на первой строчке остаются пустыми.\
Параметр msg это всё то же сообщение, как и в предыдущих пунктах.\
В данном случае на последней строчке мы отправляем пользователю сообщение не ответом, а простым сообщением. Для этого мы воспользовались методом [send\_message](https://github.com/aiogram/aiogram/blob/39c935bcd8b4e58a457ab6ebfbb7d82f988feb9c/aiogram/bot/bot.py#L165) и передали в него [два обязательных параметра](https://core.telegram.org/bots/api#sendmessage) - айди чата, куда отправляем, и сам текст сообщения. Их мы взяли из объекта msg, который является представителем класса [Message](https://github.com/aiogram/aiogram/blob/0144d54e811ffcfe4ef079bad7cbc60a7ec86a40/aiogram/types/message.py#L27). Параметр [from\_user](https://github.com/aiogram/aiogram/blob/0144d54e811ffcfe4ef079bad7cbc60a7ec86a40/aiogram/types/message.py#L34) ссылается на ещё один объект - данный параметр имеет класс [User](https://github.com/aiogram/aiogram/blob/0144d54e811ffcfe4ef079bad7cbc60a7ec86a40/aiogram/types/user.py#L11). У него есть параметр `id` - уникальный идентификатор для чатов и каналов в телеграме. Ну и текст полученного сообщения мы получили из поля [text](https://github.com/aiogram/aiogram/blob/0144d54e811ffcfe4ef079bad7cbc60a7ec86a40/aiogram/types/message.py#L46).

### Финальный **штрих**

Чтобы получать сообщения от серверов Telegram воспользуемся поллингом (polling. to poll - опрашивать) - постоянным опросом сервера на наличие новых [обновлений](https://core.telegram.org/bots/api#getting-updates). Для этого дописываем в `bot.py` следующее:

```python
if __name__ == '__main__':
    executor.start_polling(dp)
```

Всё! Наш первый бот готов. [Полный листинг программы](https://github.com/surik00/aiogram-lessons/blob/master/lesson-01/bot.py):

```python
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)
```

Осталось запустить программу. Для этого в командной строке переходим в директорию проекта и пишем

```bash
python bot.py
```

Теперь можно написать нашему боту:

![](/files/-M5mIEq52FkTEvRv-viV)

## Поздравляю! Вы написали своего первого Telegram бота на языке Python 3 с использованием библиотеки aiogram!
