Telegram aigram как сделать class
Перейти к содержимому

Telegram aigram как сделать class

  • автор:

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

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

Теперь создадим файл requirements.txt , в котором укажем используемую нами версию aiogram.

О версиях aiogram

В этой главе используется 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. Напрямую вызвать метод регистрации у диспетчера.

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

Давайте запустим с ним бота:
Команда /test2 не работает

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

Снова запустим бота:
Обе команды работают

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

При работе бота неизбежно возникновение различных ошибок, связанных не с кодом, а с внешними событиями. Простейший пример: попытка отправить сообщение пользователю, заблокировавшему бота. Чтобы не оборачивать каждый вызов в try..except , в aiogram существует специальный хэндлер для исключений, связанных с Bot API.
Рассмотрим следующий пример кода, имитирующий задержку перед ответом пользователю:

За эти 10 секунд пользователь может успеть заблокировать бота со своей стороны и попытка вызвать метод reply приведёт к появлению исключения BotBlocked . Напишем специальный хэндлер для этого исключения:

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

У errors_handler есть одна особенность, из-за которой его использование может быть нежелательно. Дело в том, что после срабатывания и завершения хэндлера, управление в исходную функцию не возвращается. Проще говоря, если, например, 57-я итерация цикла из 100 привела к срабатыванию errors_handler, остальные итерации выполнены не будут, как и весь остальной код исходной функции. В этом случае ничего не остаётся, кроме как использовать try..except .

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

Для того, чтобы сделать код чище и читабельнее, aiogram расширяет возможности стандартных объектов Telegram. Например, вместо bot.send_message(. ) можно написать message.answer(. ) или message.reply(. ) . В последних двух случаях не нужно подставлять chat_id , подразумевается, что он такой же, как и в исходном сообщении.
Разница между answer и reply простая: первый метод просто отправляет сообщение в тот же чат, второй делает «ответ» на сообщение из message :

Разница между message.answer() и message.reply()

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

что значит ‘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) может быть недоступен в области видимости конкретной функции. К счастью, объект бота доступен во всех типах апдейтов: Message, CallbackQuery, InlineQuery и т.д. Предположим, вы хотите по команде /dice отправлять кубик не в тот же чат, а в канал с ID -100123456789. Перепишем предыдущую функцию:

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

Но теперь ваш бот не запустится, т.к. будет сразу завершаться с ошибкой Error: no token provided . Чтобы передать переменную окружения в PyCharm, откройте сверху раздел Run -> Edit Configurations и добавьте в окне Environment Variables переменную с именем BOT_TOKEN и значением токена.

Разница между message.answer() и message.reply()

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

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

Сортировка и группировка чатов Telegram: новый клиент AiGram Messenger с Искусственным интеллектом

Чего не хватает в мессенджере Telegram? Больше всего, пожалуй, сортировки и группировки чатов, и хотя многие пользователи давно просят об этом разработчиков приложения, они не торопятся с реализацией данных функций. И если на платформе Android еще можно найти сторонние клиенты хотя бы с сортировкой чатов, то для iOS подобных приложений раньше не было вообще.

Первопроходцами здесь оказались разработчики нового клиента AiGram со встроенным Искусственным интеллектом в виде нейроботов-помощников (мы, кстати, не так давно делали его обзор). В недавнем обновлении приложения появилась функция сортировки и группировки чатов. Просто мечта для тех, кто уже не может отличить каналы от бот-чатов и групп.

Как активировать новые функции? Сортировка чатов включена по умолчанию и делает это автоматически в следующем порядке: «Непрочитанные», «Личные», «Групповые», «Каналы», «Бот-чаты», «Папки», «Все». Реализовано все очень удобно в виде верхней плашки с иконками вкладок. Отдельно стоит отметить удобство вкладки «Непрочитанные»: здесь отображаются все новые сообщения. Одним нажатием можно сделать все непрочитанные чаты прочитанными (кнопка с «глазом»), а ведь иногда это так хочется сделать, чтобы обнулить количество уведомлений от неважных каналов.

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

Мы больше отметили для себя группировку чатов, поскольку весь рабочий процесс редакции ведется в Telegram. Если вы, как и мы, активный пользователь Telegram, точно оцените удобство создания папок с чатами. Можно, например, создать такие папки как «Друзья», «Работа», «Семья» и многие другие. Каждую папку всегда можно отредактировать — изменить название, добавить или удалить чат из нее, а также закрепить сверху внутри вкладки. Правда, нет поиска чатов при добавлении их в папку. Сразу отметим, что функция работает только локально на устройстве, поэтому если вы создадите папки и потом удалите приложение, то при повторной установке приложения папок уже не будет.

В целом мы довольны обновлением AiGram Messenger, ведь получили те функции, которые ждем от Telegram уже пару лет. Приложение работает быстро, дизайн приятный, разработчики не перебрали с кастомизацией. Можно с уверенностью сказать, что это достойная замена Telegram с дополнительными функциями и Искусственным интеллектом.

Название: AiGram Messenger
Издатель/разработчик: OL Corporation LLC
Цена: Бесплатно
Встроенные покупки: Да
Совместимость: для iPhone
Ссылка: Установить

Добро пожаловать!

Перед вами то, что я, Groosha, называю книгой по созданию Telegram-ботов на языке Python с помощью фреймворка aiogram 3.x. Её [книгу] можно воспринимать как учебный материал, обращаясь к отдельным главам по необходимости, но для первого прочтения рекомендую это делать в том порядке, в котором указаны главы слева от этого текста.

Возможно, вы ранее читали первую версию, написанную в 2015-2017 годах для библиотеки pyTelegramBotAPI. С тех пор много чего изменилось как в Python, так и в Bot API, да и я, как программист, стал сильнее. В 2019 году перешёл на aiogram, о чём не жалею, и написал гайд по ботам уже под aiogram, но версии 2.x.

В этой, обновлённой версии книги, мы будем использовать фреймворк aiogram 3.х, который на момент создания этого текста находится в состоянии beta-версии, однако уже вполне готовой для повседневного использования.

Для кого эта книга?
Предполагается, что вы знакомы с программированием в целом и языком Python в частности, знаете, что такое «venv» и «pip», а также способны понять и исправить «детские» ошибки вроде SyntaxError и IndentationError. Найдите в интернете пару курсов по Python, пройдите их, а лишь затем принимайтесь за написание ботов, сэкономите себе время и нервные клетки.

Во всех главах в качестве операционной системы мы будем использовать что-нибудь семейства GNU/Linux, например, Ubuntu, Python 3.9 (в Virtual Environment) и среду разработки PyCharm, впрочем, не возбраняется и Visual Studio Code. При этом пользователи Windows не в пролёте: всё, что касается кода, будет спокойно работать и у вас, а для специфичных вещей вроде systemd вы можете использовать Ubuntu в VirtualBox.

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

Донаты
На написание и актуализацию книги я потратил очень много времени и сил. Если вы из России и хотите отблагодарить автора материально, можете сделать это через Ю.Money (пожалуйста, указывайте в комментариях, что это за книгу).
На всякий случай уточню, что любое пожертвование является добровольным и не даёт никаких преимуществ, кроме плюсика в карму.

Благодарности
За то, что эта книга в её текущем виде возникла и существует по сей день, спасибо создателю aiogram Alex JRootJunior, чатику @aiogram_ru, моему собственному чатику, а также вам, дорогим читателям!

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

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