Внимание! Пакеты
python-telegram-botверсии 13.x будут придерживаться многопоточной парадигмы программирования (*на данный момент актуальна версия 13.15). Пакеты версий 20.x и новее предоставляют чистый асинхронный Python интерфейс для Telegram Bot API. Дополнительно смотрите основные изменения в пакетеpython-telegram-botверсии 20.x.
В этом материале рассмотрены встроенные фильтры в пакет python-telegram-bot версии 13.x, а так же описаны расширенные варианты использования фильтров, которые используют обработчики MessageHandler, а также с CommandHandler и PrefixHandler модуля расширения telegram.ext.
ВНИМАНИЕ Для
python-telegram-botверсии 20.x, модуль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).
telegram.ext.Filters;Filters.animation сообщения с анимацией;Filters.audio сообщения с аудиофайлом;Filters.caption сообщения с подписью;Filters.caption_entity особая сущность в подписи;Filters.caption_regex фильтр подписи по регулярному выражению;Filters.chat сообщения, от определенных chat_id или именем чатов;Filters.chat_type сообщения, с определенным типом чата;Filters.command сообщения, с командой бота;Filters.contact сообщения, с телефонным контактом;Filters.dice сообщения игрального кубика;Filters.document сообщения, содержащие документ/файл;Filters.entity сообщения в виде особых сущностей;Filters.forwarded пересылаемые сообщения;Filters.game сообщения, с игрой;Filters.invoice сообщения, с информацией о счете;Filters.language сообщения с определенным языковым кодом;Filters.location сообщения, с точкой на карте;Filters.passport_data сообщения, с информацией о данных пользователя;Filters.photo сообщения, с миниатюрой файла/стикера;Filters.poll сообщения, с информацией об опросе;Filters.regex фильтр сообщений по шаблону регулярного выражения;Filters.reply сообщения, с ответом на другое сообщение;Filters.sender_chat сообщения, отправленные от определенных chat_id;Filters.status_update сообщения, содержащие обновление статуса;Filters.sticker сообщения, представляющий собой стикер;Filters.successful_payment сообщения, с информацией об успешном платеже;Filters.text все текстовые сообщения;Filters.update сообщения, с определенным обновлением;Filters.user сообщения пользователей с определенным user_id;Filters.via_bot сообщения c указанными идентификаторами;Filters.venue сообщения с местом проведения;Filters.video сообщения с видео;Filters.video_note сообщения с видео заметкой;Filters.voice сообщения с голосовым сообщением;CallbackContext.telegram.ext.filters.Встроенные фильтры используются в обработчике MessageHandler(filters, callback) в качестве аргумента filters.
Импорт модуля производится следующим образом:
from telegram.ext import Filters # пример для фильтрации всех видео-сообщений. MessageHandler(Filters.video, callback_method) # пример для фильтрации всех контактов MessageHandler(Filters.contact, callback_method) # пример для версии 20.x from telegram.ext import filters # пример для фильтрации всех видео-сообщений. MessageHandler(filters.VIDEO, callback_method) # пример для фильтрации всех контактов MessageHandler(filters.CONTACT, callback_method)
Filters.animation:Фильтр Filters.animation определяет сообщения, содержащие объект telegram.Animation, который представляет собой файл анимации (видео в формате GIF или H.264/MPEG-4 AVC без звука).
Filters.audio:Фильтр Filters.audio определяет сообщения, содержащие объект telegram.Audio - аудиофайл, который клиенты Telegram будут рассматривать как музыку.
Filters.caption(capt):Фильтр Filters.caption определяет сообщения с подписью. Если передается список строк, он фильтрует сообщения, чьи заголовки capt появляются в данном списке.
Необязательный аргумент capt - это список или кортеж строк, определяющий, какие подписи необходимо разрешать. Допускаются только точные совпадения. Если не указано, то будет разрешать любые сообщения, имеющие подпись.
Пример: MessageHandler(Filters.caption, callback_method)
Filters.caption_entity(entity_type):Фильтр Filters.caption_entity() определяет только сообщения, подпись которых имеет особую сущность telegram.MessageEntity, где её тип совпадает с entity_type. Объект telegram.MessageEntity представляет собой хэштеги, имена пользователей, URL-адреса и т. д.
Аргумент entity_type это тип объекта заголовка для проверки. Все типы можно найти как константы в telegram.constants.MESSAGEENTITY_ALL_TYPES.
>>> import telegram >>> telegram.constants.MESSAGEENTITY_ALL_TYPES # ['mention', 'hashtag', 'cashtag', 'phone_number', # 'bot_command', 'url', 'email', 'bold', 'italic', 'code', # 'pre', 'text_link', 'text_mention', 'underline', 'strikethrough']
Пример: MessageHandler(Filters.caption_entity("hashtag"), callback_method)
Filters.caption_regex(pattern):Фильтр Filters.caption_regex() определяет сообщения путем поиска вхождения шаблона pattern в подписи к сообщению.
Этот фильтр работает аналогично Filters.regex, за исключением того, что он применяется к заголовку сообщения, а не к тексту.
Фильтр Filters.caption_regex() не будет работать с простыми текстовыми сообщениями, а только с медиафайлами с подписями.
Пример: MessageHandler(Filters.photo & Filters.caption_regex(r'help'), callback) для захвата всех фотографий с подписью, содержащей слово "help".
Filters.chat(chat_id=None, username=None, allow_empty=False):Фильтр Filters.chat(), определяет сообщения, c указанными идентификаторами чата chat_id или username чата.
chat_id - какой идентификатор(ы) чата разрешить (принимает целое число или список целых чисел).username какое имя пользователя(ей) разрешить. Ведущий символ '@' в именах пользователей будут отброшены (принимает строку или список строк).allow_empty - следует ли обрабатывать сообщения, если в chat_id и именах пользователей не указан чат. По умолчанию установлено значение FalseЕсли одновременно присутствуют и chat_id и username, то возникает исключение RuntimeError.
Пример: MessageHandler(Filters.chat(-1234), callback_method)
Фильтр Filters.chat() имеет следующие атрибуты и методы:
chat_ids - set(int), какие идентификаторы чата разрешить.usernames - set(str), какие имена пользователей (без символа @) разрешить.allow_empty - bool, следует ли обрабатывать сообщения, если в chat_ids и usernames не указан чат.add_chat_ids(chat_id) - добавляет один или несколько чатов chat_id к разрешенным идентификаторам чатов.add_usernames(username) - добавляет один или несколько пользователей username к разрешенным именам пользователей.remove_chat_ids(chat_id) - удаляет один или несколько чатов chat_id из разрешенных идентификаторов чатов.remove_usernames(username) - удаляет один или несколько пользователей username из разрешенных имен пользователей.Filters.chat_type:Фильтр Filters.chat_type является подмножеством для фильтрации типа чата.
Filters.chat_type имеет следующие атрибуты:
channel - сообщения из канала.group - сообщения из группы.supergroup - сообщения от супергруппы.groups - сообщения из группы или супергруппы.private - сообщения, отправлены в приватном чате.Filters.command(update=True):Фильтр Filters.command() определяет сообщения, начинающиеся с команды бота.
По умолчанию разрешены только сообщения, начинающиеся с команды бота. Передайте необязательному аргументу update значение False, чтобы также разрешить сообщения, содержащие команду бота в любом месте текста.
Пример:
# команда в начале сообщения MessageHandler(Filters.command, command_at_start_callback) # команда встречается в тексте сообщения MessageHandler(Filters.command(False), command_anywhere_callback)
Обратите внимание, что фильтр Filters.text также принимает сообщения, содержащие команду.
Filters.contact:Фильтр Filters.contact определяет сообщения с объектом telegram.Contact - переданным телефонным контактом.
Filters.dice(n):Фильтр Filters.dice() определяет сообщения игрального кубика/кости. Если передается целое число n или список целых чисел, он фильтрует сообщения, чье значение кубика появляется в данном списке.
Примеры:
# Чтобы разрешить любое сообщение `dice`, просто используйте MessageHandler(Filters.dice, callback_method) # Чтобы разрешить только кости со значением 6, используйте MessageHandler(Filters.dice(6), callback_method). # Чтобы разрешить только кости со значением 5 или 6, используйте MessageHandler(Filters.dice([5, 6]), callback_method).
Фильтр Filters.dice в сообщениях не поддерживает текст. Если необходимо фильтровать текстовые сообщения или сообщения в виде игрального кубика/кости, то нужно использовать комбинацию фильтров Filters.text | Filters.dice.
Filters.document:Фильтр Filters.document представляет собой подмножество сообщений, содержащих документ/файл.
Используйте такие фильтры, как: Filters.document.mp3, Filters.document.mime_type("text/plain") и т. д. Или используйте только Filters.document для всех сообщений, которые содержат какой либо документ/файл.
Фильтр Filters.document имеет следующие атрибуты:
category - фильтрует документы по их категории в атрибуте mime-type.
application - то же самое, что Filters.document.category("application").
audio - то же самое, что Filters.document.category("audio").
image - то же самое, что Filters.document.category("image").
video - то же самое, что Filters.document.category("video").
text - то же самое, что Filters.document.category("text").
mime_type - фильтрует документы по их атрибуту mime-type. Пример: Filters.document.mime_type('audio/mpeg') - фильтрует все аудио в формате mp3.
apk - то же самое, что Filters.document.mime_type("application/vnd.android.package-archive").
doc - то же самое, что Filters.document.mime_type("application/msword").
docx - то же самое, что Filters.document.mime_type("application/vnd.openxmlformats-officedocument.wordprocessingml.document").
exe - то же самое, что Filters.document.mime_type("application/x-ms-dos-executable").
gif - то же самое, что Filters.document.mime_type("video/mp4"").
jpg - то же самое, что Filters.document.mime_type("image/jpeg").
mp3 - то же самое, что Filters.document.mime_type("audio/mpeg").
pdf - то же самое, что Filters.document.mime_type("application/pdf").
py - то же самое, что Filters.document.mime_type("text/x-python").
svg - то же самое, что Filters.document.mime_type("image/svg+xml").
txt - то же самое, что Filters.document.mime_type("text/plain").
targz - то же самое, что Filters.document.mime_type("application/x-compressed-tar").
wav - то же самое, что Filters.document.mime_type("audio/x-wav").
xml - то же самое, что Filters.document.mime_type("application/xml").
zip - то же самое, что Filters.document.mime_type("application/zip").
file_extension - этот фильтр определяет документы по окончанию/расширению файла.
Примечание. Фильтрует только по окончанию/расширению файла документа, он не проверяет действительность документа. Пользователь может изменять расширение файла документа и отправлять мультимедийные файлы неправильного типа, не подходящие для этого обработчика.
case_sensitive=True.None, чтобы фильтровать файлы без расширения, то есть без точки в имени файла.Примеры
# фильтрует файлы с расширением ".jpg". Filters.document.file_extension("jpg") # фильтрует файлы с расширением "..jpg". Filters.document.file_extension(".jpg") # фильтрует файлы с расширением `.Dockerfile` учитывая регистр символов. Filters.document.file_extension("Dockerfile", case_sensitive=True) # фильтрует файлы без расширения Filters.document.file_extension(None) filters files withou
Filters.entity(entity_type):Фильтр Filters.entity() определяет сообщения, текст которых имеет особую сущность telegram.MessageEntity, где её тип совпадает с entity_type. Объект telegram.MessageEntity представляет собой хэштеги, имена пользователей, URL-адреса и т. д.
Аргумент entity_type - тип сущности объекта Telegram для проверки. Сущности, встроенные в Telegramm:
import telegram telegram.MessageEntity.ALL_TYPES # ['mention', 'hashtag', 'cashtag', 'phone_number', # 'bot_command', 'url', 'email', 'bold', 'italic', 'code', # 'pre', 'text_link', 'text_mention', 'underline', 'strikethrough']
Пример: MessageHandler(Filters.entity("hashtag"), callback_method)
Filters.forwarded:Фильтр Filters.forwarded определяет только пересылаемые сообщения.
Filters.game:Фильтр Filters.game определяет сообщения, содержащие объект, представляющий собой игру telegram.Game.
Используйте @BotFather для создания и редактирования игр, их короткие названия будут выступать в качестве уникальных идентификаторов.
Filters.invoice:Фильтр Filters.invoice определяет сообщения, с объектом, содержащим основную информацию о счете telegram.Invoice.
Filters.language(lang):Фильтр Filters.language() определяет только сообщения от пользователей с определенным языковым кодом.
Согласно официальной документации Telegram API, не у каждого пользователя есть атрибут language_code. Не рассчитывайте, что этот фильтр сработает для всех пользователей.
Аргумент lang - строка с языковым кодом. Фильтр использует метод str.startswith(), это означает, что строка 'en' будет соответствовать как en_US, так и en_GB.
Пример: MessageHandler(Filters.language("en"), callback_method)
Filters.location:Фильтр Filters.location определяет сообщения, c объектом, представляющим собой точку на карте telegram.Location.
Filters.passport_data:Фильтр Filters.passport_data определяет сообщения c объектом, cодержим информацию о данных telegram.PassportData, которыми пользователь поделился с ботом.
Чтобы расшифровать этот объект, необходимо передать свой private_key в telegram.Updater или telegram.Bot. Расшифрованные данные находятся в decrypted_data, а полезная нагрузка decrypted_credentials - в атрибуте telegram.Credentials.payload .
Filters.photo:Фильтр Filters.photo определяет сообщения c объектом, представляющим собой фотографию со сторонами одного размера или миниатюру файла/стикера telegram.PhotoSize.
Filters.poll:Фильтр Filters.poll определяет сообщения c объектом, содержащим информацию об опросе telegram.Poll.
Filters.regex(pattern):Фильтр Filters.regex() определяет сообщения, путем поиска вхождения шаблона регулярного выражения pattern в тексте сообщения. При поиске вхождения шаблона используется функция re.search().
# для захвата всех сообщений, содержащих слово 'help' MessageHandler(Filters.regex(r'help'), callback) # шаблон нечувствителен к регистру MessageHandler(Filters.regex(re.compile(r'help', re.IGNORECASE)), callback)`.
Комбинация фильтров Filters.regex использует ту же логику замыкания, что и операторы and, or и not. Например, комбинация фильтров Filters.regex(r'(a?x)') | Filters.regex(r'(b?x)') с message.text='х', будет возвращать только совпадения для первого фильтра, так как второй никогда не оценивается.
Filters.reply:Фильтр Filters.reply определяет сообщения, являющиеся ответом на другое сообщение.
Filters.sender_chat(chat_id=None, username=None, allow_empty=False):Фильтр Filters.sender_chat определяет сообщения, отправителем которого является чат с chat_id или username чата.
chat_id: разрешенный чат отправителя. Может быть целое число или список целых чисел.username: разрешенное имя пользователя отправителя чата. Символ '@' в начале имени пользователя будет удален. Может быть строка или список строк.allow_empty: следует ли обрабатывать обновления, если чат отправителя не указан в chat_ids или usernames. По умолчанию False.Если присутствуют и chat_id, и username одновременно, то возникает исключение RuntimeError.
# Для фильтрации сообщений, пересылаемых в # группу из канала с идентификатором -1234 MessageHandler(Filters.sender_chat(-1234), callback_method). # Для фильтрации сообщений анонимных администраторов # в супергруппе с именем пользователя `@anonymous` MessageHandler(Filters.sender_chat(username='anonymous'), callback_method). # Для фильтрации сообщений, пересылаемых # в группу с любого канала MessageHandler(Filters.sender_chat.channel, callback_method). # Для фильтрации сообщений анонимных # администраторов в любой супергруппе MessageHandler(Filters.sender_chat.super_group, callback_method).
Помните, что атрибут фильтра sender_chat также устанавливается для сообщений в канале как сам канал, поэтому, когда бот является администратором канала и связанной группы обсуждения, то сообщение придет дважды (один раз изнутри канала, один раз внутри группы обсуждения).
Чтобы добавить/удалить чат, необходимо использовать методы фильтра .add_usernames(), .add_chat_ids(), .remove_usernames() и .remove_chat_ids(). Обновляйте все множество только с помощью атрибутов экземпляра фильтра filter.chat_ids/.usernames=new_set, если полностью уверены, что это не вызывает состояния гонки в потоках, так как произойдет замена текущего множества разрешенных чатов.
Атрибуты и методы фильтра Filters.sender_chat:
chat_ids (множество целых чисел set(int)) - какой идентификатор(ы) чата отправителя должен быть разрешен.usernames (множество строк set(str)) - какие имена пользователей чата отправителя (без символа @) должен быть разрешены.allow_empty - следует ли обрабатывать сообщения, если чат отправителя не указан в chat_ids или usernames.super_group - сообщения, отправителем которых является чат супергруппы. Например, Filters.sender_chat.supergroup.channel - сообщения, чей чат отправителя является каналом. Например, Filters.sender_chat.channel.add_chat_ids(chat_id) - добавляет один или несколько чатов отправителя к разрешенным идентификаторам чата. chat_id - то же самое, что аргумент фильтра.add_usernames(username) - добавляет один или несколько чатов отправителя к разрешенным именам пользователей. username. - то же самое, что аргумент фильтра.get_chat_or_user(message)remove_chat_ids(chat_id) удаляет один или несколько чатов отправителя из разрешенных идентификаторов чата. chat_id - то же самое, что аргумент фильтра.remove_usernames(username) удаляет один или несколько чатов отправителя из разрешенных имен пользователей. username. - то же самое, что аргумент фильтра.Filters.status_update:Фильтр Filters.status_update определяет подмножество сообщений, содержащих обновление статуса.
# для всех сообщений с обновлением статуса Filters.status_update # для всех сообщений с информацией о новых участниках чата Filters.status_update.new_chat_members
Фильтр Filters.status_update имеет следующие атрибуты:
chat_created - обновления, содержащиеtelegram.Message.group_chat_created (группа создана),telegram.Message.supergroup_chat_created (супергруппа создана),telegram.Message.channel_chat_created (канал создан).connected_website - обновления, содержащие telegram.Message.connected_website (доменное имя сайта, с которого пользователь вошел в систему).delete_chat_photo - обновления, содержащие telegram.Message.delete_chat_photo (фото чата была удалена).left_chat_member - обновления, содержащие telegram.Message.left_chat_member (информация о пользователе, покинувшем группу. Этим участником может быть сам бот).migrate - обновления, содержащие:telegram.Message.migrate_to_chat_id (группа была перенесена в супергруппу с указанным идентификатором),telegram.Message.migrate_from_chat_id (супергруппа была перенесена из группы с указанным идентификатором).new_chat_members - обновления, содержащие telegram.Message.new_chat_members (информация о новых участниках чата. Сам бот может быть одним из этих членов).new_chat_photo - обновления, содержащие telegram.Message.new_chat_photo (фотография чата была изменена на это значение).new_chat_title - обновления, содержащие telegram.Message.new_chat_title (название чата было изменено на это значение).message_auto_delete_timer_changed - обновления, содержащие telegram.Message.message_auto_delete_timer_changed (служебное сообщение: в чате изменены настройки таймера автоудаления).pinned_message - обновления, содержащие telegram.Message.pinned_message (указанное сообщение было закреплено.).proximity_alert_triggered - обновления, содержащие telegram.Message.proximity_alert_triggered (служебное сообщение: пользователь в чате вызвал оповещение о близости другого пользователя во время обмена живым местоположением).voice_chat_started - обновления, содержащие telegram.Message.voice_chat_started (служебное сообщение: пользователь начат голосовой чат).voice_chat_ended - обновления, содержащие telegram.Message.voice_chat_ended (служебное сообщение: пользователь закончил голосовой чат).voice_chat_participants_invited - обновления, содержащие telegram.Message.voice_chat_participants_invited (служебное сообщение: новые участники приглашены в голосовой чат).Filters.sticker:Фильтр Filters.sticker определяет сообщения, содержащие объект, представляющий собой стикер.
Filters.successful_payment:Фильтр Filters.successful_payment определяет сообщения, содержащие объект, представляющий основную информацию об успешном платеже.
Filters.text(str):Фильтр Filters.text определяет текстовые сообщения.
Если в update передается список строк, он фильтрует сообщения, текст которых появляется в str. Допускаются только точные совпадения. Если не указано, разрешит любое текстовое сообщение.
# любое текстовое сообщение, MessageHandler(Filters.text, callback_method).
Простой вариант использования для передачи списка: разрешить только те сообщения, которые были отправлены пользователем при помощи кнопок, определенных telegram.ReplyKeyboardMarkup.
buttons = ['Start', 'Settings', 'Back'] markup = ReplyKeyboardMarkup.from_column(buttons) ... MessageHandler(Filters.text(buttons), callback_method)
Примечания:
Filters.dice](#Filters.dice) не содержат текста. Если необходимо отфильтровать текстовые сообщения или сообщения dice, используйте комбинацию Filters.text | Filters.dice.Filters.text & (~Filters.command), если надо фильтровать только текстовые сообщения без команд.Filters.update:Фильтр Filters.update представляет собой подмножество для фильтрации типа обновления.
# новое входящее сообщение Filters.update.message # новый входящий пост на канале # или для всех типов сообщений Filters.update
Фильтр Filters.update содержит следующие атрибуты:
message - сообщение, содержащее новое входящее сообщение telegram.Update.message,edited_message - сообщение, содержащее новую версию сообщения (сообщение отредактировано) telegram.Update.edited_message,messages - сообщение, с любым из:telegram.Update.message,telegram.Update.edited_message,channel_post - сообщение, содержащее новый входящий пост на канале telegram.Update.channel_post,edited_channel_post - сообщение, содержащее новую версию сообщения на канале telegram.Update.edited_channel_post,channel_posts - сообщение, с любым из:telegram.Update.channel_post,telegram.Update.edited_channel_post.Filters.user(user_id=None, username=None, allow_empty=False):Фильтр Filters.user() определяет сообщения, которые получены от указанного(ых) user_id или username пользователя(ей).
Например: MessageHandler(Filters.user(1234), callback_method)
user_id: разрешенный индификатор пользователя отправителя. Может быть целое число или список целых чисел.username: разрешенное имя пользователя отправителя. Символ '@' в начале имени пользователя будет удален. Может быть строка или список строк.allow_empty: следует ли обрабатывать сообщения, если отправитель не указан в user_id или usernames. По умолчанию False.Если присутствуют и user_id, и username, то возникает исключение RuntimeError.
Чтобы добавить/удалить пользователя, необходимо использовать методы экземпляра фильтра .add_usernames(), .add_user_ids(), .remove_usernames() и .remove_user_ids(). Обновляйте весь набор только с помощью filter.user_ids/.usernames = new_set, если только уверены, что это не вызывает состояния гонки в потоках, так как это заменит текущий набор разрешенных пользователей.
Фильтр Filters.user() определяет следующие методы и атрибуты:
user_ids (множество целых чисел set(int)) - разрешенные идентификаторы пользователейusernames (множество строк set(str)) - разрешенные имена пользователей (без символа @).allow_empty - следует ли обрабатывать сообщения, если отправитель не указан в user_ids или usernames.add_user_ids(user_id) - добавляет одного или нескольких пользователей к разрешенным идентификаторам пользователей. user_id - то же самое, что аргумент фильтра.add_usernames(username) - добавляет одного или нескольких пользователей к разрешенным именам пользователей. username - то же самое, что аргумент фильтра.get_chat_or_user(message)remove_user_ids(user_id) - удаляет одного или нескольких пользователей из разрешенных идентификаторов пользователей. user_id - то же самое, что аргумент фильтра.remove_usernames(username) - удаляет одного или нескольких пользователей из разрешенных имён. username - то же самое, что аргумент фильтра.Filters.via_bot(bot_id=None, username=None, allow_empty=False):Фильтр Filters.via_bot определяет сообщения, которые получены от указанных идентификаторов bot_id или username.
Например: MessageHandler(Filters.via_bot(1234), callback_method)
bot_id: разрешенный индификатор бота. Может быть целое число или список целых чисел.username: разрешенное имя пользователя. Символ '@' в начале имени пользователя будет удален. Может быть строка или список строк.allow_empty: следует ли обрабатывать сообщения, если не указан в bot_id или usernames. По умолчанию False.Чтобы добавить/удалить бота, необходимо использовать методы экземпляра фильтра .add_usernames(), .add_bot_ids(), .remove_usernames() и .remove_bot_ids(). Обновляйте весё множество только с помощью filter.bot_ids/.usernames = new_set, если только уверены, что это не вызывает условий гонки в потоках, так как произойдет замена текущего множества разрешенных ботов.
Фильтр Filters.via_bot() определяет следующие методы и атрибуты:
bot_id (множество целых чисел set(int)) - разрешенные идентификаторы бота(ов).usernames (множество строк set(str)) - разрешенные имена пользователей (без символа @).allow_empty - следует ли обрабатывать сообщения, если не указан в bot_id или usernames.add_bot_ids(user_id) - добавляет одного или нескольких ботов к разрешенным идентификаторам. bot_id - то же самое, что аргумент этого фильтра.add_usernames(username) - добавляет одного или нескольких пользователей к разрешенным именам пользователей. username - то же самое, что аргумент фильтра.get_chat_or_user(message)remove_bot_ids(bot_id) - удаляет одного или нескольких ботов из разрешенных идентификаторов. bot_id - то же самое, что аргумент фильтра.remove_usernames(username) - удаляет одного или нескольких пользователей из разрешенных имён. username - то же самое, что аргумент фильтра.Filters.venue:Фильтр Filters.venue определяет сообщения с объектом, представляющим собой место проведения.
Filters.video:Фильтр Filters.video определяет сообщения с объектом, представляющим собой telegram.Video
Filters.video_note:Фильтр Filters.video_note определяет сообщения с объектом, представляющим собой telegram.VideoNote
Filters.voice:Фильтр Filters.video_note определяет сообщения с объектом, представляющим собой telegram.Voice
При использовании MessageHandler иногда бывает полезно иметь более одного фильтра. Это можно сделать с помощью так называемых побитовых операторов. В Python такими операторами являются &, | и ~, которые означают И, ИЛИ и НЕ соответственно. Начиная с версии 13.1 фильтры поддерживают ^ для операции XOR.
Пример определения сообщения, которое является либо видео, либо фото, либо документом.
# для версии 13.x from telegram.ext import MessageHandler, Filters handler = MessageHandler(Filters.video | Filters.photo | Filters.document, callback) # для версии 20.x from telegram.ext import MessageHandler, filters handler = MessageHandler(filters.VIDEO | filters.PHOTO | filters.Document.ALL, callback )
Вычисляем сообщение, которое является пересылаемой фотографией.
# для версии 13.x from telegram.ext import MessageHandler, Filters handler = MessageHandler(Filters.forwarded & Filters.photo, callback) # для версии 20.x from telegram.ext import MessageHandler, filters handler = MessageHandler(filters.FORWARDED & filters.PHOTO, callback)
Определение сообщения, которое является текстовым и содержит ссылку.
# для версии 13.x from telegram import MessageEntity from telegram.ext import MessageHandler, Filters handler = MessageHandler( Filters.text & ( Filters.entity(MessageEntity.URL) | Filters.entity(MessageEntity.TEXT_LINK) ), callback ) # для версии 20.x from telegram import MessageEntity from telegram.ext import MessageHandler, Filters handler = MessageHandler( filters.TEXT & ( filters.Entity(MessageEntity.URL) | filters.Entity(MessageEntity.TEXT_LINK) ), callback )
Определение сообщения, которое является фотографией и не пересылается.
# для версии 13.x from telegram.ext import MessageHandler, Filters handler = MessageHandler(Filters.photo & (~ Filters.forwarded), callback) # для версии 20.x handler = MessageHandler(filters.PHOTO & (~ filters.FORWARDED), callback)
Также возможно написать собственные фильтры. По сути, фильтр - это просто функция, которая получает либо экземпляр сообщения, либо экземпляр обновления и возвращает либо True, либо False. Эта функция должна быть реализована в новом классе, который наследуется от MessageFilter или UpdateFilter, что позволяет комбинировать его с другими фильтрами. Если комбинация всех фильтров оценивается как True, то сообщение будет передано в соответствующую функцию-обработчик callback.
Разница между UpdateFilter и MessageFilter заключается в том, что первый класс будет получать обновления, что позволяет, например, различать обновления сообщений канала и обновления простых сообщений, в то время как второй класс получит update.effective_message.
Например, для определенного обработчика необходимо разрешить только те сообщения, которые содержат текст "python-telegram-bot", в этом случае можно написать собственный фильтр следующим образом:
from telegram.ext import MessageFilter class FilterAwesome(MessageFilter): def filter(self, message): return 'python-telegram-bot' in message.text # Инициализируем класс. my_filter = FilterAwesome()
Класс можно назвать как угодно, но необходимо придерживаться следующего:
MessageFilter или UpdateFilter..filter().Затем фильтр можно использовать так:
my_handler = MessageHandler(my_filter, callback)
CallbackContext.При использовании Filters.regex атрибуты context.matches и context.match устанавливаются на соответствующие совпадения. Чтобы добиться чего-то подобного для пользовательского настраиваемого фильтра, можно сделать следующее:
self.data_filter=True для своего фильтра.Если обновление должно быть обработано, верните словарь в форме {attribute_name: value}. Этот словарь dict будет объединен с внутренним словарем аргумента context, делая значение доступным как context.attribute_name. В настоящее время это работает с MessageHandler, CommandHandler и PrefixHandler, которые являются единственными обработчиками, которые принимают фильтры.Если необходимо, чтобы это работало с пользовательским обработчиком, то необходимо убедится, что YourHandler.collect_additional_context делает что-то вроде:
if isinstance(check_result, dict): context.update(check_result)