Материал по переходу на асинхронный python-telegram-bot версия 20.x не будет охватывать все множество изменений, которые произошли в версии 20.x. Здесь будут рассмотрены моменты, которые помогут перевести простой (без наворотов) телеграмм бот на асинхронную версию.
Команда разработчиков подготовила Python скрипт (постоянно дополняется/совершенствуется), призванный облегчить переход с многопоточной версии 13.x на асинхронную версию 20.x. Обратите внимание, что этот скрипт в настоящее время просто выполняет поиск и замену на основе регулярных выражений, беря на себя только часть работы по переходу. Это никоим образом не заменит ручную корректировку кода. В дополнение к сценарию, в кодовой базе рекомендуется использовать языковой интерпретатор (например, pylint ) и средство проверки статического типа (например, mypy ), дабы свести к минимуму время проб и ошибок при переходе.
Структурные изменения.
Общая архитектура.
Класс telegram.ext.Updater больше не является точкой входа в приложение python-telegram-bot , а также был заменен класс telegram.ext.Dispatcher новым классом telegram.ext.Application . Теперь класс Application — это новая точка входа в приложение, которая объединяет все ее компоненты.
Разработка Telegram Bot на Python. (3. Машина состояний)
При инициализации приложения можно настроить множество параметров для отдельных компонентов. Стремясь сделать это воплощение понятным и чистым, команда разработчиков приняла так называемый шаблон построителя. Это означает, что вместо передачи аргументов непосредственно в Application создается построитель с помощью Application.builder() , а затем указываются все необходимые аргументы через этот построитель. Наконец, приложение создается путем вызова builder.build() .
from telegram.ext import Application, CommandHandler . app = Application.builder().token(‘TOKEN’).build() app.add_handler(CommandHandler(‘start’, start_callback)) app.run_polling()
Переход на модуль asyncio .
Самым глубоким структурным изменением является введение в python-telegram-bot модуля asyncio . Модуль asyncio — это библиотека для написания параллельного кода с использованием синтаксиса async / await .
Пакет python-telegram-bot — это библиотека, основной целью которой является взаимодействие с Telegram Bot API через веб-запросы. При выполнении веб-запросов код обычно тратит много времени на ожидание сетевых соединений. А именно ждем ответа от Telegram. То же самое верно для многих так называемых задач ввода-вывода.
Для решения этой проблемы:
- Версия python-telegram-bot 13.x использует модуль threading .
- Версия python-telegram-bot 20.x использует модуль asyncio — это современная альтернатива многопоточности, которая имеет множество преимуществ.
Основные моменты изменения в python-telegram-bot с вводом asyncio :
- Все методы API telegram.Bot теперь являются функциями-сопрограммами, т.е. в коде перед ними должен ставится оператор await .
- Все функции обратных вызовов обработчиков и заданий должны быть функциями-сопрограммы, т. е. в коде перед функциями обратных вызовов должен ставится оператор async , например async def callback(update, context): .
- Аргумент обработчиков run_async был заменен на block , имеющий аналогичный функционал.
- Метод Dispatcher.run_async больше не существует. Близкое к его функциональности, это Application.create_task() .
- Все методы, которые вызывают сопрограммы или выполняют любые задачи, связанные с вводом-выводом, теперь являются функциями-сопрограммами.
Изменения в основном модуле telegram .
- имеет новый аргумент get_updates_request в дополнение к request , и соответствующий экземпляр запроса будет использоваться исключительно для вызова метода Bot.getUpdates .
- Аргумент media метода Bot.edit_message_media теперь является первым позиционным аргументом, как указано Bot API.
- Аргумент url метода Bot.set_webhook теперь требуется, как указано в Bot API.
- Аргумент description метода Bot.set_chat_description теперь является необязательным, как указано в Bot API.
Класс telegram.ChatAction был удален, так как он не является частью официального Bot API. Вместо него нужно использовать telegram.constants.ChatAction .
Регистрируем пользователя бота через ОПРОС | Телеграм
Если у telegram.InlineQuery.answer указаны оба параметра current_offset и auto_pagination , то метод теперь вызывает ValueError , а не TypeError .
Класс telegram.ParseMode был удален, так как он не является частью официального Bot API. Вместо него используйте telegram.constants.ParseMode .
Класс telegram.ReplyMarkup был удален, так как он не является частью официального Bot API.
У класса telegram.EncryptedPassportElement , аргумент hash теперь является вторым позиционным аргументом, как указано в Bot API.
У класса telegram.PassportFile , аргумент file_size теперь является необязательным, как указано в Bot API.
У класса telegram.VideoChat , аргумент users теперь является необязательным, как указано в Bot API.
В версии 20.x был удален метод telegram.InputFile.is_image() .
Ранее некоторые классы, например, telegram.Message , telegram.User , telegram.Chat имели атрибут .bot , который использовался для ссылок, например, Message.reply_text . Этот атрибут был удален. Вместо него используется новый метод TelegramObject.set_bot() , TelegramObject.get_bot() .
Изменения в модуле telegram.ext .
- CallbackContext.from_error имеет новый необязательный аргумент job . Когда внутри обратного вызова ext.Job возникает исключение, то будет передан этот параметр. Соответственно атрибут CallbackContext.job теперь также будет присутствовать в обработчиках ошибок, если ошибка была вызвана ext.Job .
- В версии v20.0 константа CallbackContext.DEFAULT_TYPE удалена. Теперь ее можно найти как ContextTypes.DEFAULT_TYPE .
Модуль telegram.ext.filters был переписан практически с нуля и использует новую политику пространства имен. Изменения примерно такие:
- telegram.ext.Filters больше не существует. Вместо него нужно использовать модуль telegram.ext.filters напрямую. Например, Filters.text нужно заменить на filter.TEXT .
- Встроенные фильтры, которым не нужны аргументы, теперь пишутся в стиле SCREAMING_SNAKE_CASE , например filter.TEXT . Классы фильтров, которым нужны аргументы, теперь пишутся в стиле CamelCase , например filters.User .
- Для тесно связанных фильтров теперь используется класс пространства имен для их группировки. Например, filter.Document нельзя использовать в MessageHandler . Чтобы отфильтровать сообщения с вложенным документом, нужно использовать filter.Document.ALL .
- Кроме того, фильтры больше нельзя вызывать. Чтобы проверить, принимает ли фильтр обновление, используйте новый синтаксис my_filter.check_update(update) .
- Новые аргументы chat_id и user_id : все методы JobQueue.run_* имеют два новых аргумента chat_id и user_id , что позволяет легко связать пользователя/чат с заданием. При указании этих аргументов соответствующий идентификатор будет доступен в обратном вызове задания через context.job.chat_id и context.job.user_id . Кроме того, будут доступны context.job.chat_data и context.job.user_data . Это имеет некоторые тонкие преимущества по сравнению с предыдущим обходным решением job_queue.run_*(. context=context.chat_data) , и вместо этого рекомендуется использовать эту новую функциональность.
- Переименован аргумент context в data : чтобы устранить частую путаницу между context и context.job.context , аргумент context всех методов JobQueue.run_* был переименован в аргумент data . Это также относится к соответствующему атрибуту Job .
- Изменения в методе JobQueue.run_daily() . поведение этого метода согласовано с cron , т. е. 0 — это воскресенье, а 6 — суббота.
- Изменения в методе JobQueue.run_monthly() : аргумент day_is_strict работал некорректно и поэтому был удален. Вместо него теперь можно передать day=’last’ , чтобы задание выполнялось в последний день месяца.
- Убран атрибут Job.job_queue : было удалено, потому что если есть доступ к заданию, то также есть доступ либо непосредственно к JobQueue , либо, по крайней мере, к экземпляру CallbackContext , который уже содержит job_queue .
- Атрибут Job.context был переименован в Job.data .
Класс telegram.ext.ConversationHandler теперь выдает предупреждения о дополнительных обработчиках, которые добавляются в неправильном контексте или вообще не должны быть в обработчике.
В версии 20.0 переименовали базовый класс обработчика Handler в BaseHandler , чтобы подчеркнуть, что этот класс является абстрактным базовым классом.
Теперь единственной целью класса Updater является получение обновлений из Telegram. Теперь он принимает только аргументы bot и update_queue и имеет только эти атрибуты.
Другие существенные изменения.
В версии 20.x был удален модуль telegram.utils . Части этого модуля, которые считаются частью общедоступного API, были перемещены в модули telegram.helpers , telegram.request , telegram.warnings .
В версии 20.x убрали возможность устанавливать пользовательские атрибуты для всех объектов, кроме telegram.ext.CallbackContext . Для хранения данных рекомендовано использовать встроенный механизм хранения данных. Если необходимо добавить к какому-то классу дополнительную функциональность, то необходимо сделать его подклассом.
Начиная с версии 20.0, все аргументы методов бота, которые были добавлены python-telegram-bot , теперь являются только ключевыми аргументами. Самое главное, это касается аргументов *_timeout и api_kwargs .
Ранее класс telegram.utils.request.Request формировал сетевой бэкэнд. Теперь, вместо него есть новый модуль telegram.request , который содержит класс интерфейса BaseRequest , а также реализацию HTTPXRequest этого класса через библиотеку httpx . По умолчанию класс HTTPXRequest используется для серверной части сети. Опытные пользователи могут использовать настраиваемый бэкэнд, реализовав настраиваемый подкласс BaseRequest .
Модуль telegram.error и telegram.constants :
Модуль telegram.constants был переписан с нуля. Константы теперь сгруппированы с помощью перечислений.
Ранее некоторые части telegram.error , telegram.constants были доступны непосредственно через пакет telegram — например:
from telegram import TelegramError
Этот импорт больше не будет работать. Теперь непосредственно через пакет telegram доступны только классы, которые отражают официальный API бота. Константы и ошибки доступны через модули telegram.error или telegram.constants — например:
from telegram.error import TelegramError
Класс telegram.error.Unauthorized был заменен на telegram.error.Forbidden . Более того, telegram.error.Forbidden теперь вызывается только в том случае, если бот пытается выполнить действия, на которые у него недостаточно прав. Если токен бота недействителен, то возбуждается telegram.error.InvalidToken .
Источник: docs-python.ru
Как заставить телеграм бота ждать сообщения от пользователя и записывать его в переменную на питоне?
Всем добрый вечер, я делаю бота в телеграмме, вот код:
В чем идея: когда пользователь вводит команду /concrete , бот должен ждать сообщения от пользователя (номер), его записывать в переменную, а потом выводить информацию с текстового файла с этим номером.
На данном этапе, после ввода этой команды мне выдает ошибку: » command = msg[‘text’]
TypeError: string indices must be integers «. Как это исправить? Как заставить бота ждать новое сообщение от пользователя с номером?
- Вопрос задан более трёх лет назад
- 6697 просмотров
2 комментария
Простой 2 комментария
у тебя в ошибке все написано
msg — строка(а не словарь), индексы у строки могут быть только целые 1, 2, 3, 4 .
planc, Как сделать так, чтобы бот ждал цифру и записывал этот целый индекс в строку?
Решения вопроса 0
Ответы на вопрос 1
сделайте по аналогии
Источник: qna.habr.com
Как ждать ответ от пользователя Aiogram Telegram Bot
У меня есть Телеграм бот на Python на библиотеке Aiogram, которому мне надо написать команду, после которой он будет ждать следующее сообщение от меня. То есть к примеру я пишу боту «Привет», он пишет мне «Введите имя» и после чего бот должен ждать сообщение от меня. Соответственно, я не могу через if проверять сообщение, ведь я не знаю, что напишет пользователь. Так, человек должен попасть в некий цикл, внутри которого не будут реагировать другие команды, он выйдет из него только когда напишет имя. Я пытался создать другой обработчик сообщений внутри основного, но всё тщетно.
Отслеживать
задан 4 авг 2020 в 14:34
Данил Переверзев Данил Переверзев
51 1 1 золотой знак 1 1 серебряный знак 4 4 бронзовых знака
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
У aiogram есть готовая машина состояний и заполняемые формы
Источник: ru.stackoverflow.com