Telegram Interactive Buttons
Create interactive Telegram messages with inline buttons using OpenClaw CLI. Use when you need user interaction in Telegram (selection from a list, confirmat...
Description
name: telegram-interactive-buttons description: Create interactive Telegram messages with inline buttons using OpenClaw CLI. Use when you need user interaction in Telegram (selection from a list, confirmation dialogs, workflow menus, quick actions). Handles button formatting, callback handling, and message editing. Critical for UX-friendly Telegram automation. metadata: { "openclaw": { "requires": { "bins": ["openclaw", "bash"], "optional_bins": ["python3"] }, "credentials": ["telegram_bot_token"], "config_required": true } }
Telegram Interactive Buttons
Requirements
📖 First time setup? See SETUP.md for detailed configuration instructions.
Required Binaries
openclaw- OpenClaw CLI (install:npm install -g openclaw)bash- Shell for helper scripts
Optional Binaries
python3- For JSON validation script (recommended)
Credentials & Configuration
Telegram Bot Setup Required:
-
Create a Telegram bot via @BotFather
- Send
/newbotto BotFather - Follow prompts to get your bot token
- Send
-
Configure OpenClaw with your bot token:
Edit
~/.openclaw/config.json(or your workspaceopenclaw.json):{ "channels": { "telegram": { "enabled": true, "botToken": "YOUR_BOT_TOKEN_HERE" } } } -
Get your chat ID:
- Start a chat with your bot
- Send any message
- Run:
openclaw message send --target "telegram:YOUR_CHAT_ID" --message "Test" - Check OpenClaw logs or use Telegram bot API to retrieve your chat ID
Target Format: All examples use telegram:CHAT_ID format. Replace CHAT_ID with your actual Telegram chat ID (numeric).
Security Notes
Scripts in this skill:
- Execute local shell commands via
bash - Call
openclawCLI with user-provided arguments validate_buttons.pyparses JSON (no external connections)
Before running:
- Review all scripts - they are short and readable
- Replace placeholder chat IDs in examples
- Run only in trusted environments
- Never pass untrusted inputs to scripts without validation
- Store bot token securely (use environment variables or secure config files)
Credential Scope:
- Bot token allows sending messages to chats where bot is added
- Scripts do not modify bot permissions or settings
- No sensitive data is transmitted beyond standard Telegram API calls
Overview
This skill provides reliable methods for creating interactive Telegram messages with inline buttons using the OpenClaw CLI. After extensive testing across different models (Gemini, Claude), the CLI approach via exec tool has proven to be the most stable method for sending buttons.
Why this skill exists: The message tool's buttons parameter can be fragile across different models. The CLI provides consistent, predictable button rendering.
Quick Start
Basic button message:
openclaw message send \
--target "telegram:CHAT_ID" \
--message "Choose an option:" \
--buttons '[[{"text": "Option 1", "callback_data": "opt1"}, {"text": "Option 2", "callback_data": "opt2"}]]'
Key points:
- Use single quotes around the entire
--buttonsargument - Buttons is a JSON array of arrays (rows)
- Each button needs
textandcallback_data - Keep 1-2 buttons per row for mobile UX
Sending Buttons
Button Structure
The --buttons parameter accepts a JSON array of arrays (rows):
[
[{"text": "B1", "callback_data": "c1"}, {"text": "B2", "callback_data": "c2"}],
[{"text": "B3", "callback_data": "c3"}]
]
Layout Limits:
- Max buttons per row: 8 (use this for grids/keypads)
- Max buttons total: 100
- Mobile UX Recommendation: While 8 are supported, keep 1-3 buttons per row for standard menus to ensure readability on mobile. Use the full 8-button width only for grids (e.g., calculators, calendars, or numeric selectors).
Button Properties
Each button object supports:
text(required): Display textcallback_data(required): Unique identifier for the callbackstyle(optional):primary,success, ordanger
Example with styles:
openclaw message send \
--target "telegram:CHAT_ID" \
--message "Confirm action?" \
--buttons '[[{"text": "✅ Confirm", "callback_data": "confirm", "style": "success"}, {"text": "❌ Cancel", "callback_data": "cancel", "style": "danger"}]]'
Helper Script
Use the provided helper for cleaner code:
bash scripts/send_buttons.sh "telegram:CHAT_ID" "Choose:" '[[{"text": "Yes", "callback_data": "yes"}, {"text": "No", "callback_data": "no"}]]'
Handling Callbacks
When a user clicks a button, Telegram sends a callback with the callback_data value. Handle it in two steps:
- Send confirmation message - Acknowledge the selection
- Edit original message - Remove buttons to prevent accidental re-clicks
Example flow:
# User clicked button with callback_data="yes"
# Step 1: Send confirmation
openclaw message send \
--target "telegram:CHAT_ID" \
--message "✅ You selected: Yes"
# Step 2: Edit original message (remove buttons)
openclaw message edit \
--target "telegram:CHAT_ID" \
--message-id "MESSAGE_ID" \
--message "Choose: [Selection complete]"
Editing Messages
Remove buttons after selection:
openclaw message edit \
--target "telegram:CHAT_ID" \
--message-id "939" \
--message "Updated message text without buttons"
Or use the helper:
bash scripts/edit_message.sh "telegram:CHAT_ID" "939" "Selection complete"
Common Patterns
Yes/No Confirmation
openclaw message send \
--target "telegram:CHAT_ID" \
--message "Delete this file?" \
--buttons '[[{"text": "Yes", "callback_data": "delete_yes"}, {"text": "No", "callback_data": "delete_no"}]]'
Workflow Menu
openclaw message send \
--target "telegram:CHAT_ID" \
--message "What would you like to do?" \
--buttons '[[{"text": "🎬 Search", "callback_data": "wf_search"}, {"text": "📊 Metrics", "callback_data": "wf_metrics"}], [{"text": "📅 Calendar", "callback_data": "wf_calendar"}, {"text": "⚙️ Settings", "callback_data": "wf_settings"}]]'
Number Selection
openclaw message send \
--target "telegram:CHAT_ID" \
--message "How many results?" \
--buttons '[[{"text": "5", "callback_data": "count_5"}, {"text": "10", "callback_data": "count_10"}, {"text": "20", "callback_data": "count_20"}]]'
Best Practices
- Keep it mobile-friendly - 1-2 buttons per row maximum
- Use descriptive callback_data -
wf_searchnotbtn1 - Always edit after callback - Remove buttons to prevent confusion
- Add visual indicators - Emojis help distinguish button types (✅ 🎬 📊 ⚙️)
- Validate JSON - Use
scripts/validate_buttons.pybefore sending
Troubleshooting
Common Errors
"buttons[0][0] requires text and callback_data"
- Cause: Escaped quotes in JSON (
\"text\"instead of"text") - Fix: Use clean JSON without escaping
Buttons not appearing
- Cause: Invalid JSON structure
- Fix: Validate with
python3 scripts/validate_buttons.py 'YOUR_JSON'
Multiple buttons per user click
- Cause: Not editing original message after callback
- Fix: Always edit and remove buttons after handling callback
Resources
scripts/
send_buttons.sh- Helper for sending button messagesedit_message.sh- Helper for editing messagesvalidate_buttons.py- JSON validation before sending
references/
REFERENCE.md- Complete parameter reference and advanced examples
assets/examples/
basic_yes_no.sh- Simple confirmation dialogworkflows_menu.sh- Multi-option workflow menufull_flow_example.sh- Complete callback handling flow
Reviews (0)
No reviews yet. Be the first to review!
Comments (0)
No comments yet. Be the first to share your thoughts!