Pip install aiogram ошибка

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.

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

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

  1. Настройка
  2. Hello, bot!
  3. Docker
  4. Деплой на AWS
  5. Заключение

Настройка

Откройте 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 выглядит достаточно просто:

  1. Локально или с помощью пайплайнов собрали контейнер.
  2. Загрузили его на докер хаб.
  3. В любом удобном месте скачали его. Это может быть локальная машина, VPS сервер или облачный провайдер по типу AWS.
  4. Запустили.

Пройдёмся по этим шагам. Везде, где указано <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, и создаём новое приложение:

Elastic Beanstalk вкладка Applications

  • Называем приложение, теги оставляем пустыми:

Называем приложение в Elastic Beanstalk

  • Создаём для приложения environment:

environment для будущего Telegram-бота

  • Выбираем Worker environment:

Worker environment для будущего Telegram-бота

  • В качестве платформы выбираем Docker:

Docker для Telegram-бота на Python

  • В пункте Application code нужно загрузить JSON-файл с конфигурацией Docker-образа. Сам файл:
Dockerrun.aws.json
{
 "AWSEBDockerrunVersion": "1",
 "Image": {
   "Name": "<docker_hub_username>/my_app",
   "Update": "true"
 },
"Ports": [
 {
   "ContainerPort": 5000,
   "HostPort": 8000
 }
]
}

Application code

  • Создаём окружение:

Создаём окружение

  • AWS начинает создавать окружение, просто ждём завершения процесса:

AWS начинает создавать окружение

  • Если всё прошло успешно, вы увидите индикатор успешного запуска приложения:

Docker для Телеграм бота

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

Проверка Телеграм бота

Успех!

Заключение

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

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

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

  1. Классическая RelpyKeyboardMarkup, у которой кнопки располагаются под полем ввода сообщения:
    RelpyKeyboardMarkup
  2. Более современная InlineKeyboardMarkup, которая привязывается к конкретному сообщению:
    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")

Давайте запустим с ним бота:
Команда /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