Bem-vindo ao Blog da DMarkInfo

Conteúdos e novidades sobre Tecnologia da Informação.

Guia Prático: Minha Primeira Aplicação Python Integrada ao Ejabberd (XMPP)

Postado por Eduardo Marques em 21/12/2025
Guia Prático: Minha Primeira Aplicação Python Integrada ao Ejabberd (XMPP)

Depois de mergulhar nos conceitos de XMPP e entender como o Ejabberd funciona na teoria, eu decidi construir algo de verdade — mesmo que simples — para realmente sentir como essa arquitetura opera na prática. Nada substitui o aprendizado que surge quando a gente bota a mão na massa.

Neste artigo, vou mostrar como instalei, configurei e conectei um cliente Python ao Ejabberd usando XMPP.
A ideia é construir um mini-cliente de chat capaz de:

conectar ao servidor
autenticar
enviar mensagens
receber mensagens em tempo real

Tudo isso em poucas linhas de Python.


1. Instalando o Ejabberd

Eu optei por usar a versão Docker, porque é a mais rápida para subir sem complicações.
Se quiser instalar manualmente, também funciona — mas pelo Docker é muito mais simples.

Subindo o Ejabberd no Docker

docker run -d --name ejabberd \
  -p 5222:5222 \
  -p 5280:5280 \
  -p 5269:5269 \
  rroemhild/ejabberd

 

Usuário padrão desse container:

  • Admin JID: admin@localhost

  • Senha: admin

Para acessar o painel administrativo:

http://localhost:5280/admin


2. Criando um usuário XMPP para testes

No painel do Ejabberd, criei um usuário simples para meu cliente Python:

  • JID: test1@localhost

  • Senha: 1234

Também criei um segundo usuário para simular uma conversa:

  • JID: test2@localhost

  • Senha: 1234

Assim consigo testar envio e recebimento.


3. Instalando o cliente XMPP em Python

A melhor biblioteca atual é slixmpp, compatível com asyncio.

pip install slixmpp

Criando meu primeiro cliente XMPP em Python

Eu queria algo simples, mas funcional: um script que conecta e envia uma mensagem.

Arquivo: send_message.py:
 
import asyncio
import slixmpp

class SendMsgBot(slixmpp.ClientXMPP):
    def __init__(self, jid, password, recipient, message):
        super().__init__(jid, password)
        self.recipient = recipient
        self.msg = message
        # Evento disparado quando a sessão XMPP está pronta
        self.add_event_handler("session_start", self.start)
    async def start(self, event):
        self.send_presence()
        await self.get_roster()
        # Envia mensagem
        self.send_message(
            mto=self.recipient,
            mbody=self.msg,
            mtype="chat"
        )
        print(f"Mensagem enviada para {self.recipient}")
        # Fecha conexão
        self.disconnect()

async def main():
    bot = SendMsgBot(
        "test1@localhost",        # JID
        "1234",                   # Senha
        "test2@localhost",        # Destinatário
        "Olá! Essa é minha primeira mensagem XMPP via Python!"
    )
    await bot.connect()
    await bot.process(forever=False)
asyncio.run(main())

Execução:

python send_message.py


5. Criando um cliente que recebe mensagens

Agora eu queria testar o fluxo inverso: ouvir mensagens chegando.

Arquivo: receive_messages.py:
 
import asyncio
import slixmpp

class ReceiverBot(slixmpp.ClientXMPP):
    def __init__(self, jid, password):
        super().__init__(jid, password)
        self.add_event_handler("session_start", self.start)
        self.add_event_handler("message", self.message)
    async def start(self, event):
        self.send_presence()
        await self.get_roster()
        print("Bot conectado. Aguardando mensagens...")
    def message(self, msg):
        if msg['type'] in ('chat', 'normal'):
            print(f"\n Nova mensagem de {msg['from']}: {msg['body']}")

async def main():
    bot = ReceiverBot("test2@localhost", "1234")
    await bot.connect()
    await bot.process(forever=True)
asyncio.run(main())

Execução:

python receive_messages.py

Agora, quando você rodar o outro script, verá as mensagens chegando em tempo real.


6. Dicas práticas que aprendi durante os testes

Use o painel admin do Ejabberd

Ele facilita muito para verificar usuários, conexões e tentativas de autenticação.

Logs do Docker ajudam MUITO

Se algo der errado:

docker logs ejabberd

Verifique o domínio usado

No meu caso, usei localhost, então o JID é:

test1@localhost

Se rodar em outra máquina, use o IP ou domínio real.

slixmpp é totalmente assíncrono

Isso é fantástico para aplicações maiores (chatbots, automação, IoT etc.)


7. Próximo passo: automatizando um mini-chat CLI

Depois desses testes, vou criar um CLI em Python que envia/recebe mensagens em tempo real, quase como um “telegram simplificado”. Em breve postarei em um novo artigo.

Criar minha primeira aplicação XMPP com Ejabberd e Python foi muito mais simples do que imaginei.
O protocolo é antigo, mas extremamente poderoso, extensível e seguro — e o Ejabberd é uma máquina robusta para implantar qualquer sistema de mensageria.

Agora tenho uma base prática para continuar explorando:

  • presença

  • roster (contatos)

  • salas MUC (multiusuário)

  • pub/sub

  • gateways

  • bots

Compartilhe este post:
Voltar para a Home