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.3.tar.gz (19.4 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.3-py3-none-any.whl (25.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: edgebot-0.2.3.tar.gz
  • Upload date:
  • Size: 19.4 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.3.tar.gz
Algorithm Hash digest
SHA256 f3d0f1d2d8ffbf67fb9046dbcfcabe6ab31fb57629f63815a53420c371fe83d2
MD5 7c1c7193016c112b0fa8a33f97a76529
BLAKE2b-256 605660bd2ae971a96928e9c03d56842b9754badbed300bb1d8a557b5db294b92

See more details on using hashes here.

File details

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

File metadata

  • Download URL: edgebot-0.2.3-py3-none-any.whl
  • Upload date:
  • Size: 25.8 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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 676968d8e985c5dfc2a5ccb464f2af51f364ae81c0ea3d5d7aa465e0765123a9
MD5 be47e37b9c5e6fa7a0d5611ac8868981
BLAKE2b-256 4bb0ded626dda8f00dd0be1983d4c262e9501788f459d25455a8ea162f9f6790

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