cli-tool/components/skills/development/telegram-bot-builder/SKILL.md
This skill should be used when the user asks to "create a Telegram bot", "build a Telegram chatbot", "set up a Telegram webhook", "add inline keyboards to a bot", "handle Telegram callback queries", "implement Telegram payments", "send media via Telegram bot", "configure Telegram bot commands", "deploy a Telegram bot", or mentions the Telegram Bot API, telegram bot tokens, getUpdates, setWebhook, or bot frameworks like node-telegram-bot-api, grammy, python-telegram-bot, or aiogram. Provides comprehensive guidance for building production-ready Telegram bots with Node.js and Python.
npx skillsauth add davila7/claude-code-templates Telegram Bot BuilderInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Comprehensive guidance for building Telegram bots using the Bot API (v9.4). Covers both Node.js and Python ecosystems with production-ready patterns for authentication, messaging, keyboards, media handling, payments, inline mode, webhooks, and deployment.
Use this skill when:
Every bot has a unique token obtained from @BotFather. Token format: 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11.
All API calls go to: https://api.telegram.org/bot<TOKEN>/METHOD_NAME
# .env file
BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
Store the token in environment variables. Never commit it to source code.
Long Polling (getUpdates) - Simpler, no HTTPS required, ideal for development:
// Node.js with node-telegram-bot-api
const bot = new TelegramBot(process.env.BOT_TOKEN, { polling: true });
# Python with python-telegram-bot
app = Application.builder().token(os.getenv("BOT_TOKEN")).build()
app.run_polling()
Webhook (setWebhook) - Better for production, lower latency, requires HTTPS (ports 443, 80, 88, or 8443):
bot.setWebHook('https://yourdomain.com/webhook', { secret_token: SECRET });
Choose polling for development and small bots. Choose webhooks for production deployments handling high traffic.
Send text with sendMessage. Supported parse modes:
<b>bold</b>, <i>italic</i>, <code>code</code>, <pre>block</pre>, <a href="url">link</a>, <tg-spoiler>spoiler</tg-spoiler>*bold*, _italic_, `code`, ```block```, [link](url), ||spoiler||. Requires escaping: _*[]()~>#+-=|{}.!Prefer HTML for easier escaping. Use MarkdownV2 when simpler formatting suffices.
Inline Keyboard - Buttons attached to messages:
bot.sendMessage(chatId, 'Choose:', {
reply_markup: {
inline_keyboard: [
[{ text: 'Option A', callback_data: 'a' }, { text: 'Option B', callback_data: 'b' }],
[{ text: 'Visit Site', url: 'https://example.com' }]
]
}
});
Reply Keyboard - Custom keyboard below input field:
bot.sendMessage(chatId, 'Choose:', {
reply_markup: {
keyboard: [[{ text: '📊 Stats' }, { text: '⚙️ Settings' }]],
resize_keyboard: true,
one_time_keyboard: true
}
});
Handle inline button presses with callback_query. The callback_data field is limited to 64 bytes. Always call answerCallbackQuery to dismiss the loading indicator.
// Photo (file_id, URL, or upload)
bot.sendPhoto(chatId, 'https://example.com/photo.jpg', { caption: 'A photo' });
// Document
bot.sendDocument(chatId, fs.createReadStream('./file.pdf'), { caption: 'Report' });
// Album (2-10 items)
bot.sendMediaGroup(chatId, [
{ type: 'photo', media: 'https://example.com/1.jpg', caption: 'First' },
{ type: 'photo', media: 'https://example.com/2.jpg' }
]);
Three ways to specify files: file_id (reuse previously uploaded), HTTP URL (Telegram downloads it), or multipart upload. File limits: 50MB upload, 20MB download via Bot API.
For multi-step interactions (registration, forms, wizards), maintain conversation state per chat:
Map or Redis to track { step, data } per chatIdConversationHandler from python-telegram-bot (built-in state machine)See reference/patterns_and_examples.md for complete conversation flow implementations.
Handle common error scenarios:
retry_after from response, wait, then retrydescription field)Rate limits: ~30 messages/second to different chats, ~20 messages/minute to same group. Implement exponential backoff for retries.
Register commands visible in the Telegram menu:
bot.setMyCommands([
{ command: 'start', description: 'Start the bot' },
{ command: 'help', description: 'Show help' },
{ command: 'settings', description: 'Bot settings' }
]);
Commands can be scoped to specific chats, users, or languages using BotCommandScope.
mkdir my-bot && cd my-bot
npm init -y
npm install node-telegram-bot-api dotenv
echo "BOT_TOKEN=your_token_here" > .env
mkdir my-bot && cd my-bot
pip install python-telegram-bot python-dotenv
echo "BOT_TOKEN=your_token_here" > .env
| Language | Library | Style | Best For |
|---|---|---|---|
| Node.js | node-telegram-bot-api | Callback-based | Simple bots, quick prototypes |
| Node.js | grammy | Middleware-based | Complex bots, plugins |
| Node.js | telegraf | Middleware-based | Mature ecosystem |
| Python | python-telegram-bot | Handler-based | Full-featured, conversations |
| Python | aiogram | Async-first | High-performance async bots |
| Category | Key Methods |
|---|---|
| Messages | sendMessage, sendPhoto, sendVideo, sendDocument, editMessageText, deleteMessage |
| Keyboards | InlineKeyboardMarkup, ReplyKeyboardMarkup, answerCallbackQuery |
| Chat Mgmt | getChat, banChatMember, promoteChatMember, setChatPermissions |
| Files | getFile, sendMediaGroup, sendDocument |
| Inline Mode | answerInlineQuery with InlineQueryResult* types |
| Payments | sendInvoice, answerPreCheckoutQuery (use currency: "XTR" for Telegram Stars) |
| Bot Config | setMyCommands, setMyDescription, setWebhook |
pm2 start bot.js --name telegram-bot - Process manager with auto-restartdocker-composeSee reference/patterns_and_examples.md for Docker, PM2, and serverless deployment configurations.
BOT_TOKEN in environment variablesX-Telegram-Bot-Api-Secret-Token on webhook endpointsallowed_updates to only needed typesFor detailed API documentation and implementation patterns, consult:
reference/api_methods.md - Complete list of 100+ Bot API methods organized by category (messaging, chat management, stickers, payments, inline mode, games, forum topics, gifts, passport, and more)reference/api_types.md - Complete list of 200+ Bot API types with all fields (Update, Message, Chat, User, keyboards, media types, payment types, chat members, reactions, and more)reference/patterns_and_examples.md - Production-ready implementation patterns for Node.js and Python including: inline keyboards, webhooks, media handling, conversation state management, database integration, admin panels, multi-language support, Docker/PM2/serverless deployment, Telegram Stars payments, and inline modeWhen building a bot, start with SKILL.md for core concepts, then load the appropriate reference file for detailed API information or implementation patterns as needed.
tools
No-code automation democratizes workflow building. Zapier and Make (formerly Integromat) let non-developers automate business processes without writing code. But no-code doesn't mean no-complexity - these platforms have their own patterns, pitfalls, and breaking points. This skill covers when to use which platform, how to build reliable automations, and when to graduate to code-based solutions. Key insight: Zapier optimizes for simplicity and integrations (7000+ apps), Make optimizes for power
tools
Use only when the user explicitly asks to stage, commit, push, and open a GitHub pull request in one flow using the GitHub CLI (`gh`).
tools
Workflow automation is the infrastructure that makes AI agents reliable. Without durable execution, a network hiccup during a 10-step payment flow means lost money and angry customers. With it, workflows resume exactly where they left off. This skill covers the platforms (n8n, Temporal, Inngest) and patterns (sequential, parallel, orchestrator-worker) that turn brittle scripts into production-grade automation. Key insight: The platforms make different tradeoffs. n8n optimizes for accessibility
development
Trigger.dev expert for background jobs, AI workflows, and reliable async execution with excellent developer experience and TypeScript-first design. Use when: trigger.dev, trigger dev, background task, ai background job, long running task.