-
Notifications
You must be signed in to change notification settings - Fork 0
Extensions – Advanced Filters
This page describes advanced use cases for the filters used with MessageHandler
(also with CommandHandler
and PrefixHandler
) from telegram.ext
.
When using MessageHandler
it is sometimes useful to have more than one filter. This can be done using so called bit-wise operators. In Python those operators are &
, |
and ~
meaning AND, OR and NOT respectively. Since version 13.1 filters support ^
for XOR.
from telegram.ext import MessageHandler, Filters
handler = MessageHandler(Filters.video | Filters.photo | Filters.document,
callback)
handler = MessageHandler(Filters.forwarded & Filters.photo, callback)
from telegram import MessageEntity
handler = MessageHandler(
Filters.text & (Filters.entity(MessageEntity.URL) |
Filters.entity(MessageEntity.TEXT_LINK)),
callback)
handler = MessageHandler(Filters.photo & (~ Filters.forwarded), callback)
It is also possible to write our own filters. In essence, a filter is simply a function that receives either a Message
instance or a Update
instance and returns either True
or False
. This function has to be implemented in a new class that inherits from either MessageFilter
or UpdateFilter
, which allows it to be combined with other filters. If the combination of all filters evaluates to True
, the message will be handled.
The difference between UpdateFilter
and MessageFilter
is that the filter
function of the former will receive the update
, allowing e.g. to differentiate between channel post updates and message updates, while the filter
function of the latter will receive the update.effective_message
.
Say we wanted to allow only those messages that contain the text "python-telegram-bot is awesome", we could write a custom filter as so:
from telegram.ext import MessageFilter
class FilterAwesome(MessageFilter):
def filter(self, message):
return 'python-telegram-bot is awesome' in message.text
# Remember to initialize the class.
filter_awesome = FilterAwesome()
The class can of course be named however you want, the only important things are:
- The class has to inherit from
MessageFilter
orUpdateFilter
- It has to implement a
filter
method - You have to create an instance of the class
The filter can then be used as:
awesome_handler = MessageHandler(filter_awesome, callback)
You may have noticed that when using Filters.regex
, the attributes context.matches
and context.match
are set to the corresponding matches. To achieve something like this for your custom filter, you can do the following:
-
Set
self.data_filter=True
for your filter in__init__()
method or just right in your filter's class:data_filter=True
. -
If the update should be handled return a dictionary of the form
{attribute_name: [values]}
. This dict will be merged with the internal dict of thecontext
argument makingvalue
available ascontext.attribute_name
. This currently works withMessageHandler
,CommandHandler
andPrefixHandler
, which are the only handlers that accept filters.Note: The keys of the returned dict must be lists. This is necessary to make sure that multiple data filters can be merged meaningfully.
Example of data_filter: https://pastebin.com/JEkKYf99 .
If you want this to work with your custom handler, make sure that YourHandler.collect_additional_context
does something like
if isinstance(check_result, dict):
context.update(check_result)
- Wiki of
python-telegram-bot
© Copyright 2015-2025 – Licensed by Creative Commons
- Architecture Overview
- Builder Pattern for
Application
- Types of Handlers
- Working with Files and Media
- Exceptions, Warnings and Logging
- Concurrency in PTB
- Advanced Filters
- Storing data
- Making your bot persistent
- Adding Defaults
- Job Queue
- Arbitrary
callback_data
- Avoiding flood limits
- Webhooks
- Bot API Forward Compatiblity
- Frequently requested design patterns
- Code snippets
- Performance Optimizations
- Telegram Passport
- Bots built with PTB
- Automated Bot Tests