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.
Напишем простой диалоговый 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 и запустить его.
Установка¶
Для начала давайте создадим каталог для бота, организуем там 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.