Pip install aiogram error

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 con...

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)

Содержание

  1. Как установить модуль aiogram на synology?
  2. Installation Guide
  3. Using PIP
  4. Using Pipenv
  5. Using Pacman
  6. From sources
  7. Recommendations
  8. Знакомство с aiogram¶
  9. Установка¶
  10. Первый бот¶
  11. Обработка ошибок¶
  12. Синтаксический сахар¶
  13. Name already in use
  14. 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")

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

Функция 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('Это ответ с "ответом"')

Разница между message.answer() и 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 и значением токена.

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

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

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

Понравилась статья? Поделить с друзьями:
  • Pip fatal error python h no such file or directory
  • Phpmyadmin ошибка incorrect format parameter
  • Pip error exception traceback most recent call last
  • Phpmyadmin ошибка 2002
  • Pip error could not find a version that satisfies the requirement