Permalink
Cannot retrieve contributors at this time
Installation Guide
Using PIP
Using Pipenv
Using Pacman
aiogram is also available in Arch Linux Repository, so you can install this framework on any Arch-based distribution like Arch Linux, Antergos, Manjaro, etc. To do this, just use pacman to install the python-aiogram package:
$ pacman -S python-aiogram
From sources
Development versions:
$ git clone https://github.com/aiogram/aiogram.git $ cd aiogram $ python setup.py install
Or if you want to install stable version (The same with version from PyPi):
$ git clone https://github.com/aiogram/aiogram.git $ cd aiogram $ git checkout master $ python setup.py install
Recommendations
You can speedup your bots by following next instructions:
-
Use uvloop instead of default asyncio loop.
uvloop is a fast, drop-in replacement of the built-in asyncio event loop. uvloop is implemented in Cython and uses libuv under the hood.
Installation:
-
Use ujson instead of the default json module.
UltraJSON is an ultra fast JSON encoder and decoder written in pure C with bindings for Python 2.5+ and 3.
Installation:
-
Use aiohttp speedups
-
Use cchardet instead of the chardet module.
cChardet is a high speed universal character encoding detector.
Installation:
-
Use aiodns for speeding up DNS resolving.
aiodns provides a simple way for doing asynchronous DNS resolutions.
Installation:
-
Installing speedups altogether.
The following will get you
aiohttp
along withcchardet
,aiodns
andbrotlipy
in one bundle.Installation:
$ pip install aiohttp[speedups]
-
In addition, you don’t need do anything, aiogram automatically starts using that if it is found in your environment.
О совместимости версий
Код в главах сейчас использует aiogram 3.0 beta3. Возможна несовместимость с другими версиями.
Некоторые детали сознательно упрощены!
Автор этой книги убеждён, что помимо теории должна быть и практика. Чтобы максимально упростить повторение
приведённого далее кода, пришлось пойти на использование подходов, пригодных только для локальной разработки
и обучения.
Так, например, во всех или почти во всех главах токен бота будет указываться прямо в исходных текстах.
Это плохой подход, поскольку может привести к раскрытию токена, если вы забудете его удалить перед заливкой
кода в публичный репозиторий (например, GitHub).
Или иногда в качестве хранилищ данных будут использоваться структуры, расположенные исключительно в
оперативной памяти (словари, списки…). В действительности такие объекты нежелательны, поскольку остановка
бота приведёт безвозвратной потере данных.
Также механизмом получения апдейтов от Telegram выбран поллинг, поскольку он гарантированно работает
в подавляющем большинстве окружений и подходит практически всем разработчикам.
Важно помнить, что автор ставит перед собой цель объяснить именно работу с Telegram Bot API при помощи
aiogram, а не вообще весь Computer Science во всём его многообразии.
Терминология¶
Чтобы разговаривать в одних и тех же понятиях, введём некоторые термины, дабы в дальнейшем не путаться:
- ЛС — личные сообщения, в контексте бота это диалог один-на-один с пользователем, а не группа/канал.
- Чат — общее название для ЛС, групп, супергрупп и каналов.
- Апдейт — любое событие из этого списка:
сообщение, редактирование сообщения, колбэк, инлайн-запрос, платёж, добавление бота в группу и т.д. - Хэндлер — асинхронная функция, которая получает от диспетчера/роутера очередной апдейт
и обрабатывает его. - Диспетчер — объект, занимающийся получением апдейтов от Telegram с последующим выбором хэндлера
для обработки принятого апдейта. - Роутер — аналогично диспетчеру, но отвечает за подмножество множества хэндлеров.
Можно сказать, что диспетчер — это корневой роутер. - Фильтр — выражение, которое обычно возвращает True или False и влияет на то, будет вызван хэндлер или нет.
- Мидлварь — прослойка, которая вклинивается в обработку апдейтов.
Установка¶
Для начала давайте создадим каталог для бота, организуем там virtual environment (далее venv) и
установим библиотеку aiogram.
Проверим, что установлен Python версии 3.9 (если вы знаете, что установлен 3.9 и выше, можете пропустить этот раздел):
[groosha@main lesson_01]$ python3.9
Python 3.9.9 (main, Jan 11 2022, 16:35:07)
[GCC 11.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
[groosha@main lesson_01]$
Теперь создадим файл requirements.txt
, в котором укажем используемую нами версию aiogram. Также нам понадобится
библиотека python-dotenv для файлов конфигурации.
О версиях aiogram
В этой главе используется aiogram 3.x, перед началом работы рекомендую заглянуть в
канал релизов библиотеки и проверить наличие более новой версии. Подойдёт любая
более новая, начинающаяся с цифры 3, поскольку aiogram 2.x более рассматриваться не будет и считается устаревшим.
[groosha@main 01_quickstart]$ python3.9 -m venv venv
[groosha@main 01_quickstart]$ echo "aiogram==3.0.0b3" > requirements.txt
[groosha@main 01_quickstart]$ echo "python-dotenv==0.20.0" >> requirements.txt
[groosha@main 01_quickstart]$ source venv/bin/activate
(venv) [groosha@main 01_quickstart]$ pip install -r requirements.txt
# ...здесь куча строк про установку...
Successfully installed ...тут длинный список...
[groosha@main 01_quickstart]$
Обратите внимание на префикс «venv» в терминале. Он указывает, что мы находимся в виртуальном окружении с именем «venv».
Проверим, что внутри venv вызов команды python
указывает на всё тот же Python 3.9:
(venv) [groosha@main 01_quickstart]$ python
Python 3.9.9 (main, Jan 11 2022, 16:35:07)
[GCC 11.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
(venv) [groosha@main 01_quickstart]$ deactivate
[groosha@main 01_quickstart]$
Последней командой deactivate
мы вышли из venv, чтобы он нам не мешал.
Первый бот¶
Давайте создадим файл bot.py
с базовым шаблоном бота на aiogram:
bot.py
import asyncio
import logging
from aiogram import Bot, Dispatcher, types
# Включаем логирование, чтобы не пропустить важные сообщения
logging.basicConfig(level=logging.INFO)
# Объект бота
bot = Bot(token="12345678:AaBbCcDdEeFfGgHh")
# Диспетчер
dp = Dispatcher()
# Хэндлер на команду /start
@dp.message(commands=["start"])
async def cmd_start(message: types.Message):
await message.answer("Hello!")
# Запуск процесса поллинга новых апдейтов
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Первое, на что нужно обратить внимание: aiogram — асинхронная библиотека, поэтому ваши хэндлеры тоже должны быть асинхронными,
а перед вызовами методов API нужно ставить ключевое слово await, т.к. эти вызовы возвращают корутины.
Асинхронное программирование в Python
Не стоит пренебрегать официальной документацией!
Прекрасный туториал по asyncio доступен на сайте Python.
Если вы в прошлом работали с какой-то другой библиотекой для Telegram, например, pyTelegramBotAPI, то концепция
хэндлеров (обработчиков событий) вам сразу станет понятна, разница лишь в том, что в aiogram хэндлерами управляет диспетчер.
Диспетчер регистрирует функции-обработчики, дополнительно ограничивая перечень вызывающих их событий через фильтры.
После получения очередного апдейта (события от Telegram), диспетчер выберет нужную функцию обработки, подходящую по всем
фильтрам, например, «обработка сообщений, являющихся изображениями, в чате с ID икс и с длиной подписи игрек». Если две
функции имеют одинаковые по логике фильтры, то будет вызвана та, что зарегистрирована раньше.
Чтобы зарегистрировать функцию как обработчик сообщений, нужно сделать одно из двух действий:
1. Навесить на неё декоратор, как в примере выше.
С различными типами декораторов мы познакомимся позднее.
2. Напрямую вызвать метод регистрации у диспетчера или роутера.
Рассмотрим следующий код:
# Хэндлер на команду /test1
@dp.message(commands=["test1"])
async def cmd_test1(message: types.Message):
await message.reply("Test 1")
# Хэндлер на команду /test2
async def cmd_test2(message: types.Message):
await message.reply("Test 2")
Давайте запустим с ним бота:
Хэндлер cmd_test2
не сработает, т.к. диспетчер о нём не знает. Исправим эту ошибку
и отдельно зарегистрируем функцию:
# Хэндлер на команду /test2
async def cmd_test2(message: types.Message):
await message.reply("Test 2")
# Где-то в другом месте, например, в функции main():
dp.message.register(cmd_test2, commands=["test2"])
Снова запустим бота:
Синтаксический сахар¶
Для того чтобы сделать код чище и читабельнее, aiogram расширяет возможности стандартных объектов Telegram.
Например, вместо bot.send_message(...)
можно написать message.answer(...)
или message.reply(...)
. В последних
двух случаях не нужно подставлять chat_id
, подразумевается, что он такой же, как и в исходном сообщении.
Разница между answer
и reply
простая: первый метод просто отправляет сообщение в тот же чат, второй делает «ответ» на
сообщение из message
:
@dp.message(commands=["answer"])
async def cmd_answer(message: types.Message):
await message.answer("Это простой ответ")
@dp.message(commands=["reply"])
async def cmd_reply(message: types.Message):
await message.reply('Это ответ с "ответом"')
Более того, для большинства типов сообщений есть вспомогательные методы вида
«answer_{type}» или «reply_{type}», например:
@dp.message(commands=["dice"])
async def cmd_dice(message: types.Message):
await message.answer_dice(emoji="🎲")
что значит ‘message: types.Message’ ?
Python является интерпретируемым языком с сильной, но динамической типизацией,
поэтому встроенная проверка типов, как, например, в C++ или Java, отсутствует. Однако начиная с версии 3.5
в языке появилась поддержка подсказок типов, благодаря которой
различные чекеры и IDE вроде PyCharm анализируют типы используемых значений и подсказывают
программисту, если он передаёт что-то не то. В данном случае подсказка types.Message
соообщает
PyCharm-у, что переменная message
имеет тип Message
, описанный в модуле types
библиотеки
aiogram (см. импорты в начале кода). Благодаря этому IDE может на лету подсказывать атрибуты и функции.
При вызове команды /dice
бот отправит в тот же чат игральный кубик. Разумеется, если его надо отправить в какой-то
другой чат, то придётся по-старинке вызывать await bot.send_dice(...)
. Но объект bot
(экземпляр класса Bot) может быть
недоступен в области видимости конкретной функции. В aiogram 3.x объект бота, которому пришёл апдейт, неявно
прокидывается в хэндлер и его можно достать как аргумент bot
. Предположим, вы хотите по команде /dice
отправлять кубик не в тот же чат, а в канал с ID -100123456789. Перепишем предыдущую функцию:
@dp.message(commands=["dice"])
async def cmd_dice(message: types.Message, bot: Bot):
await bot.send_dice(-100123456789, emoji="🎲")
Иногда при запуске бота может потребоваться передать одно или несколько дополнительных значений. Это может быть
объект конфигурации, список администраторов группы, отметка времени и что угодно ещё. Для этого достаточно передать
параметры как дополнительные именованные (!) аргументы функции start_polling(...)
(для вебхуков есть аналогичный
способ). В хэндлерах для получения этих значений достаточно указать их как те же аргументы. Более того, изменение таких
объектов в одних хэндлерах влияют на их содержимое в других. Рассмотрим на примере:
@dp.message(commands=["add_to_list"])
async def cmd_add_to_list(message: types.Message, mylist: list[int]):
mylist.append(7)
await message.answer("Добавлено число 7")
@dp.message(commands=["show_list"])
async def cmd_show_list(message: types.Message, mylist: list[int]):
await message.answer(f"Ваш список: {mylist}")
Теперь список mylist
можно читать и писать в разных хэндлерах. Существует также ещё один вариант, более подходящий
в других ситуациях. Речь, конечно же, о мидлварях, про которые подробно рассказывается
в соответствующей главе.
Файлы конфигурации¶
Чтобы не хранить токен прямо в коде (вдруг вы захотите залить своего бота в публичный репозиторий?) можно вынести
подобные данные в отдельный конфигурационный файл. Существует хорошее и адекватное мнение,
что для прода достаточно переменных окружения, однако в рамках этой книги мы будем пользоваться отдельными файлами .env
,
чтобы немного упростить себе жизнь и сэкономить читателям время на разворачивание демонстрационного проекта.
Итак, создадим рядом с bot.py
отдельный файл config_reader.py
со следующим содержимым
config_reader.py
from pydantic import BaseSettings, SecretStr
class Settings(BaseSettings):
# Желательно вместо str использовать SecretStr
# для конфиденциальных данных, например, токена бота
bot_token: SecretStr
# Вложенный класс с дополнительными указаниями для настроек
class Config:
# Имя файла, откуда будут прочитаны данные
# (относительно текущей рабочей директории)
env_file = '.env'
# Кодировка читаемого файла
env_file_encoding = 'utf-8'
# При импорте файла сразу создастся
# и провалидируется объект конфига,
# который можно далее импортировать из разных мест
config = Settings()
Теперь немного отредактируем наш bot.py
:
bot.py
# импорты
from config_reader import config
# Для записей с типом Secret* необходимо
# вызывать метод get_secret_value(),
# чтобы получить настоящее содержимое вместо '*******'
bot = Bot(token=config.bot_token.get_secret_value())
Наконец, создадим файл .env
(с точкой в начале), где опишем токен бота:
.env
BOT_TOKEN = 0000000000:AaBbCcDdEeFfGgHhIiJjKkLlMmNn
Если всё сделано правильно, то при запуске python-dotenv подгрузит переменные из файла .env
, pydantic
их провалидирует и объект бота успешно создастся с нужным токеном.
На этом мы закончим знакомство с библиотекой, а в следующих главах рассмотрим другие «фишки» aiogram и Telegram Bot API.
#Руководства
- 14 сен 2022
-
0
Разбираемся, как написать чат-бота с помощью библиотеки aiogram. Весь код — внутри статьи.
Иллюстрация: Polina Vari для Skillbox Media
Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.
Компании используют чат-ботов в Telegram для разных задач: рассылают новости о новых акциях, принимают платежи или даже организуют службу технической поддержки. Обычные пользователи тоже используют их для своих бытовых нужд — ведут учёт личных финансов или оформляют посты в социальных сетях.
В этой статье мы научимся с нуля создавать чат-ботов с помощью Python: выберем лучшую библиотеку и напишем на ней эхо-бота, который отвечает на сообщения пользователя точно такими же сообщениями. Это первая часть урока по чат-ботам в Telegram — во второй части мы добавим новые фичи.
Для создания Telegram-ботов на Python существует несколько десятков библиотек. Они различаются популярностью, размером комьюнити и функциональностью. Рассмотрим самые популярные.
aiogram
Современная библиотека, набирающая популярность. Работает с асинхронным подходом к выполнению кода. Это позволяет не останавливать работу бота в ожидании ответа пользователя. У aiogram подробная документация и большое русскоязычное комьюнити. В этой и последующих статьях цикла мы будем работать как раз с этой библиотекой.
python-telegram-bot
Одна из первых библиотек для создания ботов. Отличается от aiogram синхронным подходом к работе, то есть при ожидании ответа от пользователя выполнение кода останавливается.
TeleBot
Библиотека для создания простых ботов, позволяющая работать с асинхронным и синхронным подходом на выбор. Подходит для небольших проектов. Подробнее можно узнать в документации.
Переходим к созданию Telegram-бота. Потренируемся на простом примере — создадим эхо-бота, который отвечает на сообщения пользователя его же словами.
Для этого нам необходимо:
- установить Python и настроить виртуальное окружение;
- зарегистрировать бота в специальном Telegram-канале @BotFather;
- установить библиотеку aiogram;
- написать код эхо-бота, связав его по API с Telegram.
На macOS или Linux. Python установлен в эти операционные системы изначально. Чтобы проверить его наличие, откройте терминал и введите команду:
python --version
Если Python установлен, то терминал покажет его версию:
На Windows требуется установка Python. Сделать это проще всего по нашей инструкции.
После установки и проверки Python требуется установить виртуальное окружение с помощью virtualenv. Это специальный инструмент, который позволяет изолировать друг от друга проекты в разработке, независимо устанавливая для них библиотеки и пакеты. Удобно, когда вы работаете над разными приложениями одновременно.
virtualenv устанавливается через терминал:
sudo pip3 install virtualenv
После этого необходимо создать директорию для проекта, внутри которой будет работать виртуальное окружение:
mkdir telegram_bot
cd telegram_bot
Команда mkdir создаст папку telegram_bot, а команда cd переведёт нас в неё. Теперь в этой директории будут храниться файлы проекта, связанные с нашим ботом.
Развернём виртуальное окружение внутри папки telegram_bot:
virtualenv venv -p python3
Теперь его активируем. Если этого не сделать, то оно не будет работать.
source venv/bin/activate
Виртуальное окружение запущено, и мы готовы перейти к следующему шагу.
Для создания бота необходимо воспользоваться Telegram и ботом @BotFather. Откройте мессенджер и введите название бота в поисковой строке:
Открываем его, жмём кнопку «Запустить» и вводим команду /newbot:
Теперь напишем название и юзернейм для нашего бота. Назовём его echo_skillbox_bot (теперь это имя занято, так что вам надо будет придумать своё). В ответ придёт наш токен, который мы будем использовать для подключения к API Telegram.
Этот токен мы сохраняем — он потребуется нам в будущем.
Для установки aiogram воспользуемся менеджером пакетов pip. Вводим в терминал:
pip install aiogram
Важно! Библиотека устанавливается в созданное ранее виртуальное окружение, связанное с папкой telegram_bot. Если вы решите создать нового бота в другой директории на компьютере, то установку будет необходимо провести заново, иначе aiogram не будет работать.
Писать код на Python лучше всего в IDE, а не в окне терминала. В проекте ниже мы будем использовать бесплатный редактор Visual Studio Code, но вы можете воспользоваться любым удобным для вас инструментом.
Откроем IDE и создадим файл main.py. Для этого проекта нам потребуется только он. Импортируем из aiogram нужные классы и модуль:
from aiogram import Bot, Dispatcher, executor, types
Разберёмся, что каждый из них делает. Начнём с классов:
- Bot определяет, на какие команды от пользователя и каким способом отвечать;
- Dispatcher позволяет отслеживать обновления;
- Executor запускает бота и выполняет функции, которые следует выполнить.
Модуль types позволит нам использовать базовые классы для аннотирования, то есть восприятия сообщений. Например, мы будем использовать types.Message, позволяющий работать с приёмом текстовых сообщений пользователя. Подробно об этом можно прочесть в документации.
Импортируем наш токен, который поможет коммуницировать с API Telegram:
API_TOKEN = '5602787567:AAGYv7NrSjwyW7qPs_yvu70C060zrcfZDbQ' #В одинарных кавычках размещаем токен, полученный от @BotFather.
Теперь необходимо инициализировать объекты bot и Dispatcher, передав первому наш токен. Если их не инициализировать, то код не будет работать.
bot = Bot(token=API_TOKEN) dp = Dispatcher(bot)
Настроим приветственное окно для нового пользователя, которое будет появляться при нажатии команды /start. Для этого создаём message_handler и прописываем функцию ответа:
@dp.message_handler(commands=['start']) #Явно указываем в декораторе, на какую команду реагируем. async def send_welcome(message: types.Message): await message.reply("Привет!nЯ Эхо-бот от Skillbox!nОтправь мне любое сообщение, а я тебе обязательно отвечу.") #Так как код работает асинхронно, то обязательно пишем await.
Теперь при нажатии на кнопку Начать или при вводе команды /start пользователь будет получать от бота приветственное сообщение.
Разберёмся в коде:
- message_handler — это декоратор, который реагирует на входящие сообщения и содержит в себе функцию ответа. Декоратор — это «обёртка» вокруг функций, позволяющая влиять на их работу без изменения кода самих функций. В нашем случае мы управляем функцией, считая команды пользователя;
- commands=[‘start’] — это команда, которая связана с декоратором и запускает вложенную в него функцию;
- async def send_welcome — создаёт асинхронную функцию, которая принимает в себя сообщение пользователя message, определяемое через тип Message. Саму функцию можно назвать любым образом. Мы выбрали send_welcome, чтобы название было понятным и осмысленным;
- await message.reply — определяет ответ пользователя, используя await из-за асинхронности работы библиотеки.
Теперь создадим событие, которое будет обрабатывать введённое пользователем сообщение:
@dp.message_handler() #Создаём новое событие, которое запускается в ответ на любой текст, введённый пользователем. async def echo(message: types.Message): #Создаём функцию с простой задачей — отправить обратно тот же текст, что ввёл пользователь. await message.answer(message.text)
Так как бот должен реагировать на любое текстовое сообщение от пользователя, то скобки в @dp.message_handler мы оставляем пустыми. Параметр message не отличается от использованного в предыдущих шагах.
Для ответа мы также используем метод message, указывая, что возвращаем исходный текст, принятый в message.
Остаётся последний этап — настроить получение сообщений от сервера в Telegram. Если этого не сделать, то мы не получим ответы бота. Реализовать получение новых сообщений можно с помощью поллинга. Он работает очень просто — метод start_polling опрашивает сервер, проверяя на нём обновления. Если они есть, то они приходят в Telegram. Для включения поллинга необходимо добавить две строчки:
if __name__ == '__main__': executor.start_polling(dp, skip_updates=True)
Всё, теперь код нашего бота полностью готов:
from aiogram import Bot, Dispatcher, executor, types API_TOKEN = '5602787567:AAGYv7NrSjwyW7qPs_yvu70C060zrcfZDbQ' bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) @dp.message_handler(commands=['start']) async def send_welcome(message: types.Message): await message.reply("Привет!nЯ Эхо-бот от Skillbox!nОтправь мне любое сообщение, а я тебе обязательно отвечу.") @dp.message_handler() async def echo(message: types.Message): await message.answer(message.text) if __name__ == '__main__': executor.start_polling(dp, skip_updates=True)
Сохраняем его в нашей папке telegram_bot под именем main.py.
Для запуска бота нам необходим терминал. Открываем его и переходим в нашу папку telegram_bot. После этого вводим команду:
python3 main.py
В ответ терминал пришлёт сообщение, что обновления успешно пропущены:
Находим нашего бота в Telegram по имени @echo_skillbox_bot и запускаем его, нажав на кнопку Начать. В ответ на это или на команду /start нам придёт приветственное сообщение:
Попробуем написать что-то:
Как мы видим — всё работает. Бот возвращает нам наши сообщения.
Расширять функциональность бота, указывая для разных команд пользователя разные ответы. Например, добавить раздел помощи, который будет появляться по команде /help. Или настроить запуск кода на виртуальном сервере, чтобы бот работал независимо от вашего компьютера.
В следующей части статьи мы добавим к нашему боту кнопки и новые возможности.
Учись бесплатно:
вебинары по программированию, маркетингу и дизайну.
Участвовать
Школа дронов для всех
Учим программировать беспилотники и управлять ими.
Узнать больше
Напишем простой диалоговый Telegram-бот на Python, который в дальнейшем можно дополнить различными функциями, и задеплоим его.
Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.
- Настройка
- Hello, bot!
- Docker
- Деплой на AWS
- Заключение
Настройка
Откройте Telegram, найдите @BotFather и начните беседу. Отправьте команду /newbot
и следуйте инструкциям. Вы получите:
- свой токен;
- адрес Telegram API (https://api.telegram.org/bot);
- ссылку на документацию.
Обязательно сохраните токен, так как это ключ для взаимодействия с ботом.
Примечание Хранение токена должно быть локальным: ни в коем случае не выгружайте его в общий доступ, например в GitHub-репозиторий .
Далее начните беседу. Введите в поисковой строке имя бота и нажмите /start
. Отправьте любое сообщение: оно станет первым обновлением, которое получит Телеграм бот.
Установка Python
Для написания Telegram-бота на Python, нужно установить сам язык. Если вы пользуетесь Windows, скачать Python можно с официального сайта. Версия важна. Нам подойдет Python не ниже версии 3.7. Если же у вас Linux или macOS, то, скорее всего, у вас стоит Python 3.6. Как обновиться, можете почитать здесь.
Тем, кто только начал изучение этого языка, будет также полезна дорожная карта Python-разработчика.
Установка pip
Это менеджер пакетов. В версиях выше Python 2.7.9 и Python 3.4, а также на macOS/Linux он уже есть. Проверить это можно командой pip --version
в терминале. Если же по каким-то причинам он отсутствует, установить его можно при помощи команды:
$ sudo apt-get install python-pip
Установка aiogram
Установить данный фреймворк для Telegram Bot API с помощью pip:
pip install aiogram
Hello, bot!
Давайте напишем простенькую программу приветствия. Для начала следует импортировать библиотеки и создать экземпляры Телеграм бота и диспетчера:
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
TOKEN = "ваш токен от бота здесь"
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
Теперь напишем обработчик текстовых сообщений, который будет обрабатывать входящие команды /start
и /help
:
@dp.message_handler(commands=['start', 'help'])
async def send_welcome(msg: types.Message):
await msg.reply_to_message(f‘Я бот. Приятно познакомиться,
{msg.from_user.first_name}’)
Добавим ещё один обработчик для получения текстовых сообщений. Если бот получит «Привет», он также поздоровается. Все остальные сообщения будут определены, как нераспознанные:
@dp.message_handler(content_types=['text'])
async def get_text_messages(msg: types.Message):
if msg.text.lower() == 'привет':
await msg.answer('Привет!')
else:
await msg.answer('Не понимаю, что это значит.')
Запускаем Telegram бота, написанного на Python, следующим образом:
if __name__ == '__main__':
executor.start_polling(dp)
Примечание Так мы задаём боту непрерывное отслеживание новых сообщений. Если бот упадёт, а сообщения продолжат поступать, они будут накапливаться в течение 24 часов на серверах Telegram, и в случае восстановления бота прилетят ему все сразу.
Ну вот и всё, простенький бот в Телеграмме на языке Python готов.
Docker
Сейчас мало кто не слышал про Docker, но если вдруг не слышали — вот хорошая статья. Для нашего проекта потребуется самый простой Dockerfile:
FROM python:3.8
# set work directory
WORKDIR /usr/src/app/
# copy project
COPY . /usr/src/app/
# install dependencies
RUN pip install --user aiogram
# run app
CMD ["python", "bot.py"]
Каталог проекта должны при этом содержать следующие файлы:
- bot.py;
- Dockerfile.
Для локальных тестов достаточно установить Docker (linux, mac, windows), после чего в папке проекта собрать и запустить контейнер с помощью команд:
docker build -t my_app
docker run -d my_app
my_app
— это просто название нашего контейнера, вместо которого можно использовать другое имя.
-d
— специальный флаг, который запускает контейнер в фоне и позволяет дальше работать в терминале. Это называется detached mode.
Деплой на AWS
Прежде всего нам понадобится аккаунт на Docker Hub. Это аналог GitHub, только не с исходниками кода, а с уже созданными контейнерами. Работа с Docker Hub выглядит достаточно просто:
- Локально или с помощью пайплайнов собрали контейнер.
- Загрузили его на докер хаб.
- В любом удобном месте скачали его. Это может быть локальная машина, VPS сервер или облачный провайдер по типу AWS.
- Запустили.
Пройдёмся по этим шагам. Везде, где указано <docker_hub_username>
, надо вставлять свой юзернейм, использованный при регистрации на докерхабе. Если это ваша первая публикация на докерхаб, для начала потребуется залогиниться с помощью docker login.
Билдим контейнер:
docker build -t <docker_hub_username>/my_app
Загружаем его на докерхаб:
docker push <docker_hub_username>/my_app
Для проверки успешности загрузки можете запустить контейнер из Docker Hub с помощью команды:
docker run -d <docker_hub_username>/my_app
Далее загрузим наш контейнер в AWS Elastic Beanstalk. Для этого потребуется аккаунт на AWS. Если его нет, необходимо зарегистрироваться. Вас попросят ввести данные карты для верификации, но переживать не стоит, ведь мы воспользуемся бесплатным годовым триалом. Чтобы поиграться, этого более чем достаточно, а вот если вы захотите вывести проект в продакшен, следует перейти на VPS — это даст больше контроля и гибкости.
- Переходим в Elastic Beanstalk, на вкладку Applications, и создаём новое приложение:
- Называем приложение, теги оставляем пустыми:
- Создаём для приложения environment:
- Выбираем Worker environment:
- В качестве платформы выбираем Docker:
- В пункте Application code нужно загрузить JSON-файл с конфигурацией Docker-образа. Сам файл:
Dockerrun.aws.json
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "<docker_hub_username>/my_app",
"Update": "true"
},
"Ports": [
{
"ContainerPort": 5000,
"HostPort": 8000
}
]
}
- Создаём окружение:
- AWS начинает создавать окружение, просто ждём завершения процесса:
- Если всё прошло успешно, вы увидите индикатор успешного запуска приложения:
Проверяем работу нашего Telegram bot:
Успех!
Заключение
Поздравляем! Теперь вы знаете, как писать роботов для Telegram на Python.
Бота можно дополнять другими функциями, например, добавить отправку файлов, опрос или клавиатуру.
Кстати, в телеграмме есть аж целых два типа клавиатур:
- Классическая RelpyKeyboardMarkup, у которой кнопки располагаются под полем ввода сообщения:
- Более современная InlineKeyboardMarkup, которая привязывается к конкретному сообщению:
Но и это полностью рабочий Телеграм-бот на Python: дополните словарём, и получите полноценную беседу. Также можете опробовать функциональность нашего Telegram-бота.
В «настоящих проектах» не обойтись без базы данных. Тут на помощь приходит docker-compose, который позволяет объединить несколько контейнеров в один сервис. Таким образом, например, можно создать приложение и положить его в контейнер, а базу данных, как отдельный сервис, поместить в другой контейнер, и с помощью docker-compose наладить между ними связь.
Также для более серьёзной разработки лучше использовать выделенный виртуальный сервер (VPS): он даёт гораздо больше гибкости и свободы, чем тот же AWS. А самое главное, он более приближён к «боевой» разработке. Схема работы тут будет даже проще, чем с AWS: вам просто нужно установить Docker, спуллить образ с Docker Hub и запустить его.
Всем привет! Так как это моя первая статья и я не знаю что да как делать, буду писать как знаю.
Сегодня хотелось бы Вам рассказать как легко сделать своего Telegram бота на очень популярном Языке Программирования — Python. Статья будет в двух частях, в первой мы установим Python и все необходимые компоненты и напишем самого простого бота, во второй Напишем основную логику бота. Если Вы не новичок можете листать вниз, так как тут будет много знакомой вам информациию.
Не буду томить долгим вступлением, давайте начнем!
И так первое что мы должны сделать это составить план нашего бота. В план будут входить: какие функции будет выполнять бот и собстна все.
Как будет выглядеть наш бот со стороны пользователя:
-
Пользователь заходит в бота и пишет ему команду «/start»
-
Попадает в главное меню бота
-
Пользователь выбирает действие на клавиатуре кнопок
Полностью функционал боа не нужно расписывать так как это будет очень долго и в дальнейшем бесполезно
Теперь представим что будете видеть Вы как Админ и Владелец этого бота:
-
Вы заходите в бота написав ему команду «/start»
-
Попадаете в главное меню Админ-панели
-
Выбираете действие на клавиатуре
Вот на этом наш план бота заканчивается, приступаем к части установки Python
-
Заходим на сайт python.org
-
Нажимаем на вкладку «Download»
-
Листаем в самы низ и скачиваем последнюю версию Python (на данный момент это Python 3.10)
-
У Вас начнеться установка Установшика Python. Когда он скачается откройте его и у Вас должно открытся такое окно:
У Вас будет надпись «Install Now», у меня не она так как у меня уже скачан Python -
Обязательно сделайте галочку рядом с «Add Python 3.10 to PATH»
-
После установки появится возможность отключить ограничение длины
MAX_PATH
. В системах Linux этих ограничений нет. Проигнорировав этот пункт, вы можете столкнуться с проблемой совместимости в будущем. Код созданный на Linux не запустится на Windows. -
Вот и все, у Вас теперь есть Python
Теперь давайте приступим к установке, но уже бибилиотек, а не ЯП
Если не установлен pip
-
Скачайте файл get-pip.py и сохраните у себя на компьютере.
-
Откройте командную строку и перейдите в папку, в которой сохранен
get-pip.py
. -
В командной строке выполните команду:
python get-pip.py
илиpython3 get-pip.py
. -
PIP установлен 🎉!
Создайте новую папку где будете разрабатывать бота
Зайдите в командую строку, зайдите через нее в папку для разработки и введите команду установки библиотеки aiogram
pip install aiogram
И давайте наконец приступим к коду:
-
Для начала откроем среду разработки Python
-
IDLE в Windows находится в меню «Пуск» → «Python 3.10» → «IDLE«. Также можно быстро найти его через «Поиск» около меню «Пуск«, набрав в поле поиска «IDLE»:
-
В IDLE есть возможность полноценно работать с файлами — просматривать, редактировать, создавать новые. Чтобы создать новый файл, выберите «File» -> «New File» (или Ctrl + N). Откроется новое окно:
-
Сохраним файл в папку куда мы устанавливали библиотеку
-
Все готово для написания кода
-
-
Первое что мы должны сделать это импортировать библиотеки
import logging # эта библиотека идет вместе с python from aiogram import Bot, Dispatcher, executor, types # импортируем aiogram
-
Далее обьявляем несколько переменных:
API_TOKEN = 'ТОКЕН' # Токен logginglogging.basicConfig(level=logging.INFO) # Initialize bot and dispatcher 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("Привет! Это простейший бот на aiogram") # отвечает на сообщение
-
Теперь будем обрабатывать каждое сообщение и отправлять его обратно
@dp.message_handler() async def echo(message: types.Message): await message.answer(message.text)
-
И в самом конце добавляем две строчки что бы бот работал всегда
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Вот и все теперь осталось получить токен бота и вставить его в переменную API_TOKEN
Получение Токена Для Бота
-
Открываем @BotFather и запускаем его (Старт/Start).
-
В списке предложенных команд выбираем:
/newbot - create a new bot
, нажимаем на эту команду, или вводим ее вручную в поле для ввода сообщений. -
Вам предложат указать как будут звать бота, в дальнейшем название бота можно будет поменять. Вводите название в поле для ввода сообщений.
-
Далее вам предложат указать имя, по которому бот будет доступен для пользователей. Имя пишите, используя латинский алфавит, цифры и нижнее подчеркивание. Еще одно важное условие — имя должно оканчиваться на «bot». Можно также с большой буквы «Bot», или «_bot» или «_Bot».
После этих действий Вы получите сообщение с токеном бота
Его то мы и вставляем в переменную API_TOKEN
Если Вы выполнили все те шаги что описаны выше, у вас все успешно заработает и Вы молодец, если же у вас какие-то проблемы, пишите мне в Telegram@derkown
Вот и все! Спасибо за прочтение, в скором времени появиться вторая часть. Опять же мой Telegram рад приветсвовать вас. Удачи и Пока!
Телеграм используют более пятисот миллионов людей по всему миру. Компании с его помощью упрощают заказ товаров или услуг, дают консультации. Для этого используют ботов — автоматические программы. Их пишут на разных языках программирования. Рассмотрим, как создать бот на самом популярном в феврале 2022 года языке — Python.
Установите интерпретатор Python
Python — динамически типизированный, интерпретируемый язык. Программы, написанные на нём, не компилируются в исполняемые файлы. Поэтому, чтобы запускать Python-программы, устанавливают его интерпретатор.
🖥️ Windows
- Перейдите на официальную страницу загрузки Python.
Выберите последнюю версию Python
- Пролистайте вниз страницы и скачайте Windows Installer.
Выберите 64-bit
- Откройте установщик и поставьте галочку, нажмите Install Now.
Поставьте галочку перед установкой напротив Add Python to PATH
- После откройте командную строку cmd.exe и установите виртуальное окружение с помощью команды
pip install virtualenv
❗ Вызов интерпретатора в командной строке Windows отличается от других ОС. Используйте команду py вместо python3.
🖥️ Linux
Если вы используете ОС Linux, вероятно, Python уже установлен. Чтобы проверить, откройте терминал с помощью команды:
python3 --version
Если вы видите что-то вроде Python 3.x.x, то Python есть. В противном случае используйте установленный менеджер пакетов. В основном это apt. Введите команду:
sudo apt install python3
Установите виртуальное окружение с помощью команды:
sudo apt install python3-venv
🖥️ MacOS
На макбуках Python часто тоже уже есть. Откройте терминал и проверьте с помощью команды:
python3 --version
Ответ Python 3.x.x, а не ошибка, тоже подтверждает, что Python установлен. Если нет — используйте менеджер пакетов brew. Введите команду:
brew install python3
Установите пакет для создания виртуального окружения:
pip install virtualenv
Создайте папки проекта и виртуального окружения
Откройте терминал Linux или MacOS, командную строку Windows. Перейдите в директорию, в которой вы хотите создать проект бота. Последовательно
введите команды:
mkdir myBot cd myBot python3 -m venv env #
или, если вы используете Windows:
py -m venv env #
Эти команды создадут папку проекта myBot внутри текущей рабочей директории. А в ней — папку с виртуальным окружением.
Активируйте окружение, выберите и установите библиотеки
Чтобы активировать виртуальное окружение на MacOS или Linux, используйте команду
source ./env/bin/activate
И команду
source.envbinactivate.bat
для Windows.
Чтобы создавать боты, используют разные библиотеки. Самые популярные: python-telegram-bot с синхронным подходом, aiogram с асинхронным.
Асинхронность позволяет отвлекаться от задач и не ждать ввода от пользователя, поэтому мы будем использовать библиотеку aiogram. Документация по ней — на docs.aiogram.
Используйте менеджер Python-пакетов (pip). Чтобы установить библиотеку aiogram, введите команду:
pip install aiogram
Зарегистрируйте бота и получите API-ключ
Откройте телеграм и найдите бота @BotFather. Он нужен, чтобы создавать другие боты и управлять ими.
Нажмите «Запустить».
Введите команду /newbot и отображаемое имя бота
Теперь введите никнейм бота. Он должен быть уникальным, в конце обязательно слово bot. Когда юзернейм пройдет валидацию, вы получите сообщение с API-ключом.
Никому не сообщайте полученный токен
Примеры ботов
🤖 Эхобот
Для начала в папке проекта создайте несколько файлов.
Handlers.py будет хранить функции — обработчики сообщений и команд, main.py нужен для запуска
Напишите в main.py код:
from aiogram import Bot, Dispatcher, executor import handlers API_TOKEN = 'вставьте сюда ваш токен' # создаем экземпляры бота и диспетчера bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) # запускаем программу if __name__ == '__main__': # указание skip_updates=True # пропустит команды, # которые отправили # до старта бота executor.start_polling(dp, skip_updates=True)
Разберем построчно:
from aiogram import Bot, Dispatcher, executor import handlers
Здесь из библиотеки aiogram мы импортируем классы Bot, Dispatcher — класс, который регистрирует, на какие команды/сообщения и какой функцией отвечать. И executor — он запускает бота и выполняет функции, зарегистрированные в диспетчере. На второй строке мы импортируем модуль handlers.py — в нём хранят обработчики.
Затем объявите переменную, в которую нужно вставить токен от @BotFather. Создайте экземпляр класса бота, в него передайте токен. И экземпляр диспетчера, в него передайте только что созданный бот.
Далее откройте файл handlers.py и напишите в нём пару команд, которые будут обрабатывать запросы:
from aiogram import types # функция, обрабатывающая команду /start async def start(message: types.Message): await message.answer("Привет!nНапиши мне что-нибудь!") # функция, которая отвечает на сообщение # текстом async def echo(message: types.Message): await message.answer("Сам ты: " + message.text)
Здесь из модуля aiogram импортируем типы, с помощью которых преобразуем текст сообщения или файлы в структуру данных. Это может быть Message — сообщение, Audio — аудиозапись, Animation — анимация.
Далее определите асинхронные функции, чтобы обрабатывать команды /start и отвечать на сообщения.
Зарегистрируйте эти функции в диспетчере. Для этого в файле main.py добавьте перед запуском программы:
# регистрируем функции dp.register_message_handler(h.start, commands=["start"]) dp.register_message_handler(h.echo)
В итоге файл main.py выглядит так:
from aiogram import Bot, Dispatcher, executor import handlers API_TOKEN = 'вставьте сюда ваш токен' # создаем бота и диспетчер bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) # регистрируем функции dp.register_message_handler(handlers.start, commands=["start"]) dp.register_message_handler(handlers.echo) # запускаем программу if __name__ == '__main__': # указание skip_updates=True # пропустит команды, # которые отправили # до старта бота executor.start_polling(dp, skip_updates=True)
Чтобы проверить работу, введите в терминале python3 main.py или py main.py на Windows. Откройте бота в телеграме и запустите его
🤖 Криптобот
Чтобы написать криптобота, который будет сообщать текущую цену BTC, LTC и DASH, используйте бесплатный API-сервис SoChain. Еще потребуется дополнительная библиотека, чтобы создать асинхронные запросы aiohttp, но ее устанавливают вместе с aiogram.
Создайте новый модуль utils.py. Добавьте в него url-адрес API-сервиса. Чтобы узнавать цену, используйте метод Get Prices. Он возвращает json-объект с данными о цене из нескольких источников. Поэтому напишите функцию, которая вычисляет среднее значение:
BASE_URL = "https://sochain.com/api/v2/" # API URL # функция, чтобы рассчитать цену def calculate_price(data): prices = [float(entity["price"]) for entity in data["data"]["prices"]] return f"{(sum(prices) / len(prices)):.2f} USD"
Далее откройте файл handlers.py и напишите код:
from aiogram import types # импортируем библиотеку aiohttp import aiohttp # импортируем из utils все данные from utils import * # обработчик команды /start async def start(message: types.Message): await message.answer("Привет!nНапиши мне акроним криптовалюты, чтобы узнать текущую цену") # обработчик команды /help async def help(message: types.Message): await message.answer("Доступные сети:n" + "n".join(networks)) # обработчик запроса цены async def get_price(message: types.Message): session = aiohttp.ClientSession() # создаем GET запрос по закрепленному за методом get_price url async with session.get(BASE_URL + f"get_price/{message.text}/USD") as resp: # получаем ответ в формате json data = await resp.json() # если статус запроса — успешно if data["status"] == "success": # рассчитываем цену и отправляем пользователю price = calculate_price(data) await message.answer(price) else: # сообщаем о том, что произошла ошибка await message.answer("Произошла ошибка")
Теперь измените main.py файл: зарегистрируйте функции. Затем протестируйте бота:
from aiogram import Bot, Dispatcher, executor import handlers API_TOKEN = 'вставьте сюда ваш токен' bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) dp.register_message_handler(handlers.start, commands=["start"]) dp.register_message_handler(handlers.help, commands=["help"]) dp.register_message_handler(handlers.get_price) if __name__ == '__main__': executor.start_polling(dp, skip_updates=True)
Когда пользователь укажет неподдерживаемую сеть ETH, бот вернет цену биткоина, потому что так устроен API-сервис. Если он не распознал сеть, то использует BTC
Чтобы исправить ошибку, создайте клавиатуру, которая возвращает нужные значения. Напишите специальный класс Middleware: в нём описываются проверки до и после обработки запроса. Либо проверьте вхождение внутри функции. Последний вариант проще и легче.
Если пользователь отправит неподдерживаемый акроним криптосети, вы сообщите ему об этом. Для этого в файле utils.py определите список поддерживаемых сетей:
networks = ["BTC", "LTC", "DASH"] # <-- поддерживаемые сети BASE_URL = "https://sochain.com/api/v2/" # API URL def calculate_price(data): prices = [float(entity["price"]) for entity in data["data"]["prices"]] return f"{(sum(prices) / len(prices)):.2f} USD"
Теперь отредактируйте функцию расчета цены криптовалюты в файле handlers.py. Для этого добавьте проверку вхождения сети в список поддерживаемых:
async def get_price(message: types.Message): network = message.text.upper() # приводим сообщение к верхнему регистру # выполняем проверку вхождения if network not in networks: await message.answer("Вы указали неподдерживаемую криптовалюту") return session = aiohttp.ClientSession() async with session.get(BASE_URL + f"get_price/{message.text}/USD") as resp: data = await resp.json() if data["status"] == "success": price = calculate_price(data) await message.answer(price) else: await message.answer("Произошла ошибка")
Когда пользователь укажет неподдерживаемую сеть ETH, бот сообщит об этом
Код всех файлов
utils.py
networks = ["BTC", "LTC", "DASH"] # поддерживаемые сети BASE_URL = "https://sochain.com/api/v2/" # API URL def calculate_price(data): prices = [float(entity["price"]) for entity in data["data"]["prices"]] return f"{(sum(prices) / len(prices)):.2f} USD"
handlers.py
import aiohttp from aiogram import types from utils import * async def start(message: types.Message): await message.answer("Привет!nНапиши мне акроним криптовалюты, чтобы узнать текущую цену") async def help(message: types.Message): await message.answer("Доступные сети:n" + "n".join(networks)) async def get_price(message: types.Message): network = message.text.upper() if network not in networks: await message.answer("Вы указали неподдерживаемую криптовалюту") return session = aiohttp.ClientSession() async with session.get(BASE_URL + f"get_price/{message.text}/USD") as resp: data = await resp.json() if data["status"] == "success": price = calculate_price(data) await message.answer(price) else: await message.answer("Произошла ошибка")
main.py
from aiogram import Bot, Dispatcher, executor import handlers API_TOKEN = 'вставьте сюда ваш токен' bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) dp.register_message_handler(handlers.start, commands=["start"]) dp.register_message_handler(handlers.help, commands=["help"]) dp.register_message_handler(handlers.get_price) if __name__ == '__main__': executor.start_polling(dp, skip_updates=True)
Главное о телеграм-боте на Python
- Чтобы создать бота, установите интерпретатор Python. На Linux и MacOS он часто уже есть.
- Создайте папку с проектом myBot, в ней — папку с окружением, активируйте его, установите библиотеку aiogram. Она позволяет обрабатывать запросы, даже если вы ждете, пока пользователь введет информацию.
- Регистрируйте бота и управляйте его настройками с помощью @BotFather.
В онлайн-университете Skypro обучаем профессии Python-разработчика за 10 месяцев. Узнаете, как писать чистый код, серверы для магазина, приложения, сервиса или игры, разрабатывать сложную архитектуру сервисов. Выполните практические задания с реальными инструментами и сделаете четыре проекта для портфолио. Развиваем только нужные навыки, необходимые для старта в профессии.
Is a pretty simple and fully asynchronous framework for Telegram Bot API
Project description
Project details
Download files
Download the file for your platform. If you’re not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Close
Hashes for aiogram-2.25.1.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 59ad78fc0ebbef1fd471c15778a4594b60117e0d7373bc2ce7bcd192074d527d |
|
MD5 | 944ab87052eaa8fb16b6076750dfe1f1 |
|
BLAKE2b-256 | c16badbb9409f7af5deaeb461e76a553ae1640f86dd60ae3ca5939abb03dd844 |
Close
Hashes for aiogram-2.25.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7bb770cd0459f1dbaea00578bf13fb2e6a1812f22adf94a988c11a7c0d5f33e1 |
|
MD5 | 8c98994a10354ced9dffd5eff14532e9 |
|
BLAKE2b-256 | c1681c41d0245849af98250058dd1f702c56025c9fb4e19fe07158283852bbc0 |