name: Bug report
about: Cannot install aiogram
Context
Please provide any relevant information about your setup. This is important in case the issue is not reproducible except for under certain conditions.
- Operating System: Ubuntu 16.04.6 LTS
- Python Version: 3.7
- aiogram version:
- aiohttp version:
- uvloop version (if installed):
Behavior
~/aiogram$ sudo python3.7 setup.py install
…
Traceback (most recent call last):
File «setup.py», line 84, in
include_package_data=False,
File «/usr/lib/python3.7/distutils/core.py», line 148, in setup
dist.run_commands()
File «/usr/lib/python3.7/distutils/dist.py», line 966, in run_commands
self.run_command(cmd)
File «/usr/lib/python3.7/distutils/dist.py», line 985, in run_command
cmd_obj.run()
File «/usr/lib/python3/dist-packages/setuptools/command/install.py», line 67, in run
self.do_egg_install()
File «/usr/lib/python3/dist-packages/setuptools/command/install.py», line 109, in do_egg_install
self.run_command(‘bdist_egg’)
File «/usr/lib/python3.7/distutils/cmd.py», line 313, in run_command
self.distribution.run_command(command)
File «/usr/lib/python3.7/distutils/dist.py», line 985, in run_command
cmd_obj.run()
File «/usr/lib/python3/dist-packages/setuptools/command/bdist_egg.py», line 209, in run
os.path.join(archive_root, ‘EGG-INFO’), self.zip_safe()
File «/usr/lib/python3/dist-packages/setuptools/command/bdist_egg.py», line 245, in zip_safe
return analyze_egg(self.bdist_dir, self.stubs)
File «/usr/lib/python3/dist-packages/setuptools/command/bdist_egg.py», line 355, in analyze_egg
safe = scan_module(egg_dir, base, name, stubs) and safe
File «/usr/lib/python3/dist-packages/setuptools/command/bdist_egg.py», line 392, in scan_module
code = marshal.load(f)
ValueError: bad marshal data (unknown type code)
—————————
~/aiogram$ pip3 install aiogram
Collecting aiohttp>=3.4.4 (from aiogram)
Could not find a version that satisfies the requirement aiohttp>=3.4.4 (from aiogram) (from versions: 0.1, 0.2, 0.3, 0.4, 0.4.1, 0.4.2, 0.4.3, 0.4.4, 0.5.0, 0.6.0, 0.6.1, 0.6.2, 0.6.3, 0.6.4, 0.6.5, 0.7.0, 0.7.1, 0.7.2, 0.7.3, 0.8.0, 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.9.0, 0.9.1, 0.9.2, 0.9.3, 0.10.0, 0.10.1, 0.10.2, 0.11.0, 0.12.0, 0.13.0, 0.13.1, 0.14.0, 0.14.1, 0.14.2, 0.14.3, 0.14.4, 0.15.0, 0.15.1, 0.15.2, 0.15.3, 0.16.0, 0.16.1, 0.16.2, 0.16.3, 0.16.4, 0.16.5, 0.16.6, 0.17.0, 0.17.1, 0.17.2, 0.17.3, 0.17.4, 0.18.0, 0.18.1, 0.18.2, 0.18.3, 0.18.4, 0.19.0, 0.20.0, 0.20.1, 0.20.2, 0.21.0, 0.21.1, 0.21.2, 0.21.4, 0.21.5, 0.21.6, 0.22.0a0, 0.22.0b0, 0.22.0b1, 0.22.0b2, 0.22.0b3, 0.22.0b4, 0.22.0b5, 0.22.0b6, 0.22.0, 0.22.1, 0.22.2, 0.22.3, 0.22.4, 0.22.5, 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.5, 1.1.0, 1.1.1, 1.1.2, 1.1.3, 1.1.4, 1.1.5, 1.1.6, 1.2.0, 1.3.0, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.3.5, 2.0.0rc1, 2.0.0, 2.0.1, 2.0.2, 2.0.3, 2.0.4, 2.0.5, 2.0.6, 2.0.6.post1, 2.0.7, 2.1.0, 2.2.0, 2.2.1, 2.2.2, 2.2.3, 2.2.4, 2.2.5, 2.3.0a1, 2.3.0a2, 2.3.0a4, 2.3.0, 2.3.1a1, 2.3.1, 2.3.2b2, 2.3.2b3, 2.3.2, 2.3.3, 2.3.4, 2.3.5, 2.3.6, 2.3.7, 2.3.8, 2.3.9, 2.3.10, 3.0.0b0)
No matching distribution found for aiohttp>=3.4.4 (from aiogram)
Содержание
- Как установить модуль aiogram на synology?
- Installation Guide
- Using PIP
- Using Pipenv
- Using Pacman
- From sources
- Recommendations
- Знакомство с aiogram¶
- Установка¶
- Первый бот¶
- Обработка ошибок¶
- Синтаксический сахар¶
- Name already in use
- aiogram / docs / source / install.rst
Как установить модуль aiogram на synology?
Всем привет помогите установить aiogram на synology
Пытался установить через python3 -m pip install aiogram
выдает ошибку что на скрине.
Kог установки из консоли
- Вопрос задан более года назад
- 432 просмотра
Средний 1 комментарий
Хочу подтвердить и немного дополнить ответ Алан Гибизов — не стоит пытаться собрать в synology ничего серьезного. Если чего-то нет в Entware/Optware — лучше забыть-понять-простить, чем пытаться сгородить потемкинскую деревню.
Дело в том, что synology можно назвать линухом только по утиной типизации — в нем ядро линукс, в нем /etc и /bin — значит — это линукс.
Это нечто, похожее на линкус. Да, в него ставятся пакеты entware/optware. Да, в нем можно собрать несложный пакет типа nrpe или nagios-plugins. Но попробуйте-ка собрать в нем нечто глобальное — типа самбы — 9 из 10, что дело кончится принудительным форматированием винтов в другом компе и переустановкой DSM.
Потому что synology не предназначена для задач, которые не решаются пакетами, устанавливаемыми через DSM. Установить питон например, нормальный питон, а не то жуткое уIOBище, что стоит по умолчанию, получилось только с третьего захода и то с помощью «пилы, топора и какой-то матери».
Все установленные пакеты от synology тут поизрезаны по самое не хочу. Это относится и к sssd, и к samba и еще Бог знает к чему (что я не проверял). То, что в линухе решается с пол-пинка, например доменная аутентификация по группам в FTP-сервере — здесь выливается в нечто слоноподобное, которое просто роняет систему.
Synology — это полка. Просто полка для хранения данных. Не надо тянуть ее на глобус 🙂
Источник
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.
The following will get you aiohttp along with cchardet , aiodns and brotlipy in one bundle.
Installation:
In addition, you don’t need do anything, aiogram automatically starts using that if it is found in your environment.
© Copyright 2022, Illemius / Alex Root Junior. Revision 6e70371c .
Источник
Знакомство с 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. Напрямую вызвать метод регистрации у диспетчера.
Рассмотрим следующий код:
Давайте запустим с ним бота:
Функция 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 :
Более того, для большинства типов сообщений есть вспомогательные методы вида «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 и значением токена.
Запустите снова бота и убедитесь, что он работает. Получившийся код можно смело сохранять в PyCharm в File Templates.
На этом мы закончим знакомство с библиотекой, а в следующих главах рассмотрим другие «фишки» aiogram и Telegram Bot API.
Источник
Name already in use
aiogram / docs / source / install.rst
- Go to file T
- Go to line L
- Copy path
- Copy permalink
Copy raw contents
Copy raw contents
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:
Or if you want to install stable version (The same with version from PyPi):
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 with cchardet , aiodns and brotlipy in one bundle.
Installation:
In addition, you don’t need do anything, aiogram automatically starts using that if it is found in your environment.
Источник
Hello! Problem in the title.
(Bot) C: pycharmProjects Bot & GT; Pip Install -u Aiogram
Collecting Aiogram
USING CACHED AIOGRAM-2.10.1-PY3-NONE-ANY.WHL (163 KB)
Requirement Already Satisfied, Skipping Upgrade: Certifi & GT; = 2019.3.9 In C: Python Bot Lib Site-Packages (From Aiogram) (2020.6.20)
Processing C: Users GROB AppData Local Pip Cache Wheels B6 9C BD 6B99BC6EC9DAB11F3756D31FB8506D3ECF07AEA58B6201F539 Aiohttp-3.6.3-PY3-NONE-ANY.WHL
Collecting Babel & GT; = 2.6.0
USING CACHED BABEL-2.8.0-PY2.PY3-NONE-ANY.WHL (8.6 MB)
Requirement Already Satisfied, Skipping Upgrade: Chardet & lt; 4.0, & gt; = 2.0 in C: Python Bot lib Site-Packages (from Aiohttp & lt; 4.0.0, & gt; = 3.5.4- & gt; aiogram) (3.0. 4
)
Collecting Yarl & Lt; 1.6.0, & gt; = 1.0
Using Cached Yarl-1.5.1.tar.gz (173 Kb)
Installing Build Dependencies ... Done
Getting Requirements to Build Wheel ... Done
Preparing Wheel Metadata ... Done
Collecting MultiDict & LT; 5.0, & GT; = 4.5
Using Cached MultiDict-4.7.6.tar.gz (50 KB)
Installing Build Dependencies ... Done
Getting Requirements to Build Wheel ... Done
Preparing Wheel Metadata ... Done
Collecting Async-Timeout & LT; 4.0, & gt; = 3.0
Using Cached Async_Timeout-3.0.1-Py3-none-Any.whl (8.2 Kb)
Collecting ATTRS & GT; = 17.3.0
USING CACHED ATTRS-20.2.0-PY2.PY3-NONE-ANY.WHL (48 KB)
Collecting Pytz & GT; = 2015.7
USING CACHED PYTZ-2020.1-PY2.PY3-NONE-ANY.WHL (510 KB)
REQUIEMENT ALREADY SATISFIED, SKIPPING UPGRADE: IDNA & GT; = 2.0 in C: Python Bot Lib Site-Packages (from Yarl & LT; 1.6.0, & gt; = 1.0- & gt; Aiohttp & lt; 4.0.0, & gt; = 3.5. 4- & gt; aiogr
AM) (2.10)
Building Wheels for Collected Packages: Yarl, Multidict
Building Wheel for Yarl (PEP 517) ... error
Error: Command Erroored Out with Exit Status 1:
Command: 'C: Python Bot scripts python.exe' 'C: Python Bot Lib Site-Packages Pip _Vendor Pep517 _in_process.py' Build_Wheel 'C: Users GROB APPD
ATA Local Temp TMPKK7EFGAJ '
CWD: C: Users GROB APPDATA Local Temp Pip-Install-Fvphy8bh Yarl
COMPLETE OUTPUT (35 LINES):
**********************
* AccelleRated Build *
**********************
Running BDIST_WHEEL
Running Build
Running Build_py.
Creating Build
Creating Build Lib.Win-AMD64-3.9
Creating Build Lib.Win-AMD64-3.9 YARL
Copying Yarl _Quoting.py - & gt; Build Lib.win-AMD64-3.9 YARL
Copying Yarl _quoting_py.py - & gt; Build Lib.win-AMD64-3.9 YARL
Copying Yarl _URL.PY - & gt; Build Lib.win-AMD64-3.9 YARL
Copying Yarl __ init__.py - & gt; Build Lib.win-AMD64-3.9 YARL
Running Egg_info.
Writing Yarl.egg-info pkg-info
Writing Dependency_Links to Yarl.egg-info dependency_links.txt
Writing Requirements To Yarl.egg-Info Requires.txt
Writing Top-Level Names to Yarl.egg-info top_level.txt
Reading Manifest File 'Yarl.egg-Info Sources.txt'
READING MANIFEST TEMPLATE 'MANIFEST.IN'
Warning: No Previously-Included Files Matching '* .pyc' Found Anywhere in Distribution
Warning: No Previously-Included Files Matching '* .cache' Found Anywhere in Distribution
Warning: No Previously-Included Files Found Matching 'Yarl *. HTML'
Warning: No Previously-Included Files Found Matching 'Yarl *. So'
Warning: No Previously-Included Files Found Matching 'Yarl *. Pyd'
NO Previously-Included Directories Found Matching 'Docs _Build'
Writing Manifest File 'Yarl.egg-Info Sources.txt'
Copying Yarl __ init __. Pyi - & gt; Build Lib.win-AMD64-3.9 YARL
Copying Yarl _quoting_c.c - & gt; Build Lib.win-AMD64-3.9 YARL
Copying yarl _quoting_c.pyi - & gt; Build Lib.win-AMD64-3.9 YARL
Copying Yarl _quoting_c.pyx - & gt; Build Lib.win-AMD64-3.9 YARL
Copying Yarl Py.Typed - & gt; Build Lib.win-AMD64-3.9 YARL
Running Build_EXT.
Building 'yarl._quoting_c' extension
Error: Microsoft Visual C++ 14.0 or Greater Is Required. Get it WITH "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-
BUILD-TOOLS /
------------------------------------------
Error: Failed Building Wheel for Yarl
Building Wheel for Multidict (PEP 517) ... error
Error: Command Erroored Out with Exit Status 1:
Command: 'C: Python Bot scripts python.exe' 'C: Python Bot Lib Site-Packages Pip _Vendor Pep517 _in_process.py' Build_Wheel 'C: Users GROB APPD
ATA LOCAL TEMP TMPHTV9219G '
CWD: C: Users GROB APPDATA LOCAL TEMP PIP-Install-Fvphy8bh Multidict
COMPLETE OUTPUT (40 Lines):
**********************
* AccelleRated Build *
**********************
Running BDIST_WHEEL
Running Build
Running Build_py.
Creating Build
Creating Build Lib.Win-AMD64-3.9
Creating Build Lib.Win-AMD64-3.9 Multidict
Copying Multidict _abc.py - & gt; Build lib.win-AMD64-3.9 Multidict
Copying MultiCt _compat.py - & gt; Build lib.win-AMD64-3.9 Multidict
Copying Multidict _multidict_base.py - & gt; Build lib.win-AMD64-3.9 Multidict
Copying Multidict _multidict_py.py - & gt; Build lib.win-AMD64-3.9 Multidict
Copying Multidict __ init__.py - & gt; Build lib.win-AMD64-3.9 Multidict
Running Egg_info.
Writing Multidict.egg-info pkg-info
Writing Dependency_Links to Multidict.egg-info dependency_links.txt
Writing Top-Level Names to Multidict.egg-info top_level.txt
Reading Manifest File 'Multidict.egg-info Sources.txt'
READING MANIFEST TEMPLATE 'MANIFEST.IN'
Warning: No Previously-Included Files Matching '* .pyc' Found Anywhere in Distribution
Warning: No Previously-Included Files Found Matching 'Multidict _multidict.html'
Warning: No Previously-Included Files Found Matching 'Multidict *. So'
Warning: No Previously-Included Files Found Matching 'Multidict *. Pyd'
Warning: No Previously-Included Files Found Matching 'Multidict *. Pyd'
NO Previously-Included Directories Found Matching 'Docs _Build'
Writing Manifest File 'Multidict.egg-Info Sources.txt'
Copying Multidict __ init __. Pyi - & gt; Build lib.win-AMD64-3.9 Multidict
Copying Multidict _multidict.c - & gt; Build lib.win-AMD64-3.9 Multidict
Copying Multidict Py.Typed - & gt; Build lib.win-AMD64-3.9 Multidict
Creating Build Lib.Win-AMD64-3.9 Multidict _multilib
Copying MultiDict _multilib Defs.h - & gt; Build Lib.win-AMD64-3.9 Multidict _multilib
Copying MultiCt _multilib Dict.h - & gt; Build Lib.win-AMD64-3.9 Multidict _multilib
Copying Multidict _multilib Istr.h - & gt; Build Lib.win-AMD64-3.9 Multidict _multilib
Copying MultiCt _multilib Iter.h - & gt; Build Lib.win-AMD64-3.9 Multidict _multilib
Copying MultiDict _multilib pair_list.h - & gt; Build Lib.win-AMD64-3.9 Multidict _multilib
Copying MultiDict _multilib Views.h - & gt; Build Lib.win-AMD64-3.9 Multidict _multilib
Running Build_EXT.
Building 'MultiCt._multidict' Extension
Error: Microsoft Visual C++ 14.0 or Greater Is Required. Get it WITH "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-
BUILD-TOOLS /
------------------------------------------
Error: Failed Building Wheel for Multidict
FAILED TO BUILD YARL MULTITICT
ERROR: COULD NOT BUILD WHICH USE PEP 517 AND CANNOT BE INSTALLED DIRECTLY
Installing Microsoft Visual C++ does not help, run the installation directly there in the terminal and the same error. Someone have options for solving this problem?
p.s. When choosing an interpriter Python version 3.7 No problem.
Answer 1
Try to put libraries:
pip install -u yarl == 1.4.2
Pip Install Wheel
helped me with Python version 3.8.6.
Установка¶
Для начала давайте создадим каталог для бота, организуем там virtual environment (далее venv) и
установим библиотеку aiogram.
Проверим, что установлен Python версии 3.7 (если вы знаете, что установлен 3.8 и выше, можете пропустить этот кусок):
[groosha@main lesson_01]$ python3.7
Python 3.7.6 (default, Apr 27 2020, 00:17:38)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
[groosha@main lesson_01]$
Теперь создадим файл requirements.txt
, в котором укажем используемую нами версию aiogram.
О версиях aiogram
В этой главе используется aiogram версии 2.9.2, но перед началом работы рекомендую заглянуть в
канал релизов библиотеки и проверить наличие более новой версии. Подойдёт любая
более новая, начинающаяся с цифры 2, поскольку в будущем ожидается релиз aiogram 3.0 с заметными изменениями
и без обратной совместимости.
Чтобы избежать неприятностей, зафиксируемся на 2.9.2 и далее будем обновляться вручную.
[groosha@main lesson_01]$ python3.7 -m venv venv
[groosha@main lesson_01]$ echo "aiogram==2.9.2" > requirements.txt
[groosha@main lesson_01]$ source venv/bin/activate
(venv) [groosha@main lesson_01]$ pip install -r requirements.txt
# ...здесь куча строк про установку...
Successfully installed Babel-2.8.0 aiogram-2.9.2 aiohttp-3.6.2 async-timeout-3.0.1 attrs-19.3.0 certifi-2020.6.20 chardet-3.0.4 idna-2.10 multidict-4.7.6 pytz-2020.1 typing-extensions-3.7.4.2 yarl-1.5.1
WARNING: You are using pip version 19.2.3, however version 20.2.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
(venv) [groosha@main lesson_01]$
Обратите внимание на префикс «venv» в терминале. Он указывает, что мы находимся в виртуальном окружении с именем «venv».
Проверим, что внутри venv вызов команды python
указывает на всё тот же Python 3.7:
(venv) [groosha@main lesson_01]$ python
Python 3.7.6 (default, Apr 27 2020, 00:17:38)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
(venv) [groosha@main lesson_01]$ deactivate
[groosha@main lesson_01]$
Последней командой deactivate
мы вышли из venv, чтобы он нам не мешал.
Первый бот¶
Давайте создадим файл bot.py
с базовым шаблоном бота на aiogram:
#!venv/bin/python
import logging
from aiogram import Bot, Dispatcher, executor, types
# Объект бота
bot = Bot(token="12345678:AaBbCcDdEeFfGgHh")
# Диспетчер для бота
dp = Dispatcher(bot)
# Включаем логирование, чтобы не пропустить важные сообщения
logging.basicConfig(level=logging.INFO)
# Хэндлер на команду /test1
@dp.message_handler(commands="test1")
async def cmd_test1(message: types.Message):
await message.reply("Test 1")
if __name__ == "__main__":
# Запуск бота
executor.start_polling(dp, skip_updates=True)
Первое, на что нужно обратить внимание: aiogram — асинхронная библиотека, поэтому ваши функции тоже должны быть асинхронными,
а перед вызовами методов API нужно ставить ключевое слово await, т.к. эти вызовы возвращают корутины.
Асинхронное программирование в Python
Не стоит пренебрегать официальной документацией!
Прекрасный туториал по asyncio доступен на сайте Python.
Если вы в прошлом работали с какой-то другой библиотекой для Telegram, например, pyTelegramBotAPI, то концепция
хэндлеров (обработчиков событий) вам сразу станет понятна, разница лишь в том, что в aiogram хэндлерами управляет диспетчер.
Диспетчер регистрирует функции-обработчики, дополнительно ограничивая перечень вызывающих их событий через фильтры.
После получения очередного апдейта (события от Telegram), диспетчер выберет нужную функцию обработки, подходящую по всем
фильтрам, например, «обработка сообщений, являющихся изображениями, в чате с ID икс и с длиной подписи игрек». Если две
функции имеют одинаковые по логике фильтры, то будет вызвана та, что зарегистрирована раньше.
Чтобы зарегистрировать функцию как обработчик сообщений, нужно сделать одно из двух действий:
1. Навесить на неё декоратор, как в примере выше.
С различными типами декораторов мы познакомимся позднее.
2. Напрямую вызвать метод регистрации у диспетчера.
Рассмотрим следующий код:
# Хэндлер на команду /test1
@dp.message_handler(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")
# Где-то в другом месте...
dp.register_message_handler(cmd_test2, commands="test2")
Снова запустим бота:
Обработка ошибок¶
При работе бота неизбежно возникновение различных ошибок, связанных не с кодом, а с внешними событиями. Простейший пример:
попытка отправить сообщение пользователю, заблокировавшему бота. Чтобы не оборачивать каждый вызов в try..except
,
в aiogram существует специальный хэндлер для исключений, связанных с Bot API.
Рассмотрим следующий пример кода, имитирующий задержку перед ответом пользователю:
@dp.message_handler(commands="block")
async def cmd_block(message: types.Message):
await asyncio.sleep(10.0) # Здоровый сон на 10 секунд
await message.reply("Вы заблокированы")
За эти 10 секунд пользователь может успеть заблокировать бота со своей стороны и попытка вызвать метод reply
приведёт
к появлению исключения BotBlocked
. Напишем специальный хэндлер для этого исключения:
from aiogram.utils.exceptions import BotBlocked
@dp.errors_handler(exception=BotBlocked)
async def error_bot_blocked(update: types.Update, exception: BotBlocked):
# Update: объект события от Telegram. Exception: объект исключения
# Здесь можно как-то обработать блокировку, например, удалить пользователя из БД
print(f"Меня заблокировал пользователь!nСообщение: {update}nОшибка: {exception}")
# Такой хэндлер должен всегда возвращать True,
# если дальнейшая обработка не требуется.
return True
Аналогично пишутся обработчики и на другие исключения. Таким образом, если одна и та же непредвиденная ситуация может
возникнуть в различных хэндлерах, то можно вынести её обработку в отдельный хэндлер ошибок. Кода будет меньше, а оставшийся
станет читабельнее.
Важно
У errors_handler есть одна особенность, из-за которой его использование может быть нежелательно. Дело в том, что
после срабатывания и завершения хэндлера, управление в исходную функцию не возвращается. Проще говоря, если,
например, 57-я итерация цикла из 100 привела к срабатыванию errors_handler, остальные итерации выполнены не будут,
как и весь остальной код исходной функции. В этом случае ничего не остаётся, кроме как использовать try..except
.
Синтаксический сахар¶
Для того, чтобы сделать код чище и читабельнее, aiogram расширяет возможности стандартных объектов Telegram.
Например, вместо bot.send_message(...)
можно написать message.answer(...)
или message.reply(...)
. В последних
двух случаях не нужно подставлять chat_id
, подразумевается, что он такой же, как и в исходном сообщении.
Разница между answer
и reply
простая: первый метод просто отправляет сообщение в тот же чат, второй делает «ответ» на
сообщение из message
:
@dp.message_handler(commands="answer")
async def cmd_answer(message: types.Message):
await message.answer("Это простой ответ")
@dp.message_handler(commands="reply")
async def cmd_reply(message: types.Message):
await message.reply('Это ответ с "ответом"')
Более того, для большинства типов сообщений есть вспомогательные методы вида
«answer_{type}» или «reply_{type}», например:
@dp.message_handler(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) может быть
недоступен в области видимости конкретной функции. К счастью, объект бота доступен во всех типах апдейтов: Message,
CallbackQuery, InlineQuery и т.д. Предположим, вы хотите по команде /dice
отправлять кубик не в тот же чат, а в канал
с ID -100123456789. Перепишем предыдущую функцию:
@dp.message_handler(commands="dice")
async def cmd_dice(message: types.Message):
await message.bot.send_dice(-100123456789, emoji="🎲")
Всё хорошо, но если вдруг вы захотите поделиться с кем-то кодом, то придётся каждый раз помнить об удалении
из исходников токена бота, иначе придётся его перевыпускать у @BotFather. Чтобы обезопасить себя,
давайте перестанем указывать токен прямо в коде, а вынесем его как переменную окружения.
Замените следующие строчки из начала файла:
import logging
from aiogram import Bot, Dispatcher, executor, types
bot = Bot(token="12345678:AaBbCcDdEeFfGgHh")
на эти:
import logging
from aiogram import Bot, Dispatcher, executor, types
from os import getenv
from sys import exit
bot_token = getenv("BOT_TOKEN")
if not bot_token:
exit("Error: no token provided")
bot = Bot(token=bot_token)
Но теперь ваш бот не запустится, т.к. будет сразу завершаться с ошибкой Error: no token provided
.
Чтобы передать переменную окружения в PyCharm, откройте сверху раздел Run -> Edit Configurations
и добавьте в окне Environment Variables переменную с именем BOT_TOKEN и значением токена.
Запустите снова бота и убедитесь, что он работает. Получившийся код можно смело сохранять в
PyCharm в File Templates.
На этом мы закончим знакомство с библиотекой, а в следующих главах рассмотрим другие «фишки» aiogram и Telegram Bot API.