Skip to main content

SDK для создания Telegram ботов на Cloudflare Workers

Project description

EdgeBot SDK

SDK для создания Telegram ботов на Cloudflare Workers с использованием Pyodide.

Описание

EdgeBot — это минималистичный, типизированный SDK для разработки Telegram ботов, работающих на edge-инфраструктуре Cloudflare Workers. Библиотека предоставляет декларативный API для обработки различных типов обновлений от Telegram и упрощает взаимодействие с Bot API.

Установка

pip install edgebot

Архитектура

SDK состоит из трех основных компонентов:

  • Bot — класс для регистрации обработчиков и маршрутизации обновлений
  • Context — объект контекста с данными обновления и методами для ответа
  • InlineKeyboard — builder для создания inline-клавиатур

API Reference

Bot

Основной класс для создания экземпляра бота и регистрации обработчиков.

Конструктор

Bot(token: str, parse_mode: Optional[str] = None)

Параметры:

  • token — токен Telegram бота
  • parse_mode — режим форматирования по умолчанию ("HTML", "Markdown", "MarkdownV2")

Методы регистрации обработчиков

Все декораторы принимают асинхронную функцию с сигнатурой async def handler(ctx: Context) -> None.

Текстовые сообщения и команды
  • @bot.on_message — обработчик всех текстовых сообщений
  • @bot.on_command(command: str) — обработчик команды (например, "/start")
Callback queries
  • @bot.on_callback — обработчик нажатий на inline-кнопки
Медиа-контент
  • @bot.on_photo — обработчик фотографий
  • @bot.on_video — обработчик видео
  • @bot.on_audio — обработчик аудиофайлов
  • @bot.on_voice — обработчик голосовых сообщений
  • @bot.on_document — обработчик документов
  • @bot.on_sticker — обработчик стикеров
  • @bot.on_animation — обработчик GIF-анимаций
Специальные типы
  • @bot.on_checklist — обработчик чеклистов
  • @bot.on_checklist_tasks_done — обработчик завершенных задач чеклиста

Обработка обновлений

async def process_update(update: dict[str, Any]) -> None

Обрабатывает входящее обновление от Telegram, вызывая соответствующие зарегистрированные обработчики.

Параметры:

  • update — словарь с данными обновления от Telegram API

Context

Объект контекста, передаваемый в каждый обработчик. Предоставляет доступ к данным обновления и методы для отправки ответов.

Атрибуты данных

Общие
  • update: dict — исходное обновление от Telegram
  • chat_id: Optional[int] — ID чата
  • message_id: Optional[int] — ID сообщения
  • from_user: Optional[dict] — информация об отправителе
  • message: Optional[dict] — объект сообщения
Текст и команды
  • text: str — текст сообщения
  • command: Optional[str] — команда (например, "/start"), если присутствует
Callback
  • callback_query: Optional[dict] — объект callback query
  • callback_data: Optional[str] — данные callback-кнопки
Медиа
  • photo: Optional[list[dict]] — массив фотографий разного разрешения
  • video: Optional[dict] — объект видео
  • audio: Optional[dict] — объект аудио
  • voice: Optional[dict] — объект голосового сообщения
  • document: Optional[dict] — объект документа
  • sticker: Optional[dict] — объект стикера
  • animation: Optional[dict] — объект GIF-анимации
Специальные
  • checklist: Optional[dict] — объект чеклиста
  • checklist_tasks_done: Optional[dict] — информация о завершенных задачах

Методы отправки

Текстовые сообщения
async def reply(
    text: str,
    reply_markup: Optional[dict] = None,
    parse_mode: Optional[str] = None
) -> dict

Отправляет ответ с reply на текущее сообщение.

async def send(
    text: str,
    reply_markup: Optional[dict] = None,
    parse_mode: Optional[str] = None
) -> dict

Отправляет новое сообщение без reply.

async def edit_message(
    text: str,
    reply_markup: Optional[dict] = None,
    parse_mode: Optional[str] = None
) -> dict

Редактирует текущее сообщение (используется в callback-обработчиках).

Медиа
async def send_photo(
    photo: str,
    caption: Optional[str] = None,
    reply_markup: Optional[dict] = None,
    parse_mode: Optional[str] = None
) -> dict

Отправляет фотографию по file_id или URL.

async def send_video(
    video: str,
    caption: Optional[str] = None,
    reply_markup: Optional[dict] = None,
    parse_mode: Optional[str] = None
) -> dict

Отправляет видео по file_id или URL.

async def send_animation(
    animation: str,
    caption: Optional[str] = None,
    reply_markup: Optional[dict] = None,
    parse_mode: Optional[str] = None
) -> dict

Отправляет GIF-анимацию по file_id или URL.

async def send_sticker(
    sticker: str,
    reply_markup: Optional[dict] = None
) -> dict

Отправляет стикер по file_id.

async def send_voice(
    voice: str,
    caption: Optional[str] = None,
    reply_markup: Optional[dict] = None,
    parse_mode: Optional[str] = None
) -> dict

Отправляет голосовое сообщение по file_id.

async def send_audio(
    audio: str,
    caption: Optional[str] = None,
    reply_markup: Optional[dict] = None,
    parse_mode: Optional[str] = None,
    title: Optional[str] = None,
    performer: Optional[str] = None
) -> dict

Отправляет аудиофайл по file_id или URL.

async def send_document(
    document: str,
    caption: Optional[str] = None,
    reply_markup: Optional[dict] = None,
    parse_mode: Optional[str] = None
) -> dict

Отправляет документ по file_id или URL.

Callback queries
async def answer_callback(
    text: Optional[str] = None,
    show_alert: bool = False
) -> dict

Отвечает на callback query (убирает индикатор загрузки на кнопке).


InlineKeyboard

Builder для создания inline-клавиатур.

Методы

def button(
    text: str,
    callback_data: Optional[str] = None,
    url: Optional[str] = None
) -> InlineKeyboard

Добавляет кнопку в текущий ряд. Параметры callback_data и url взаимоисключающие.

Параметры:

  • text — текст кнопки
  • callback_data — данные для callback
  • url — URL для кнопки-ссылки

Возвращает: self для chaining.

def row() -> InlineKeyboard

Завершает текущий ряд и начинает новый.

Возвращает: self для chaining.

def build() -> dict

Возвращает готовую структуру reply_markup для Telegram API.

Пример:

keyboard = InlineKeyboard()
keyboard.button("Кнопка 1", callback_data="btn1")
keyboard.button("Кнопка 2", callback_data="btn2")
keyboard.row()
keyboard.button("Ссылка", url="https://example.com")

await ctx.reply("Выберите действие:", reply_markup=keyboard.build())

Пример использования

Универсальный эхо-бот

Бот, который идентифицирует тип входящего контента и отправляет его обратно.

from workers import Response, WorkerEntrypoint
from edgebot import Bot, Context

class Default(WorkerEntrypoint):
    def __init__(self, env):
        super().__init__(env)
        self.bot = Bot(env.BOT_TOKEN)
        self.setup_handlers()
    
    def setup_handlers(self):
        @self.bot.on_command("/start")
        async def start(ctx: Context):
            await ctx.reply(
                "Эхо-бот запущен.\n"
                "Отправьте любой контент: текст, фото, видео, аудио, "
                "голосовое сообщение, документ, стикер или GIF."
            )
        
        @self.bot.on_message
        async def echo_text(ctx: Context):
            await ctx.reply(f"📝 Текст: {ctx.text}")
        
        @self.bot.on_photo
        async def echo_photo(ctx: Context):
            file_id = ctx.photo[-1]["file_id"]
            caption = "📷 Фото"
            await ctx.send_photo(file_id, caption=caption)
        
        @self.bot.on_video
        async def echo_video(ctx: Context):
            file_id = ctx.video["file_id"]
            caption = "🎬 Видео"
            await ctx.send_video(file_id, caption=caption)
        
        @self.bot.on_audio
        async def echo_audio(ctx: Context):
            file_id = ctx.audio["file_id"]
            title = ctx.audio.get("title", "Unknown")
            performer = ctx.audio.get("performer", "Unknown")
            caption = f"🎵 Аудио: {performer} - {title}"
            await ctx.send_audio(file_id, caption=caption)
        
        @self.bot.on_voice
        async def echo_voice(ctx: Context):
            file_id = ctx.voice["file_id"]
            duration = ctx.voice.get("duration", 0)
            caption = f"🎤 Голосовое сообщение ({duration} сек.)"
            await ctx.send_voice(file_id, caption=caption)
        
        @self.bot.on_document
        async def echo_document(ctx: Context):
            file_id = ctx.document["file_id"]
            file_name = ctx.document.get("file_name", "document")
            caption = f"📄 Документ: {file_name}"
            await ctx.send_document(file_id, caption=caption)
        
        @self.bot.on_sticker
        async def echo_sticker(ctx: Context):
            file_id = ctx.sticker["file_id"]
            await ctx.send_sticker(file_id)
        
        @self.bot.on_animation
        async def echo_animation(ctx: Context):
            file_id = ctx.animation["file_id"]
            caption = "🎞️ GIF-анимация"
            await ctx.send_animation(file_id, caption=caption)
    
    async def fetch(self, request):
        update = await request.json()
        await self.bot.process_update(update)
        return Response('{"ok": true}')

Обработка ошибок

Все исключения в обработчиках логируются в консоль. Рекомендуется оборачивать критичные участки в try-except:

@bot.on_message
async def handler(ctx: Context):
    try:
        # ваш код
        await ctx.reply("OK")
    except Exception as e:
        print(f"[error] handler failed: {e}")
        await ctx.reply("Произошла ошибка")

Интеграция с Cloudflare KV

Для сохранения состояния используйте Cloudflare KV:

class Default(WorkerEntrypoint):
    def __init__(self, env):
        super().__init__(env)
        self.bot = Bot(env.BOT_TOKEN)
        self.kv = env.BOT_STATE
    
    # в обработчиках:
    # await self.kv.put(key, value)
    # value = await self.kv.get(key)

Лицензия

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

edgebot-0.2.2.tar.gz (18.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

edgebot-0.2.2-py3-none-any.whl (24.6 kB view details)

Uploaded Python 3

File details

Details for the file edgebot-0.2.2.tar.gz.

File metadata

  • Download URL: edgebot-0.2.2.tar.gz
  • Upload date:
  • Size: 18.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for edgebot-0.2.2.tar.gz
Algorithm Hash digest
SHA256 47f1a1b01c6f11a1388c598cdaaf7714a4f0d29cc8a49483d55350e611796862
MD5 7bd7375e29e44baf9aff410adb4154d2
BLAKE2b-256 6ce90d925767f44b902d396c6be4952d3a6b44b7f81ce98d00f4a1ec0622f784

See more details on using hashes here.

File details

Details for the file edgebot-0.2.2-py3-none-any.whl.

File metadata

  • Download URL: edgebot-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 24.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for edgebot-0.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 41eb0f7d48fcec39a1ae7410edafeae3a9652a1bf4b01fa37ec3b85bc8892b59
MD5 7c37ae1f00749d329f742b24d3d5a361
BLAKE2b-256 ef745e6de608b0b37e2a1fa1559829227e74b794f612adc0473adfb184d63e1d

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