Volver al inicio

obabot para bots de Telegram y Max

obabot — biblioteca Python asíncrona para lanzar bots en Telegram y Max con una sola API compatible con aiogram. Soporta FSM, filtros, teclados. La migración es mínima, modo de prueba sin tokens.

Lanzamiento de un bot en Telegram y Max con obabot
Advertisement 728x90

obabot: Biblioteca universal para bots de Telegram y Max

La biblioteca obabot te permite desplegar un único bot asíncrono en Python tanto en Telegram como en Max al mismo tiempo. Su API es totalmente compatible con aiogram 3.x: usa aiogram nativo para Telegram y un adaptador para Max que convierte los eventos en objetos compatibles. La instalación es de una sola línea: pip install obabot aiogram>=3.0.0 umaxbot>=0.1.7.

La función principal create_bot() recibe los tokens de las plataformas y devuelve una tupla (bot, dispatcher, router). Los manejadores de mensajes se escriben de forma unificada, sin importar la plataforma.

Ejemplos de inicialización

Para Telegram:

Google AdInline article slot
from obabot import create_bot
from obabot.filters import Command

bot, dp, router = create_bot(tg_token="YOUR_TG_TOKEN")

@router.message(Command("start"))
async def start(message):
    await message.answer(f"¡Hola desde {message.platform}!")

await dp.start_polling(bot)

Para Max:

from obabot import create_bot
from obabot.filters import Command

bot, dp, router = create_bot(max_token="YOUR_MAX_TOKEN")

@router.message(Command("start"))
async def start(message):
    await message.answer(f"¡Hola desde {message.platform}!")

await dp.start_polling(bot)

Para ambas plataformas en paralelo:

from obabot import create_bot
from obabot.filters import Command

bot, dp, router = create_bot(
    tg_token="YOUR_TG_TOKEN",
    max_token="YOUR_MAX_TOKEN"
)

@router.message(Command("start"))
async def start(message):
    await message.answer(f"¡Hola desde {message.platform}!")

await dp.start_polling(bot)

El atributo message.platform devuelve "telegram" o "max" para lógica específica de cada plataforma.

Google AdInline article slot

Migración desde aiogram

Cambiar de aiogram 3.x puro requiere cambios mínimos: solo intercambia las importaciones y usa create_bot() en lugar de Bot, Dispatcher y Router por separado.

Código original de aiogram:

from aiogram import Bot, Dispatcher, Router
from aiogram.filters import Command
from aiogram.fsm.state import State, StatesGroup
from aiogram.fsm.context import FSMContext

bot = Bot(token="TOKEN")
dp = Dispatcher()
router = Router()
dp.include_router(router)

@router.message(Command("start"))
async def start(message):
    await message.answer("¡Hola!")

await dp.start_polling(bot)

Después de la migración:

Google AdInline article slot
from obabot import create_bot
from obabot.filters import Command
from obabot.fsm import State, StatesGroup, FSMContext

bot, dp, router = create_bot(tg_token="TOKEN")

@router.message(Command("start"))
async def start(message):
    await message.answer("¡Hola!")

await dp.start_polling(bot)

El resto de tu código —incluyendo FSM, filtros y teclados— se mantiene exactamente igual.

Interfaz de Message y métodos básicos

Todos los objetos Message comparten una interfaz unificada:

  • message.text — texto
  • message.from_user — remitente
  • message.chat — chat
  • message.message_id — ID
  • message.platform — plataforma

Métodos:

  • await message.answer("Respuesta")
  • await message.reply("Respuesta al mensaje")
  • await message.delete()
  • await message.edit_text("Nuevo texto")

FSM: máquina de estados

FSM funciona igual que en aiogram:

from obabot.fsm import State, StatesGroup, FSMContext

class Form(StatesGroup):
    name = State()
    age = State()

@router.message(Command("start"))
async def start(message, state: FSMContext):
    await state.set_state(Form.name)
    await message.answer("¿Cuál es tu nombre?")

@router.message(Form.name)
async def process_name(message, state: FSMContext):
    await state.update_data(name=message.text)
    await state.set_state(Form.age)
    await message.answer("¿Qué edad tienes?")

Teclados en línea y filtros

Creando un teclado:

from obabot.types import InlineKeyboardMarkup, InlineKeyboardButton

keyboard = InlineKeyboardMarkup(inline_keyboard=[
    [
        InlineKeyboardButton(text="Botón 1", callback_data="btn1"),
        InlineKeyboardButton(text="Botón 2", callback_data="btn2"),
    ]
])

await message.answer("Elige uno:", reply_markup=keyboard)

Filtros:

  • @router.message(Command("start", "help")) — comandos múltiples
  • @router.message(F.text.startswith("!")) — prefijo
  • @router.message(F.photo) — fotos
  • @router.callback_query(F.data == "click") — callbacks

Pruebas sin tokens

test_mode=True omite todas las llamadas de red:

bot, dp, router = create_bot(test_mode=True)

Compatible con Python 3.10–3.14, aiogram 3.0.0–3.24. Cobertura completa de pruebas unitarias.

Lo más importante

  • Un solo código base: Un manejador para Telegram y Max, sin adaptadores.
  • Compatibilidad total: 100% API de aiogram 3.x + atributo platform.
  • FSM y filtros: Soporte completo para estados, teclados en línea, filtros mágicos F.
  • Migración fácil: Cambia 2 líneas de importación e inicialización.
  • Pruebas: Modo aislado sin llamadas a API.

— Editorial Team

Advertisement 728x90

Leer después