Как установить библиотеку aiogram

Telegram-бот на Python за полчаса с aiogram

Напишем простой диалоговый Telegram-бот на Python, который в дальнейшем можно дополнить различными функциями, и задеплоим его.

Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.

Настройка

Откройте Telegram, найдите @BotFather и начните беседу. Отправьте команду /newbot и следуйте инструкциям. Вы получите:

Обязательно сохраните токен, так как это ключ для взаимодействия с ботом.

Установка Python

Для написания Telegram-бота на Python, нужно установить сам язык. Если вы пользуетесь Windows, скачать Python можно с официального сайта. Версия важна. Нам подойдет Python не ниже версии 3.7. Если же у вас Linux или macOS, то, скорее всего, у вас стоит Python 3.6. Как обновиться, можете почитать здесь.

Тем, кто только начал изучение этого языка, будет также полезна дорожная карта Python-разработчика.

Установка pip

Установка aiogram

Установить данный фреймворк для Telegram Bot API с помощью pip:

Hello, bot!

Давайте напишем простенькую программу приветствия. Для начала следует импортировать библиотеки и создать экземпляры Телеграм бота и диспетчера:

Теперь напишем обработчик текстовых сообщений, который будет обрабатывать входящие команды /start и /help :

Добавим ещё один обработчик для получения текстовых сообщений. Если бот получит «Привет», он также поздоровается. Все остальные сообщения будут определены, как нераспознанные:

Запускаем Telegram бота, написанного на Python, следующим образом:

Примечание Так мы задаём боту непрерывное отслеживание новых сообщений. Если бот упадёт, а сообщения продолжат поступать, они будут накапливаться в течение 24 часов на серверах Telegram, и в случае восстановления бота прилетят ему все сразу.

Ну вот и всё, простенький бот в Телеграмме на языке Python готов.

Docker

Сейчас мало кто не слышал про Docker, но если вдруг не слышали — вот хорошая статья. Для нашего проекта потребуется самый простой Dockerfile:

Каталог проекта должны при этом содержать следующие файлы:

Для локальных тестов достаточно установить Docker (linux, mac, windows), после чего в папке проекта собрать и запустить контейнер с помощью команд:

my_app — это просто название нашего контейнера, вместо которого можно использовать другое имя.

-d — специальный флаг, который запускает контейнер в фоне и позволяет дальше работать в терминале. Это называется detached mode.

Деплой на AWS

Прежде всего нам понадобится аккаунт на Docker Hub. Это аналог GitHub, только не с исходниками кода, а с уже созданными контейнерами. Работа с Docker Hub выглядит достаточно просто:

Загружаем его на докерхаб:

Для проверки успешности загрузки можете запустить контейнер из Docker Hub с помощью команды:

Далее загрузим наш контейнер в AWS Elastic Beanstalk. Для этого потребуется аккаунт на AWS. Если его нет, необходимо зарегистрироваться. Вас попросят ввести данные карты для верификации, но переживать не стоит, ведь мы воспользуемся бесплатным годовым триалом. Чтобы поиграться, этого более чем достаточно, а вот если вы захотите вывести проект в продакшен, следует перейти на VPS — это даст больше контроля и гибкости.

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Проверяем работу нашего Telegram bot:

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Заключение

Поздравляем! Теперь вы знаете, как писать роботов для Telegram на Python.

Бота можно дополнять другими функциями, например, добавить отправку файлов, опрос или клавиатуру.

Кстати, в телеграмме есть аж целых два типа клавиатур:

Но и это полностью рабочий Телеграм-бот на Python: дополните словарём, и получите полноценную беседу. Также можете опробовать функциональность нашего Telegram-бота.

В «настоящих проектах» не обойтись без базы данных. Тут на помощь приходит docker-compose, который позволяет объединить несколько контейнеров в один сервис. Таким образом, например, можно создать приложение и положить его в контейнер, а базу данных, как отдельный сервис, поместить в другой контейнер, и с помощью docker-compose наладить между ними связь.

Также для более серьёзной разработки лучше использовать выделенный виртуальный сервер (VPS): он даёт гораздо больше гибкости и свободы, чем тот же AWS. А самое главное, он более приближён к «боевой» разработке. Схема работы тут будет даже проще, чем с AWS: вам просто нужно установить Docker, спуллить образ с Docker Hub и запустить его.

Источник

Футбольный телеграм бот на Python (1/4): Подготовка и настройка бота

В этой серии статей мы напишем телеграм бота на python. Он работает с внешним API, запрашивает результаты футбольных матчей и выводить их в сообщении.

Когда локальная версия будет готова, разместим бота на сервере. Вместо Heroku, я выбрал отдельную виртуальную машину, что бы бот не засыпал. Это ближе к реальности.

Вся разработка разбита на этапы:

Рабочая версия бота запущена в телеграме до конца февраля @FonlineBOT. Бот отключен.

Вводные данные

Материал рассчитан на уровень Начинающий+, нужно понимать как работают классы и функции, знать основы базы данных и async/await. Если знаний мало, крайне желательно писать код в Pycharm, бесплатная версия подходит.

Используйте указанные версии библиотек, что бы проект работал без изменений. При установке иных версий вы можете получать ошибки, связанные с совместимостью.

Локальная установка библиотек для бота и Redis

Для начала нужно создать проект «fonlinebot» с виртуальным окружение. В Pycharm это делается так:

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Затем установить библиотеки в виртуальном окружении. Сразу понадобятся 4: для бота, работы с redis, ускорения и emoji в сообщениях.

Установка Redis локально

Redis — это резидентная база данных (такая, которая хранит записи прямо в оперативной памяти) в виде пар ключ-значение. Чтение и запись в память происходит намного быстрее, чем в случае с дисками, поэтому такой подход отлично подходит для хранения второстепенных данных.

Источник

Знакомство с aiogram¶

Установка¶

Для начала давайте создадим каталог для бота, организуем там virtual environment (далее venv) и установим библиотеку aiogram.
Проверим, что установлен Python версии 3.7 (если вы знаете, что установлен 3.8 и выше, можете пропустить этот кусок):

В этой главе используется aiogram версии 2.9.2, но перед началом работы рекомендую заглянуть в канал релизов библиотеки и проверить наличие более новой версии. Подойдёт любая более новая, начинающаяся с цифры 2, поскольку в будущем ожидается релиз aiogram 3.0 с заметными изменениями и без обратной совместимости.
Чтобы избежать неприятностей, зафиксируемся на 2.9.2 и далее будем обновляться вручную.

Обратите внимание на префикс «venv» в терминале. Он указывает, что мы находимся в виртуальном окружении с именем «venv». Проверим, что внутри venv вызов команды python указывает на всё тот же Python 3.7:

Последней командой deactivate мы вышли из venv, чтобы он нам не мешал.

Первый бот¶

Давайте создадим файл bot.py с базовым шаблоном бота на aiogram:

Первое, на что нужно обратить внимание: aiogram — асинхронная библиотека, поэтому ваши функции тоже должны быть асинхронными, а перед вызовами методов API нужно ставить ключевое слово await, т.к. эти вызовы возвращают корутины.

Асинхронное программирование в Python

Не стоит пренебрегать официальной документацией!
Прекрасный туториал по asyncio доступен на сайте Python.

Если вы в прошлом работали с какой-то другой библиотекой для Telegram, например, pyTelegramBotAPI, то концепция хэндлеров (обработчиков событий) вам сразу станет понятна, разница лишь в том, что в aiogram хэндлерами управляет диспетчер.
Диспетчер регистрирует функции-обработчики, дополнительно ограничивая перечень вызывающих их событий через фильтры. После получения очередного апдейта (события от Telegram), диспетчер выберет нужную функцию обработки, подходящую по всем фильтрам, например, «обработка сообщений, являющихся изображениями, в чате с ID икс и с длиной подписи игрек». Если две функции имеют одинаковые по логике фильтры, то будет вызвана та, что зарегистрирована раньше.

Чтобы зарегистрировать функцию как обработчик сообщений, нужно сделать одно из двух действий:
1. Навесить на неё декоратор, как в примере выше. С различными типами декораторов мы познакомимся позднее. 2. Напрямую вызвать метод регистрации у диспетчера.

Рассмотрим следующий код:

Давайте запустим с ним бота:
Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Функция cmd_test2 не работает, т.к. диспетчер о ней не знает. Исправим эту ошибку и отдельно зарегистрируем функцию:

Снова запустим бота:
Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Обработка ошибок¶

Аналогично пишутся обработчики и на другие исключения. Таким образом, если одна и та же непредвиденная ситуация может возникнуть в различных хэндлерах, то можно вынести её обработку в отдельный хэндлер ошибок. Кода будет меньше, а оставшийся станет читабельнее.

Синтаксический сахар¶

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Более того, для большинства типов сообщений есть вспомогательные методы вида «answer_» или «reply_«, например:

Всё хорошо, но если вдруг вы захотите поделиться с кем-то кодом, то придётся каждый раз помнить об удалении из исходников токена бота, иначе придётся его перевыпускать у @BotFather. Чтобы обезопасить себя, давайте перестанем указывать токен прямо в коде, а вынесем его как переменную окружения.
Замените следующие строчки из начала файла:

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Запустите снова бота и убедитесь, что он работает. Получившийся код можно смело сохранять в PyCharm в File Templates.

На этом мы закончим знакомство с библиотекой, а в следующих главах рассмотрим другие «фишки» aiogram и Telegram Bot API.

Источник

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:

From sources¶

Or if you want to install stable version (The same with version from PyPi):

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.

Installation:

In addition, you don’t need do anything, aiogram automatically starts using that if it is found in your environment.

Источник

Aiogram Broadcaster Library

Содержание статьи

Содержание

Что такое aiogram_broadcaster?

Думаю каждый, кто погружался в дебри документации aiogram знакомы с примером простейшей рассылки, представленной там. В целом неплохо, но он выглядит не очень гибким, ведь так?

Поэтому я написал небольшую библиотеку aiogram_broadcaster (далее бродкастер), реализующую рассылки, чтобы упростить жизнь себе и людям.
Например пример рассылки уведомления пользователям во время запуска бота могло бы выглядеть следующим образом:

Буквально одна строка. Напомню, как мы делали что-то похожее раньше:

Как-то много кода, вам так не кажется? К тому же, в этом примере есть много нюансов. Как минимум он не такой гибкий и надёжный.

Результат обеих рассылок абсолютно идентичен:

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Ничего особенного. Результат абсолютно тот же, но это пока. Ествественно ко всему этому прилагается логгирование:

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Ну и соответственно результат:

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Но давайте пойдём по порядку.

Установка

Эта библиотека уже опубликована на pypi и установить её можно всего одной командой:

или
poetry:

или
pipenv:

После этого библиотека будет установлена и готова к использованию

Обновление шаблона

Я, как и любой другой программист, постоянно развиваюсь и совершенствуюсь, поэтому и идеи, которые я предлагал в прошлом в моих глазах устаревают. Очередное обновление шаблона вы можете найти по ссылке [клик]. Прошу меня понять. Я, опять же, не претендую на абсолютную правоту, ведь сколько людей, столько и мнений, но в данный момент данная версия шаблона меня устраивает. Я ни в коем случае не навязываю свой стиль написания кода и решения, которые я использую, но мне кажется, что это было необходимо упомянуть.

Какие изменения будут использоваться в текущей статье?

Я не хотел очень много менять, но посчитал необходимым всё-таки просто убрать это ужастное подключение фильтров, обработчиков и мидлварей через импорт, заменив условие на функцию. Я наконец осознал, что импортирование ради исполнения кода — не самое лучшее решение по множеству причин. Главной сложностью было отказаться от подключения обработчиков посредством декораторов (да-да, от декораторов для подключения обработчиков).

__init__.py файл фильтров изменён тем же образом

Теперь эти функции нужно вызвать в __main__.py файле вместо импортирования модулей:

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Не буду томить, хоть это и очевидно. Минимальный пример использования мы уже рассмотрели. Я думаю из него было понятно, что это, грубо говоря, переменная, на месте которой будет подставляться айди чата, в который отправляется сообщение. Хоть это и не выглядит очень полезным (несмотря на то, что это уже можно использовать для ссылок и тому подобного), кроме id вы можете подставить любое другое значение в ваш текст, например имя пользователя. Таким образом рассылки можно делать более “живыми” и персонализированными. Ведь когда бот обращается лично к тебе, даже объявление о каких-либо изменениях в боте читать появляется больше желания. Все же встречали сообщения:

ты, да-да ты, именно ты и никто другой выйграл многа-многа деняк. Подпишись на канал и отправь боту номер карты, срок действия и три цифры сзади

Всё это, конечно же, шутки, но даже в этом примере можно подставлять имя пользователя, чтобы тот больше нам доверял.

Зачем так много разных классов для рассылок?

И так, вернёмся всё-таки к нашим рассылкам. Кто надумает залезть в исходный код бродкастера наверняка обратит внимание, что библиотека состоит не из всего одного простенького файла (на момент написания статьи уже всего 5 файлов, однако это не всё, и если многие заинтересуются данным инструментом, он будет расширяться). И всё-таки зачем их так много?

Пробежавшись поверхностно по файлам, вы можете заметить, что во всех файлах, кроме types и __init__.py находится по классу. Но зачем? Почему было просто не запихнуть всё в один класс и дело с концом? Я тоже так думал изначально, но оказалось, что такая архитиктура менее гибкая и поддерживаемая, поэтому было принято определить абстрактный класс, объединяющий в себе общие методы всех этих классов. Данный абстрактный класс находится в aiogram_broadcaster/base.py и мы рассмотрим его чуть позже.
Таким образом вероятность ошибки сведена к минимум, а разрабатывать библиотеку становится значительно легче.

Самый перспективный класс — MessageBroadcaster

Как установить библиотеку aiogram. Смотреть фото Как установить библиотеку aiogram. Смотреть картинку Как установить библиотеку aiogram. Картинка про Как установить библиотеку aiogram. Фото Как установить библиотеку aiogram

Всё работает. В ссылку тут подставлена строка tg://user?id=$chat_id и в результате каждый пользователь получает ссылку именно на свой профиль. Разве это не круто?

Из чего состоит бродкастер?

Остальные бродкастеры, такие как PhotoBroadcaster, DocumentBroadcaster и прочее будут добавляться по ходу разработки. Всему своё время.

Как подставляются аргументы в сообщения?

Чтобы ответить на вопрос как подставляются аргументы в сообщения мы посмотрим исходный код базового класса бродкастера. Начнём с конструктора:

Первое, что мы видим, аргументы chats и kwargs, принемаемые в конструктор.

Как мы можем видеть, он состоит из нескольких других типов. Если посмотреть на эти 3 строки несколько минут и вникнуть, можно понять, что наш BaseBroadcaster в качестве chats ожидает либо список айдишников, либо список словарей. Забегая наперёд, скажу, что этот словари как раз и содержат все наши аргументы. Все словари должны иметь идентичные аргументы и, самое важное, аргумент chat_id, который берётся для оправки сообщения в чат. Именно его мы и использовали. Каждый словарь расширяется элементами из kwargs.

Уже всё складывается в общую картину, так?

Механизм запуска

Откуда берутся аргументы мы уже разобрались. Давайте посмотрим, как именно у нас выполняется запуск рассылки. У всё того же класса BaseBroadcaster есть метод run, не принимающий аргументов. Именно он и запускает нашу рассылку. Давайте посмотрим, как он работает:

Что-то напоминает, не так ли? Это уже очень похоже на наш старый механизм рассылки, который мы использовали для того, чтобы известить администраторов о запуске бота. За парой небольших исключений:

Что за метод send у бродкастера?

Что за метод send у BaseBroadcaster?

Я не вижу смысла углубляться в библиотеку ещё сильнее и смотреть, как работает метод send у MessageBroadcast и TextBroadcast. Кто захочет, способен разобраться в этом самостоятельно.

Генерация списков

Этот раздел был добавлен для тех, кто в питоне совсем недавно. Хочу вам показать, что такое List Comprehensions.

И так, давайте допустим, что у нас есть в базе данных таблица пользователей, содержащая fullname пользователя и его id. Я представлю её следующем классом:

И допустим мы достали как-то из базы список таких пользователей. Теперь нам нужно сгенерировать список айдишников чата, где у каждого пользователя будет уникальный mention — ссылка с его именем на его телеграм аккаунт. Для этого давайте нашей модели User добавил метод get_mention, почти как в aiogram:

Мы будем использовать этот метод во время генерации. И так, допустим есть у нас список инстансов этого класса. Скорее всего новички, не знающие о List Comprehensions бы делали это как-то так:

Это выглядит не так красиво, как хотелось бы. List Comprehensions используется для генерации список и имеет следующий вид

У нас бы это выглядело следующим образом:

Это выглядит куда лаконичнее, понятнее и лучше, чем было до этого. Именно этот метод я советую вам использовать во время генерации списка с аргументами для бродкастера

Заключение

Библиотека очень простая, но от того не менее интересная и полезная. У меня есть на неё поистине грациозные планы. Если сейчас её можно заменить простой функцией, то в будущем это будет просто невозможно. Следите за обновлениями в моём телеграм канале @forzend.

Нужно сказать, что любая помощь приветствуется. Библиотека, естественно, имеет открытый исходный код, который мы разбирали в этой статье. Если у вас есть желание помочь, вы можете высказать свои идеи и пожелания мне в телеграм, а также сделать PR в dev ветку гитхаб репозитория библиотеки.

По традиции, весь исходный код, используемый в уроке, в открытом гитхаб репозитории F0rzend/articles.

В начале я говорил об изменениях в моём шаблоне. Но есть ещё несколько идей для статей, поэтому я создам голосование на тему следующей статьи, которое будет опубликовано в моём телеграм канале @forzend
Назад к содержанию

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *