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 thecontextdict
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 contextwriteActions— persist user-sent media (photo, voice, video, document) to S3imageActions— image overlay and GIF generationlistenfrageActions— listening/survey question trackingschaetzfragenActions— 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 timestampWhatsAppUserContextState— 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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file digitalguide-0.0.533.tar.gz.
File metadata
- Download URL: digitalguide-0.0.533.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c34817936869f77089fd584b8aab17944f8f525686c5c2499c27c9c2240c61f2
|
|
| MD5 |
6d9329004b4557ce056e2613806b003f
|
|
| BLAKE2b-256 |
e88138a5781fbdfd3041e72b2bc687de7499984eaf47a3e6a4c800efe0c66d08
|
File details
Details for the file digitalguide-0.0.533-py3-none-any.whl.
File metadata
- Download URL: digitalguide-0.0.533-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
daaa8c7562c06db785544df82e264f704ce7678dd1e3cbad308644d0a3e74731
|
|
| MD5 |
4ab424cec2f384964fec42fdf1b9ee47
|
|
| BLAKE2b-256 |
6c1ec670253301911aee47ee9cb52ef8c662563b7a658b523e77aa05f145e23f
|