🔬 Filters#
Filters are used by handlers to decide whether an update should be handled or ignored.
The library provides several built-in filters, available in the pywa.filters module.
Basic Usage#
from pywa import WhatsApp, types, filters
wa = WhatsApp(...)
@wa.on_message(filters.startswith("Hello", "Hi", ignore_case=True))
def handle_hello(wa: WhatsApp, msg: types.Message):
msg.react("👋")
msg.reply(
f"Hello {msg.from_user.name}!",
buttons=[types.Button("Click me!", "click")]
)
@wa.on_callback(filters.matches("click"))
def handle_click(wa: WhatsApp, clb: types.CallbackButton):
clb.reply("You clicked me!")
Combining Filters#
Filters can be combined with logical operators:
&→ and|→ or~→ not
from pywa import filters
# image with caption
filters.image & filters.has_caption
# text or image
filters.text | filters.image
# message must not contain "bad word"
~filters.contains("bad word")
Tip
All match-filters (matches(), contains() etc.) return True if any of the given options match.
So instead of writing:
filters.matches("hello") | filters.matches("hi")
You can simply write:
filters.matches("hello", "hi")
Custom Filters#
You can define your own filters by writing a function that takes the client and the update, and returns a boolean.
If the function returns True → the handler will process the update.
If it returns False → the update will be ignored.
Note
Custom filters must be wrapped with
pywa.filters.new().You can combine custom and built-in filters using logical operators.
Async functions can be used as filters only with the async client.
from pywa import WhatsApp, types, filters
def without_xyz_filter(_: WhatsApp, msg: types.Message) -> bool:
return msg.text and "xyz" not in msg.text
wa = WhatsApp(...)
@wa.on_message(filters.new(without_xyz_filter))
def messages_without_xyz(wa: WhatsApp, msg: types.Message):
msg.reply("You said something without xyz!")
# Or with lambda:
@wa.on_message(filters.new(lambda _, msg: msg.text and "xyz" not in msg.text))
def messages_without_xyz(wa: WhatsApp, msg: types.Message):
msg.reply("You said something without xyz!")
Built-in Filters#
- Common filters
new()filters.messagefilters.callback_buttonfilters.callback_selectionfilters.message_statusfilters.flow_completionfilters.chat_openedfilters.call_connectfilters.call_terminatefilters.call_statusfilters.call_permission_updatefilters.user_marketing_preferencesfilters.template_statusfilters.template_categoryfilters.template_qualityfilters.template_componentsfilters.phone_number_changefilters.identity_changesent_to()filters.sent_to_mefrom_users()from_countries()matches()contains()startswith()endswith()regex()
- Message Filters
filters.forwardedfilters.forwarded_many_timesfilters.replyreplays_to()filters.has_referred_productfilters.textfilters.is_commandcommand()filters.mediamimetypes()extensions()filters.has_captionfilters.imagefilters.videofilters.audiofilters.audio_onlyfilters.voicefilters.documentfilters.stickerfilters.animated_stickerfilters.static_stickerfilters.reactionfilters.reaction_addedfilters.reaction_removedreaction_emojis()filters.unsupportedfilters.locationfilters.current_locationlocation_in_radius()filters.contactsfilters.contacts_has_wafilters.order
- Message Status Filters