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.536.tar.gz (17.5 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.536-py3-none-any.whl (17.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: digitalguide-0.0.536.tar.gz
  • Upload date:
  • Size: 17.5 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.536.tar.gz
Algorithm Hash digest
SHA256 5c61314424014bbdb3107a7202b94969a1a511b26276f4b2e0a9eb6e6193dc89
MD5 5328e4883643c6061e25e8d548ca0600
BLAKE2b-256 c01f15a4249204b53618aed4875b6a8c616360a20deb02f925d68d5649e4a8d6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: digitalguide-0.0.536-py3-none-any.whl
  • Upload date:
  • Size: 17.0 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.536-py3-none-any.whl
Algorithm Hash digest
SHA256 01e7a308497f263244c43acb3389777eb62e97a3acf53a14554dc34586edb519
MD5 a5f8a481333f5a77f519fce84c05212d
BLAKE2b-256 97e1e69bacc951862a6aa428f360a5570dbf7264e2ea80fda0560118ea3ed119

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