Skip to main content

A template-driven framework for building WhatsApp chatbots

Project description

WhatsApp ChatBot Engine

A framework for creating WhatsApp chatbots of any scale using a template-driven approach - allowing you to define conversation flows and business logic in a clean and modular way.

[!NOTE] Template engine and WhatsApp client library are decoupled - allowing you to use them independently or together.

Features

  • Template-Driven Design: Use YAML templates for conversational flows.
  • Hooks for Business Logic: Attach Python functions to process messages or actions.
  • Focus on your conversation flow and business logic.
  • Easy-to-use API for WhatsApp Cloud.
  • Supports dynamic messages with placeholders.
  • Built-in support for WhatsApp Webhooks.
  • Starter templates
  • Live Support / Human interaction portal template

Installation

pip install pywce

Why pywce

Most WhatsApp chatbot tutorials or libraries just scraps the surface, only sending a few message or handling simple logic or are client libraries only.

This library gives you a full-blown framework for chatbots of any scale allowing you access to full package of whatsapp client library and chatbot development framework.


Setup

WhatsApp

Follow the complete step by step WhatsApp Cloud API guide below.

WhatsApp Cloud API Complete Setup Guide

Important settings needed for this framework

  1. Phone number ID (be it test number or live number)
  2. Access Token (Temporary or permanent)
  3. Webhook callback verification token of your choice

Create a .env with the below settings in your project or test folder (be it example or portal folders)

ACCESS_TOKEN        = <your-whatsapp-access-token>
PHONE_NUMBER_ID     = <your-number-phone-id>
WEBHOOK_HUB_TOKEN   = <your-webhook-verification-token>

# path to your templates & triggers folders
TEMPLATES_DIR       = portal/chatbot/templates
TRIGGERS_DIR        = portal/chatbot/triggers

# your templates initial or start stage
START_STAGE         = START-MENU

Engine

You can either use .env or add your credentials directly to the WhatsAppConfig class

import os
from dotenv import load_dotenv
from pywce import client, Engine, EngineConfig

load_dotenv()

whatsapp_config = client.WhatsAppConfig(
    token=os.getenv("ACCESS_TOKEN"),
    phone_number_id=os.getenv("PHONE_NUMBER_ID"),
    hub_verification_token=os.getenv("WEBHOOK_HUB_TOKEN")
)

whatsapp = client.WhatsApp(whatsapp_config=whatsapp_config)

engine_config = EngineConfig(
    whatsapp=whatsapp,
    templates_dir=os.getenv("TEMPLATES_DIR"),
    trigger_dir=os.getenv("TRIGGERS_DIR"),
    start_template_stage=os.getenv("START_STAGE")
)

engine_instance = Engine(config=engine_config)

Example ChatBot

Here's a simple example template to get you started:

[!NOTE] Checkout complete working examples in the example folder

  1. Define YAML template (Conversation Flow💬):
# path/to/templates
"START-MENU":
  type: button
  template: "example.hooks.name_template.username"
  message:
    title: Welcome
    body: "Hi {{ name }}, I'm your assistant, click below to start!"
    footer: pywce
    buttons:
      - Start
  routes:
    "start": "NEXT-STEP"

"NEXT-STEP":
  type: text
  message: Great, lets get you started quickly. What is your age?
  routes:
    "re://d{1,}": "NEXT-STEP-FURTHER"
  1. Write your hook (Supercharge⚡):
# example/hooks/name.py
from pywce import hook, HookArg, TemplateDynamicBody

@hook
def username(arg: HookArg) -> HookArg:
    # set render payload data to match the required template dynamic var
    
    # greet user by their whatsapp name 😎
    arg.template_body = TemplateDynamicBody(
        render_template_payload={"name": arg.user.name}
    )

    return arg
  1. Engine client:

Use fastapi or flask or any python library to create endpoint to receive whatsapp webhooks

# ~ fastapi snippet ~

async def webhook_event(payload: Dict, headers: Dict) -> None:
    """
    Process webhook event in the background using pywce engine.
    """
    await engine_instance.process_webhook(payload, headers)

@app.post("/chatbot/webhook")
async def process_webhook(request: Request, background_tasks: BackgroundTasks):
    """
    Handle incoming webhook events from WhatsApp 
    and process them in the background.
    """
    payload = await request.json()
    headers = dict(request.headers)

    # handle event in the background
    background_tasks.add_task(webhook_event, payload, headers)

    # Immediately respond to WhatsApp with acknowledgment
    return Response(content="ACK", status_code=200)

Run ChatBot

If you run your project or the example projects successfully, your webhook url will be available on localhost:port/chatbot/webhook.

You can use ngrok or any service to tunnel your local service

You can then configure the endpoint in Webhook section on Meta developer portal.

Live Support

Engine comes with a default basic live support / human interaction portal out-of-the-box powered by Reflex

Check out Live Support Portal

WhatsApp Client Library

[!NOTE] You can use pywce as a standalone whatsapp client library. See Example

PyWCE provides a simple, Pythonic interface to interact with the WhatsApp Cloud API:

  • Send messages (text, media, templates, interactive)
  • Receive and process webhooks
  • Media management (upload and download)
  • Out of the box utilities using the WhatsApp.Utils class.

Example usage:

from pywce import client

config = client.WhatsAppConfig(
    token="your_access_token",
    phone_number_id="your_phone_number_id",
    hub_verification_token="your_webhook_hub_verification_token"
)

whatsapp = client.WhatsApp(whatsapp_config=config)

# Sending a text message
response = whatsapp.send_message(
    recipient_id="recipient_number",
    message="Hello from PyWCE!"
)

# verify if request was successful, using utils
is_sent = whatsapp.util.was_request_successful(
    recipient_id="recipient_number",
    response_data=response
)

if is_sent:
    message_id = whatsapp.util.get_response_message_id(response)
    print("Request successful with msg id: ", message_id)

Documentation

Visit the official documentation for a detailed guide.

Changelog

Visit the changelog list for a full list of changes.

Contributing

We welcome contributions! Please check out the Contributing Guide for details.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pywce-1.0.7.tar.gz (44.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pywce-1.0.7-py3-none-any.whl (48.8 kB view details)

Uploaded Python 3

File details

Details for the file pywce-1.0.7.tar.gz.

File metadata

  • Download URL: pywce-1.0.7.tar.gz
  • Upload date:
  • Size: 44.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.11.9

File hashes

Hashes for pywce-1.0.7.tar.gz
Algorithm Hash digest
SHA256 2a0e1a3a4cd64dbb9de4fc2dd0683229e02919d43ad643c508e15d7c2332f543
MD5 3a25d2abd6f366714a9e6b2ae6e09033
BLAKE2b-256 d45eb247edca7dda207452dd87a552ac428e94319ac5471d3717769cda52c714

See more details on using hashes here.

File details

Details for the file pywce-1.0.7-py3-none-any.whl.

File metadata

  • Download URL: pywce-1.0.7-py3-none-any.whl
  • Upload date:
  • Size: 48.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.11.9

File hashes

Hashes for pywce-1.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 d0e370b9488b050a317fd0a8dae683fef73d94c92aa34ec314d769a27b414b09
MD5 dc4f42f603f3c5387154100f0f7925a2
BLAKE2b-256 4a221dc048ab052650db17811f240b280e337c46f3642fc1cb2a1c239b423c9f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page