Primeros pasos
Acerca de Pabal
Qué es Pabal, cómo está construido, qué funciona hoy y qué todavía no.
Qué es Pabal
El pabal (파발, 擺撥) fue el sistema de postas de la época Joseon, en el que se cambiaba de caballo en cada posta para llevar, en relevos, las noticias urgentes. Pabal.me es una mensajería que toma ese nombre: una mensajería compatible con Telegram que una organización o comunidad opera en su propio servidor.
- El servidor lo operas tú. Cuentas, conversaciones y fotos se guardan en el servidor y la base de datos (PostgreSQL) del operador. El programa servidor se llama HunsTelegram (Java 21).
- Habla el mismo idioma que Telegram. Entre la aplicación y el servidor se usa el mismo MTProto 2.0 (capa 216) que en Telegram, y entre los bots y el servidor la misma Bot API HTTP que en Telegram. Por eso, las aplicaciones, bibliotecas y bots hechos para Telegram se conectan a Pabal cambiando solo la dirección.
- Es un mundo aparte, sin conexión con Telegram. Las cuentas de Pabal solo existen en el servidor Pabal, y no es posible intercambiar mensajes con usuarios de Telegram.
Cómo está construido
Explicación del diagrama
- Tres zonas: a la izquierda, lo que funciona fuera del servidor (aplicación, programas de bot, navegador); en el centro, las dos entradas del servidor; a la derecha, el interior del servidor. Los programas de bot también funcionan fuera del servidor, en el ordenador del operador o del desarrollador.
- Solo hay dos entradas: la aplicación se conecta directamente al puerto MTProto (8443) (MTProto se cifra por sí mismo, así que no necesita HTTPS), y el sitio web y la Bot API entran por HTTPS (443).
- Los bots se conectan por uno de dos caminos: normalmente por la Bot API sobre HTTPS (línea continua) y, si se quiere, también por MTProto como la aplicación (línea discontinua azul). En ambos casos es la misma cuenta de bot y el mismo buzón de mensajes.
- La línea discontinua roja es la única flecha que va en sentido contrario: cuando un bot configura un webhook, el servidor envía las novedades a la dirección HTTPS del programa del bot. Todo lo demás son peticiones que entran al servidor desde fuera.
- Todo se registra en un solo lugar: cada cambio pasa por los servicios y queda en el almacén de eventos de PostgreSQL; solo los originales de las fotos se guardan como archivos. Como los mensajes enviados desde la aplicación y los enviados por los bots recorren el mismo camino, las notificaciones push, la lista de chats y la recuperación al reconectarse funcionan igual para todos.
Lo que funciona hoy y lo que todavía no
| Función | Estado | Notas |
|---|---|---|
| Registro e inicio de sesión (número de teléfono + código) | Sí | El operador elige cómo se entrega el código: SMS, correo electrónico o entrega por el administrador |
| Chats uno a uno, recepción en tiempo real, varios dispositivos | Sí | Un dispositivo que estaba apagado recupera lo que se perdió al volver a encenderse |
| Editar y borrar mensajes | Sí | El cambio se refleja al instante también en la pantalla de la otra persona |
| Grupos básicos (crear, añadir y expulsar miembros, nombre) | Sí | Los miembros se añaden directamente desde la información del grupo |
| Enviar fotos, foto de perfil | Sí | Se guardan en un único tamaño, el original |
| Bots: @BotFather, Bot API HTTP, webhooks, bots MTProto | Sí | Botones, callbacks, menú de comandos, fotos y grupos |
| Panel de administración, ajustes de operación | Sí | Solo accesible en 127.0.0.1 del servidor |
| Sitio web en 10 idiomas, páginas de enlaces de nombre de usuario e invitación | Sí | La documentación para desarrolladores también está en 10 idiomas |
| Canales, supergrupos | Aún no | Puede que no se muestren bien en la aplicación |
| Archivos de documento, vídeo y voz, álbumes | Aún no | Si se envían, se rechazan con MEDIA_INVALID |
Texto con formato (negrita, cursiva), parse_mode de los bots | Aún no | El texto se envía tal cual. Comandos, menciones, enlaces y hashtags se marcan automáticamente |
| Llamadas de voz y vídeo, chats secretos | Aún no | |
| Verificación en dos pasos (contraseña en la nube) | Aún no | Si intentas activarla, se rechaza |
| Aplicaciones móviles, notificaciones push | Aún no | Por ahora, aplicación de escritorio para macOS |
| Unirse a un grupo mediante un enlace de invitación | Aún no | El enlace se crea, pero al pulsarlo no te hace miembro |
Modo inline (@bot consulta), pagos, juegos | Aún no |
Relación con Telegram
Pabal es un servidor independiente que sigue el protocolo público de Telegram. No tiene relación con la empresa Telegram y tampoco se conecta a los servidores de Telegram.
- Lo que es compatible: MTProto 2.0 (los 4 tipos de transporte, el handshake y la vinculación de claves temporales), el formato de peticiones y respuestas de la capa 216, y el formato de direcciones, peticiones, respuestas y errores de la Bot API HTTP. Se ha comprobado conectando la aplicación oficial Telegram Desktop 6.2.6 sin modificarla (cambiando solo la dirección del servidor y la clave pública).
- Lo que es distinto: las cuentas y los datos son propios de cada servidor. Los IDs de usuario, de mensaje y de archivo solo tienen sentido dentro de ese servidor. Los tokens de bot que usabas en Telegram no sirven: tienes que pedir uno nuevo al @BotFather de Pabal.
Formato de los enlaces
La aplicación y el servidor crean los enlaces con https://pabal.me/. Si los abres en el navegador, aparece una pequeña página que abre la aplicación.
| Enlace | Significado | Dirección que se abre en la aplicación |
|---|---|---|
pabal.me/<nombre_de_usuario> | Abrir el chat con una persona o un bot | tg://resolve?domain=<nombre_de_usuario> |
pabal.me/+<código_de_invitación> | Enlace de invitación a un grupo (abre la aplicación, pero todavía no permite unirse mediante el enlace) | tg://join?invite=<código_de_invitación> |
pabal.me/joinchat/<código_de_invitación> | Enlace de invitación en el formato antiguo (mismo significado) | tg://join?invite=<código_de_invitación> |
Un nombre de usuario tiene entre 5 y 32 caracteres (letras latinas, números y guion bajo) y empieza por una letra (el de un bot termina en bot). Los nombres que coinciden con rutas que usa el sitio, como docs, admin o health, no se abren como enlace.
Modelo de seguridad
- Aplicación ↔ servidor: se cifra con MTProto 2.0. La aplicación se compila con la clave pública RSA del servidor incorporada, así que otro servidor no puede hacerse pasar por el servidor Pabal. Las conversaciones son como los «chats en la nube» de Telegram, así que el servidor puede leer su contenido (no hay cifrado de extremo a extremo). Por eso el servidor debe operarlo alguien de confianza.
- Bot ↔ servidor: la Bot API solo se publica por HTTPS. El token de un bot es su contraseña: si se filtra, cámbialo con
/revokeen @BotFather. El token anterior y las conexiones abiertas con él se cortan al instante. - Servidor → webhook: el servidor solo envía peticiones a webhooks HTTPS con dirección pública. Rechaza direcciones internas como redes privadas, loopback o los metadatos de la nube. Con
secret_token, el bot puede comprobar que la petición viene de verdad del servidor Pabal. - Administración: el panel de administración solo está accesible desde el propio servidor (127.0.0.1), y hace falta un token para ver los datos. El operador entra mediante un túnel SSH.
- Almacenamiento: las claves de autorización están tal cual en la base de datos, porque el servidor las necesita para descifrar. La base de datos y las copias de seguridad deben protegerse tanto como la clave privada RSA del servidor.
Glosario
| Término | Significado |
|---|---|
| MTProto | El protocolo cifrado entre la aplicación y el servidor, creado por Telegram. Pabal usa la versión 2.0. |
| Capa (layer) | La edición del formato de las peticiones y respuestas que circulan sobre MTProto. Pabal usa la 216. |
| Clave de autorización (auth key) | El secreto de 2048 bits que la aplicación crea con el servidor la primera vez que se conecta. El inicio de sesión queda asociado a esta clave. |
| DC | El número de centro de datos de Telegram. En Pabal, un solo servidor atiende todos los DC del 1 al 5. |
| Actualización (update), pts | Un cambio, como un mensaje nuevo, una edición o un borrado. El pts es el número de orden de los cambios de cada usuario y permite a un dispositivo que estuvo desconectado saber qué se perdió. |
| Peer | La otra parte de un chat: una persona, un bot o un grupo. |
| Token de bot | Una cadena con la forma <ID del bot>:<secreto>. Se pone en la dirección de la Bot API para identificar al bot. |
| Webhook | Un modo en el que, en lugar de que el bot vaya a buscar las novedades, el servidor se las envía a su dirección HTTPS. |