PyWa Logo

PyWa • Python wrapper for the WhatsApp Cloud API#

PyPi Downloads PyPI Version Tests Docs License CodeFactor Telegram


PyWa is a Fast, Simple, Modern and easy-to-use asynchronous Python framework for building WhatsApp bots using the WhatsApp Cloud API.

⚠️ Important: pywa has introduced breaking changes. Please see the Migration Guide for instructions on updating from earlier versions.

📄 Quick Documentation Index#


Features#

  • 🚀 Fast and simple to use. No need to worry about the low-level details.

  • 💬 Send text messages with interactive keyboards, images, videos, documents, audio, locations, contacts, etc.

  • 📩 Receive messages, callbacks, message status updates, etc.

  • ♻️ Create, send and listen to Flows (NEW!)

  • 🔄 Built-in support for webhooks (Flask, FastAPI, etc.)

  • 🔬 Filters for handling incoming updates

  • 📄 Send and create templates

  • ✅ Fully typed, documented and tested


👨‍💻 Usage#

  • Create a WhatsApp client and send a message

See Getting Started for more information.

from pywa import WhatsApp

wa = WhatsApp(
    phone_id="100458559237541",
    token="EAAEZC6hUxkTIB"
)

wa.send_message(
    to="9876543210",
    text="Hello from PyWa!"
)
  • To listen to updates, create a WhatsApp client, pass a web server app (FastAPI in this example) and register callbacks:

See Handlers for more information.

# wa.py
from pywa import WhatsApp, filters, types
from fastapi import FastAPI

fastapi_app = FastAPI()
wa = WhatsApp(
    phone_id="1234567890",
    token="xxxxxxx",
    server=fastapi_app,
    callback_url="https://yourdomain.com/",
    verify_token="xyz123",
    app_id=123456,
    app_secret="yyyyyy"
)

@wa.on_message(filters.matches("Hello", "Hi"))
def hello(client: WhatsApp, msg: types.Message):
    msg.react("👋")
    msg.reply_text(
        text=f"Hello {msg.from_user.name}!",
        buttons=[
            types.Button(
                title="Click me!",
                callback_data="id:123"
            )
        ]
    )

@wa.on_callback_button(filters.startswith("id"))
def click_me(client: WhatsApp, clb: types.CallbackButton):
    clb.reply_text("You clicked me!")
  • To run the server, use fastapi-cli (pip install "fastapi[standard]"):

fastapi dev wa.py  # see uvicorn docs for more options (port, host, reload, etc.)

💫 Async Usage

  • PyWa has async support! To use the async version, replace all the imports from pywa to pywa_async and use async/await:

# wa.py
import fastapi
from pywa_async import WhatsApp, types

fastapi_app = fastapi.FastAPI()
wa = WhatsApp(..., server=fastapi_app)

async def main():
    await wa.send_message(...)

@wa.on_message()
async def hello(_: WhatsApp, msg: types.Message):
    await msg.react("👋")
    await msg.reply(...)
fastapi dev wa.py

🎛 Installation#

  • Install using pip3:

pip3 install -U pywa
  • Install from source (the bleeding edge):

pip3 install -U git+https://github.com/david-lev/pywa.git
  • If you going to use the webhook features, here is shortcut to install the required dependencies:

pip3 install -U "pywa[fastapi]"
pip3 install -U "pywa[flask]"
  • If you going to use the Flow features and want to use the default FlowRequestDecryptor and the default FlowResponseEncryptor, here is shortcut to install the required dependencies:

pip3 install -U "pywa[cryptography]"

💾 Requirements#

  • Python 3.10 or higher - https://www.python.org

📖 Setup and Usage#

See the Documentation for detailed instructions

☑️ TODO#

  • ~~Add support for async~~

  • ~~Add support for more web frameworks (Django, aiohttp, etc.)~~

  • ~~Add support for flows~~

  • Add support for more types of updates (account_alerts, phone_number_quality_updates, template_category_updates, etc.)

  • Add more examples and guides

Feel free to open an issue if you have any suggestions. or even better - submit a PR!

⚖️ License#

This project is licensed under the MIT License - see the LICENSE file for details

🔱 Contributing#

Contributions are welcome! Please see the Contributing Guide for more information.

📝 Changelog#

NOTE: pywa follows the semver versioning standard.

2.0.5 (2024-11-10) Latest#

  • [client] fix send_template return type SentMessage

2.0.4 (2024-11-08)#

  • [client] fix reply_to_message

2.0.3 (2024-11-02)#

  • [client] override _flow_req_cls

  • [handlers] descriptive repr for Handler

2.0.2 (2024-10-30)#

  • [server] rely on update hash instead of update id to avid duplicate updates

2.0.1 (2024-10-30)#

  • [server] fix skip update in process (async)

2.0.0 (2024-10-30)#

For full changelog, see here.#

🔗 Contents#