Skip to main content

A Python Library to write digital guides for telegram

Project description

Digital Guides

A Python library for building interactive, state-machine-driven conversational guides on WhatsApp (via the WhatsApp Cloud API and pywa).

Overview

Digital Guides lets you define guided experiences as JSON — each state contains a list of handlers that match incoming messages and a list of actions that are sent in response. The library handles webhook parsing, pattern matching, message sending, and persistence so you can focus on the conversation flow.

Installation

pip install digitalguide

With MongoDB persistence and pywa (WhatsApp Cloud API client):

pip install "digitalguide[full]"

With image processing (PIL) and S3 storage:

pip install "digitalguide[full]" boto3 Pillow

Configuration

Create a config.ini file in your working directory:

[bot]
bot_name = my_bot_name   # used as the MongoDB database alias

[space]
space_name = my-s3-bucket
space_region = fra1
space_endpoint = https://fra1.digitaloceanspaces.com

Set S3/DigitalOcean Spaces credentials as environment variables:

export SPACES_KEY=your_access_key
export SPACES_SECRET=your_secret_key

Quick Start

1. Define states and actions as JSON

handlers_json = [
    {
        "handler": "MessageHandler",
        "filter": "regex",
        "regex": "WEITER_PATTERN",   # matches "weiter", "next", "ok", etc.
        "action": "welcome_action"
    },
    {
        "handler": "MessageHandler",
        "filter": "text",
        "action": "fallback_action"
    }
]

actions_json = [
    {"type": "message", "text": "Willkommen, {profile_name}!"},
    {"type": "message", "text": "Schreib etwas, um fortzufahren."},
    {"type": "return", "state": "next_state"}
]

2. Build handlers and actions

from digitalguide.generateStates import read_state
from digitalguide.generateActions import Action

handlers = read_state(handlers_json)
action = Action(actions_json)

3. Process an incoming webhook

The library uses pywa for WhatsApp Cloud API integration. Register a handler on your PyWa client and dispatch the incoming update through your state's handler list:

from pywa import WhatsApp
from pywa.types import Message, CallbackButton, CallbackSelection
import redis

wa = WhatsApp(
    phone_id="YOUR_PHONE_NUMBER_ID",
    token="YOUR_ACCESS_TOKEN",
    server=None,           # e.g. a Flask or FastAPI app
    callback_url="https://your-domain.com/webhook",
    verify_token="YOUR_VERIFY_TOKEN",
)

r = redis.Redis()         # Redis client used to track in-flight messages

def handle_update(client: WhatsApp, update: Message | CallbackButton | CallbackSelection):
    context = {"state": "start"}   # load from your persistence layer

    for handler in handlers:
        if handler.check_update(update):
            new_state = handler.callback(client, update, context, r)
            break

update is a pywa.types.Message, CallbackButton, or CallbackSelection object delivered by pywa's webhook dispatcher. r is a Redis client used to track in-flight messages.

Action Types

Type Description
message Send a text message. Supports reply_buttons and interactive list via button + section_title + rows.
photo Send an image by url or media id.
video Send a video by url.
audio / voice Send audio by url or media id.
sticker Send a sticker by url.
carousel Send a card carousel with text and cards.
venue Send a location pin with title, address, latitude, longitude.
poll Send a text poll with question and options list.
function Call a special action function by func (module:function_name) with extra keyword arguments.
return Transition to a new state. Must be the last item; returns state string to the caller.

Message placeholders

Inside text fields you can use:

  • {profile_name} — the user's WhatsApp display name
  • {echo} — the user's last message text
  • {any_context_key} — any value stored in the context dict

Handler Types

MessageHandler

Matches incoming messages. Supported filter values:

Filter Matches
regex A named pattern (e.g. JA_PATTERN) or a custom regex string
text Any text message
photo Any image message
voice Any audio/voice message

Named patterns available: EMOJI_PATTERN, JA_PATTERN, NEIN_PATTERN, WEITER_PATTERN, ZURUECK_PATTERN, WOHIN_PATTERN, JAHRESZAHL_PATTERN, KOMMAZAHL_PATTERN, DATENSCHUTZ_PATTERN.

CommandHandler

Matches a specific command string (e.g. /start):

{"handler": "CommandHandler", "command": "start", "action": "start_action"}

TypeHandler

Matches by update type. Currently supports "Update".

Special Actions

Register additional action functions by passing an action_functions dict to Action:

from digitalguide.special_actions import contextActions, writeActions

action_functions = {
    **contextActions.whatsapp_action_functions,
    **writeActions.whatsapp_action_functions,
}

action = Action(actions_json, action_functions=action_functions)

Or reference them directly in JSON with module:function syntax:

{"type": "function", "func": "contextActions:save_text_to_context", "key": "user_answer"}

Available modules:

  • contextActions — save values to the session context
  • writeActions — persist user-sent media (photo, voice, video, document) to S3
  • imageActions — image overlay and GIF generation
  • listenfrageActions — listening/survey question tracking
  • schaetzfragenActions — year/decimal estimation questions with feedback

Data Persistence

When [full] dependencies are installed and MongoDB is connected, the library automatically persists:

  • WhatsAppUser — user profile name and WhatsApp ID (created on first interaction)
  • WhatsAppInteraction — every incoming message with its state and timestamp
  • WhatsAppUserContextState — per-user session context and current state

Connect MongoDB before processing updates:

import mongoengine
mongoengine.register_connection(alias="my_bot_name", name="my_bot_name", host="mongodb://localhost")

Running Tests

pip install "digitalguide[test]"
pytest

License

MIT

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distribution

digitalguide-0.0.535.tar.gz (17.4 kB view details)

Uploaded Source

Built Distribution

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

digitalguide-0.0.535-py3-none-any.whl (16.9 kB view details)

Uploaded Python 3

File details

Details for the file digitalguide-0.0.535.tar.gz.

File metadata

  • Download URL: digitalguide-0.0.535.tar.gz
  • Upload date:
  • Size: 17.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for digitalguide-0.0.535.tar.gz
Algorithm Hash digest
SHA256 8cd5d8199dc72c2d6e42d7361b03ee7efc441016909d743237cedd37eb789a98
MD5 b14c66584a1f653de98f97b84c0059d0
BLAKE2b-256 38660e43f54bfd7ecc0d809b178580e2366ee52e1119b26f8460996e56855fe5

See more details on using hashes here.

File details

Details for the file digitalguide-0.0.535-py3-none-any.whl.

File metadata

  • Download URL: digitalguide-0.0.535-py3-none-any.whl
  • Upload date:
  • Size: 16.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for digitalguide-0.0.535-py3-none-any.whl
Algorithm Hash digest
SHA256 b8a7e7848c47c9f0603d2d35e81feda22718b7e9438ac09c1a2f4f1b359ba622
MD5 5de9e32fe2a14e3a4f826579f7fc26f4
BLAKE2b-256 789802f83b4b8809f903c62e28669b65d1d5ee76fba8e408e8fc0ad68d47c0e0

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