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:
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.
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:
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— textomessage.from_user— remitentemessage.chat— chatmessage.message_id— IDmessage.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
Aún no hay comentarios.