Skip to main content

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

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.551.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.551-py3-none-any.whl (16.8 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for digitalguide-0.0.551.tar.gz
Algorithm Hash digest
SHA256 912da25b7d3355966a5b9fc9817f0744a3db13660acca37f1e05f3c75606ecf4
MD5 5ab381ffc82df242a07f2a4a08f90ef7
BLAKE2b-256 bd7d764cd25fc4b2c844c36e871817042decb2285bd24db651ba1b3493554fde

See more details on using hashes here.

File details

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

File metadata

  • Download URL: digitalguide-0.0.551-py3-none-any.whl
  • Upload date:
  • Size: 16.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for digitalguide-0.0.551-py3-none-any.whl
Algorithm Hash digest
SHA256 6b2899e5c06c04b07b2a2dd107e07fe26937f58b35f8d29a477a8ad6ef70467c
MD5 ca5b6289ee9c563caeff514525fa15f5
BLAKE2b-256 1a04b13f346b9f3a8f7b66dd2fa944abe09ce5c836fefdd34d614e4e4edeb7c8

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.0.551 This release

2 files

0.0.550

2 files

0.0.549

2 files

0.0.548

2 files

0.0.547

2 files

0.0.546

2 files

0.0.545

2 files

0.0.544

2 files

0.0.543

2 files

0.0.542

2 files

0.0.541

2 files

0.0.540

2 files

0.0.539

2 files

0.0.538

2 files

0.0.537

2 files

0.0.536

2 files

0.0.535

2 files

0.0.534

2 files

0.0.533

2 files

0.0.532

2 files

0.0.531

2 files

0.0.530

2 files

0.0.529

2 files

0.0.528

2 files

0.0.527

2 files

0.0.526

2 files

0.0.525

2 files

0.0.524

2 files

0.0.523

2 files

0.0.522

2 files

0.0.521

2 files

0.0.520

2 files

0.0.519

2 files

0.0.517

2 files

0.0.516

2 files

0.0.514

2 files

0.0.513

2 files

0.0.512

2 files

0.0.511

2 files

0.0.508

2 files

0.0.507

2 files

0.0.506

2 files

0.0.505

2 files

0.0.503

2 files

0.0.502

2 files

0.0.501

2 files

0.0.500

2 files

0.0.498

2 files

0.0.497

2 files

0.0.496

2 files

0.0.495

2 files

0.0.494

2 files

0.0.493

2 files

0.0.492

2 files

0.0.491

2 files

0.0.490

2 files

0.0.489

2 files

0.0.488

2 files

0.0.487

2 files

0.0.486

2 files

0.0.485

2 files

0.0.484

2 files

0.0.483

2 files

0.0.482

2 files

0.0.481

2 files

0.0.480

2 files

0.0.479

2 files

0.0.478

2 files

0.0.477

2 files

0.0.476

2 files

0.0.475

2 files

0.0.474

2 files

0.0.473

2 files

0.0.472

2 files

0.0.471

2 files

0.0.470

2 files

0.0.469

2 files

0.0.468

2 files

0.0.467

2 files

0.0.466

2 files

0.0.465

2 files

0.0.464

2 files

0.0.463

2 files

0.0.462

2 files

0.0.461

2 files

0.0.460

2 files

0.0.459

2 files

0.0.458

2 files

0.0.457

2 files

0.0.456

2 files

0.0.455

2 files

0.0.454

2 files

0.0.453

2 files

0.0.452

2 files

0.0.451

2 files

0.0.450

2 files

0.0.449

2 files

0.0.448

2 files

0.0.447

2 files

0.0.446

2 files

0.0.444

2 files

0.0.443

2 files

0.0.442

2 files

0.0.441

2 files

0.0.440

2 files

0.0.439

2 files

0.0.438

2 files

0.0.437

2 files

0.0.436

2 files

0.0.435

2 files

0.0.434

2 files

0.0.433

2 files

0.0.432

2 files

0.0.431

2 files

0.0.430

2 files

0.0.429

2 files

0.0.428

2 files

0.0.427

2 files

0.0.426

2 files

0.0.425

2 files

0.0.424

2 files

0.0.423

2 files

0.0.422

2 files

0.0.421

2 files

0.0.420

2 files

0.0.419

2 files

0.0.418

2 files

0.0.417

2 files

0.0.416

2 files

0.0.415

2 files

0.0.414

2 files

0.0.413

2 files

0.0.412

2 files

0.0.411

2 files

0.0.410

2 files

0.0.409

2 files

0.0.408

2 files

0.0.407

2 files

0.0.406

2 files

0.0.405

2 files

0.0.404

2 files

0.0.403

2 files

0.0.402

2 files

0.0.401

2 files

0.0.400

2 files

0.0.346

2 files

0.0.345

2 files

0.0.344

2 files

0.0.343

2 files

0.0.342

2 files

0.0.341

2 files

0.0.340

2 files

0.0.339

2 files

0.0.337

2 files

0.0.336

2 files

0.0.335

2 files

0.0.334

2 files

0.0.333

2 files

0.0.332

2 files

0.0.331

2 files

0.0.330

2 files

0.0.329

2 files

0.0.328

2 files

0.0.327

2 files

0.0.326

2 files

0.0.325

2 files

0.0.324

2 files

0.0.323

2 files

0.0.322

2 files

0.0.321

2 files

0.0.320

2 files

0.0.318

2 files

0.0.316

2 files

0.0.315

2 files

0.0.313

2 files

0.0.312

2 files

0.0.311

2 files

0.0.309

2 files

0.0.308

2 files

0.0.307

2 files

0.0.306

2 files

0.0.305

2 files

0.0.304

2 files

0.0.303

2 files

0.0.302

2 files

0.0.301

2 files

0.0.300

2 files

0.0.299

2 files

0.0.298

2 files

0.0.297

2 files

0.0.296

2 files

0.0.295

2 files

0.0.294

2 files

0.0.293

2 files

0.0.292

2 files

0.0.291

2 files

0.0.289

2 files

0.0.288

2 files

0.0.287

2 files

0.0.284

2 files

0.0.282

2 files

0.0.281

2 files

0.0.280

2 files

0.0.279

2 files

0.0.278

2 files

0.0.277

2 files

0.0.275

2 files

0.0.274

2 files

0.0.273

2 files

0.0.272

2 files

0.0.271

2 files

0.0.270

2 files

0.0.269

2 files

0.0.268

2 files

0.0.267

2 files

0.0.266

2 files

0.0.264

2 files

0.0.263

2 files

0.0.262

2 files

0.0.261

2 files

0.0.260

2 files

0.0.259

2 files

0.0.258

2 files

0.0.257

2 files

0.0.256

2 files

0.0.255

2 files

0.0.254

2 files

0.0.253

2 files

0.0.251

2 files

0.0.250

2 files

0.0.248

2 files

0.0.247

2 files

0.0.246

2 files

0.0.245

2 files

0.0.244

2 files

0.0.243

2 files

0.0.242

2 files

0.0.241

2 files

0.0.240

2 files

0.0.238

2 files

0.0.237

2 files

0.0.236

2 files

0.0.235

2 files

0.0.234

2 files

0.0.233

2 files

0.0.232

2 files

0.0.231

2 files

0.0.230

2 files

0.0.229

2 files

0.0.228

2 files

0.0.227

2 files

0.0.226

2 files

0.0.225

2 files

0.0.224

2 files

0.0.223

2 files

0.0.222

2 files

0.0.221

2 files

0.0.220

2 files

0.0.219

2 files

0.0.218

2 files

0.0.217

2 files

0.0.215

2 files

0.0.214

2 files

0.0.213

2 files

0.0.212

2 files

0.0.211

2 files

0.0.208

2 files

0.0.207

2 files

0.0.206

2 files

0.0.205

2 files

0.0.204

2 files

0.0.203

2 files

0.0.202

2 files

0.0.201

2 files

0.0.200

2 files

0.0.199

2 files

0.0.198

2 files

0.0.197

2 files

0.0.196

2 files

0.0.195

2 files

0.0.194

2 files

0.0.193

2 files

0.0.192

2 files

0.0.191

2 files

0.0.190

2 files

0.0.189

2 files

0.0.188

2 files

0.0.187

2 files

0.0.186

2 files

0.0.185

2 files

0.0.184

2 files

0.0.183

2 files

0.0.182

2 files

0.0.181

2 files

0.0.180

2 files

0.0.179

2 files

0.0.178

2 files

0.0.177

2 files

0.0.176

2 files

0.0.175

2 files

0.0.174

2 files

0.0.173

2 files

0.0.172

2 files

0.0.171

2 files

0.0.170

2 files

0.0.169

2 files

0.0.168

2 files

0.0.167

2 files

0.0.166

2 files

0.0.165

2 files

0.0.164

2 files

0.0.163

2 files

0.0.162

2 files

0.0.161

2 files

0.0.160

2 files

0.0.159

2 files

0.0.158

2 files

0.0.157

2 files

0.0.156

2 files

0.0.155

2 files

0.0.154

2 files

0.0.153

2 files

0.0.152

2 files

0.0.151

2 files

0.0.150

2 files

0.0.149

2 files

0.0.148

2 files

0.0.147

2 files

0.0.146

2 files

0.0.145

2 files

0.0.144

2 files

0.0.143

2 files

0.0.142

2 files

0.0.141

2 files

0.0.140

2 files

0.0.139

2 files

0.0.138

2 files

0.0.137

2 files

0.0.136

2 files

0.0.135

2 files

0.0.134

2 files

0.0.133

2 files

0.0.132

2 files

0.0.131

2 files

0.0.130

2 files

0.0.129

2 files

0.0.128

2 files

0.0.127

2 files

0.0.126

2 files

0.0.125

2 files

0.0.124

2 files

0.0.123

2 files

0.0.122

2 files

0.0.121

2 files

0.0.120

2 files

0.0.119

2 files

0.0.117

2 files

0.0.116

2 files

0.0.115

2 files

0.0.114

2 files

0.0.113

2 files

0.0.112

2 files

0.0.111

2 files

0.0.110

2 files

0.0.109

2 files

0.0.108

2 files

0.0.107

2 files

0.0.106

2 files

0.0.105

2 files

0.0.104

2 files

0.0.103

2 files

0.0.102

2 files

0.0.101

2 files

0.0.100

2 files

0.0.99

2 files

0.0.98

2 files

0.0.97

2 files

0.0.96

2 files

0.0.95

2 files

0.0.94

2 files

0.0.93

2 files

0.0.92

2 files

0.0.91

2 files

0.0.90

2 files

0.0.89

2 files

0.0.88

2 files

0.0.86

2 files

0.0.85

2 files

0.0.84

2 files

0.0.81

2 files

0.0.80

2 files

0.0.79

2 files

0.0.78

2 files

0.0.77

2 files

0.0.76

2 files

0.0.75

2 files

0.0.74

2 files

0.0.73

2 files

0.0.71

2 files

0.0.70

2 files

0.0.69

2 files

0.0.68

2 files

0.0.67

2 files

0.0.66

2 files

0.0.65

2 files

0.0.64

2 files

0.0.63

2 files

0.0.62

2 files

0.0.61

2 files

0.0.60

2 files

0.0.58

2 files

0.0.57

2 files

0.0.56

2 files

0.0.55

2 files

0.0.54

2 files

0.0.53

2 files

0.0.52

2 files

0.0.51

2 files

0.0.50

2 files

0.0.49

2 files

0.0.48

2 files

0.0.47

2 files

0.0.46

2 files

0.0.45

2 files

0.0.44

2 files

0.0.40

2 files

0.0.39

2 files

0.0.38

2 files

0.0.37

2 files

0.0.36

2 files

0.0.35

2 files

0.0.34

2 files

0.0.33

2 files

0.0.32

2 files

0.0.31

2 files

0.0.30

2 files

0.0.29

2 files

0.0.28

2 files

0.0.27

2 files

0.0.26

2 files

0.0.25

2 files

0.0.24

2 files

0.0.23

2 files

0.0.22

2 files

0.0.21

2 files

0.0.20

2 files

0.0.19

2 files

0.0.18

2 files

0.0.17

2 files

0.0.16

2 files

0.0.15

2 files

0.0.14

2 files

0.0.13

2 files

0.0.12

2 files

0.0.11

2 files

0.0.10

2 files

0.0.9

2 files

0.0.8

2 files

0.0.7

2 files

0.0.6

2 files

0.0.5

2 files

0.0.4

2 files

0.0.3

2 files

0.0.2

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page