Evolution Client Python Client Python para interagir com a API evolutionapi.
Go to file
2025-03-06 09:22:02 -03:00
build/lib Refactor get_messages method in ChatService to include optional filters for message ID, sender, type, and timestamps. Update .gitignore to exclude evolutionapi.egg-info directory. Remove old distribution files and add new ones for version 0.0.9. 2025-01-16 17:42:49 -03:00
env feat: WebSocket service for event and connection management 2025-03-06 09:22:02 -03:00
evolutionapi feat: WebSocket service for event and connection management 2025-03-06 09:22:02 -03:00
.gitignore Update .gitignore to exclude evolutionapi.egg-info and dist/ directories; remove old distribution files (evolutionapi-0.0.9-py3-none-any.whl and evolutionapi-0.0.9.tar.gz) as part of cleanup for versioning. 2025-01-16 17:59:08 -03:00
publish.sh adjusts in package 2024-10-30 12:00:25 -03:00
README.md feat: WebSocket service for event and connection management 2025-03-06 09:22:02 -03:00
setup.py feat: WebSocket service for event and connection management 2025-03-06 09:22:02 -03:00
test_evolution.py feat: WebSocket service for event and connection management 2025-03-06 09:22:02 -03:00

Evolution Client Python

Client Python para interagir com a API evolutionapi.

Instalação

pip install evolutionapi

Uso Básico

Inicializando o Cliente

from evolutionapi.client import EvolutionClient

client = EvolutionClient(
    base_url='http://seu-servidor:porta',
    api_token='seu-token-api'
)

Gerenciamento de Instâncias

Listar Instâncias

instances = client.instances.fetch_instances()

Criar Nova Instância

from evolutionapi.models.instance import InstanceConfig

config = InstanceConfig(
    instanceName="minha-instancia",
    integration="WHATSAPP-BAILEYS",
    qrcode=True
)

nova_instancia = client.instances.create_instance(config)

Operações com Instâncias

Conectar Instância

estado = client.instance_operations.connect(instance_id, instance_token)

Verificar Estado da Conexão

estado = client.instance_operations.get_connection_state(instance_id, instance_token)

Definir Presença

from evolutionapi.models.presence import PresenceStatus

client.instance_operations.set_presence(
    instance_id,
    PresenceStatus.AVAILABLE,
    instance_token
)

Enviando Mensagens

Mensagem de Texto

from evolutionapi.models.message import TextMessage

mensagem = TextMessage(
    number="5511999999999",
    text="Olá, como vai?",
    delay=1000  # delay opcional em ms
)

response = client.messages.send_text(instance_id, mensagem, instance_token)

Mensagem de Mídia

from evolutionapi.models.message import MediaMessage, MediaType

mensagem = MediaMessage(
    number="5511999999999",
    mediatype=MediaType.IMAGE.value,
    mimetype="image/jpeg",
    caption="Minha imagem",
    media="base64_da_imagem_ou_url",
    fileName="imagem.jpg"
)

response = client.messages.send_media(instance_id, mensagem, instance_token)

Mensagem com Botões

from evolutionapi.models.message import ButtonMessage, Button

botoes = [
    Button(
        type="reply",
        displayText="Opção 1",
        id="1"
    ),
    Button(
        type="reply",
        displayText="Opção 2",
        id="2"
    )
]

mensagem = ButtonMessage(
    number="5511999999999",
    title="Título",
    description="Descrição",
    footer="Rodapé",
    buttons=botoes
)

response = client.messages.send_buttons(instance_id, mensagem, instance_token)

Mensagem com Lista

from evolutionapi.models.message import ListMessage, ListSection, ListRow

rows = [
    ListRow(
        title="Item 1",
        description="Descrição do item 1",
        rowId="1"
    ),
    ListRow(
        title="Item 2",
        description="Descrição do item 2",
        rowId="2"
    )
]

section = ListSection(
    title="Seção 1",
    rows=rows
)

mensagem = ListMessage(
    number="5511999999999",
    title="Título da Lista",
    description="Descrição da lista",
    buttonText="Clique aqui",
    footerText="Rodapé",
    sections=[section]
)

response = client.messages.send_list(instance_id, mensagem, instance_token)

Gerenciamento de Grupos

Criar Grupo

from evolutionapi.models.group import CreateGroup

config = CreateGroup(
    subject="Nome do Grupo",
    participants=["5511999999999", "5511888888888"],
    description="Descrição do grupo"
)

response = client.group.create_group(instance_id, config, instance_token)

Atualizar Foto do Grupo

from evolutionapi.models.group import GroupPicture

config = GroupPicture(
    image="base64_da_imagem"
)

response = client.group.update_group_picture(instance_id, "grupo_jid", config, instance_token)

Gerenciar Participantes

from evolutionapi.models.group import UpdateParticipant

config = UpdateParticipant(
    action="add",  # ou "remove", "promote", "demote"
    participants=["5511999999999"]
)

response = client.group.update_participant(instance_id, "grupo_jid", config, instance_token)

Gerenciamento de Perfil

Atualizar Nome do Perfil

from evolutionapi.models.profile import ProfileName

config = ProfileName(
    name="Novo Nome"
)

response = client.profile.update_profile_name(instance_id, config, instance_token)

Atualizar Status

from evolutionapi.models.profile import ProfileStatus

config = ProfileStatus(
    status="Novo status"
)

response = client.profile.update_profile_status(instance_id, config, instance_token)

Configurar Privacidade

from evolutionapi.models.profile import PrivacySettings

config = PrivacySettings(
    readreceipts="all",
    profile="contacts",
    status="contacts",
    online="all",
    last="contacts",
    groupadd="contacts"
)

response = client.profile.update_privacy_settings(instance_id, config, instance_token)

Operações de Chat

Verificar Números WhatsApp

from evolutionapi.models.chat import CheckIsWhatsappNumber

config = CheckIsWhatsappNumber(
    numbers=["5511999999999", "5511888888888"]
)

response = client.chat.check_is_whatsapp_numbers(instance_id, config, instance_token)

Marcar Mensagem como Lida

from evolutionapi.models.chat import ReadMessage

mensagem = ReadMessage(
    remote_jid="5511999999999@s.whatsapp.net",
    from_me=False,
    id="mensagem_id"
)

response = client.chat.mark_message_as_read(instance_id, [mensagem], instance_token)

Chamadas

Simular Chamada

from evolutionapi.models.call import FakeCall

config = FakeCall(
    number="5511999999999",
    isVideo=False,
    callDuration=30
)

response = client.calls.fake_call(instance_id, config, instance_token)

Labels

Gerenciar Labels

from evolutionapi.models.label import HandleLabel

config = HandleLabel(
    number="5511999999999",
    label_id="label_id",
    action="add"  # ou "remove"
)

response = client.label.handle_label(instance_id, config, instance_token)

WebSocket

O cliente Evolution API suporta conexão via WebSocket para receber eventos em tempo real. Aqui está um guia de como usar:

Configuração Básica

from evolutionapi.services.websocket import WebSocketManager
import logging

# Configuração do logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

# Configuração do WebSocket
websocket = WebSocketManager(
    base_url="http://localhost:8081",  # URL da sua Evolution API
    instance_id="teste",               # ID da sua instância
    api_token="seu-token-aqui"         # Token de autenticação
)

Registrando Handlers de Eventos

Você pode registrar handlers para diferentes tipos de eventos:

def handle_message(data):
    print(f"Nova mensagem recebida: {data}")

def handle_qrcode(data):
    print(f"QR Code atualizado: {data}")

# Registrando handlers
websocket.on("messages.upsert", handle_message)
websocket.on("qrcode.updated", handle_qrcode)

Eventos Disponíveis

Os eventos disponíveis são:

Eventos de Instância

  • application.startup: Disparado quando a aplicação inicia
  • instance.create: Disparado quando uma nova instância é criada
  • instance.delete: Disparado quando uma instância é deletada
  • remove.instance: Disparado quando uma instância é removida
  • logout.instance: Disparado quando uma instância faz logout

Eventos de Conexão e QR Code

  • qrcode.updated: Disparado quando o QR Code é atualizado
  • connection.update: Disparado quando o status da conexão muda
  • status.instance: Disparado quando o status da instância muda
  • creds.update: Disparado quando as credenciais são atualizadas

Eventos de Mensagens

  • messages.set: Disparado quando mensagens são definidas
  • messages.upsert: Disparado quando novas mensagens são recebidas
  • messages.edited: Disparado quando mensagens são editadas
  • messages.update: Disparado quando mensagens são atualizadas
  • messages.delete: Disparado quando mensagens são deletadas
  • send.message: Disparado quando uma mensagem é enviada
  • messaging-history.set: Disparado quando o histórico de mensagens é definido

Eventos de Contatos

  • contacts.set: Disparado quando contatos são definidos
  • contacts.upsert: Disparado quando novos contatos são adicionados
  • contacts.update: Disparado quando contatos são atualizados

Eventos de Chats

  • chats.set: Disparado quando chats são definidos
  • chats.update: Disparado quando chats são atualizados
  • chats.upsert: Disparado quando novos chats são adicionados
  • chats.delete: Disparado quando chats são deletados

Eventos de Grupos

  • groups.upsert: Disparado quando grupos são criados/atualizados
  • groups.update: Disparado quando grupos são atualizados
  • group-participants.update: Disparado quando participantes de um grupo são atualizados

Eventos de Presença

  • presence.update: Disparado quando o status de presença é atualizado

Eventos de Chamadas

  • call: Disparado quando há uma chamada

Eventos de Typebot

  • typebot.start: Disparado quando um typebot inicia
  • typebot.change-status: Disparado quando o status do typebot muda

Eventos de Labels

  • labels.edit: Disparado quando labels são editados
  • labels.association: Disparado quando labels são associados/desassociados

Exemplo de Uso com Eventos Específicos

def handle_messages(data):
    logger.info(f"Nova mensagem: {data}")

def handle_contacts(data):
    logger.info(f"Contatos atualizados: {data}")

def handle_groups(data):
    logger.info(f"Grupos atualizados: {data}")

def handle_presence(data):
    logger.info(f"Status de presença: {data}")

# Registrando handlers para diferentes eventos
websocket.on("messages.upsert", handle_messages)
websocket.on("contacts.upsert", handle_contacts)
websocket.on("groups.upsert", handle_groups)
websocket.on("presence.update", handle_presence)

Exemplo Completo

from evolutionapi.services.websocket import WebSocketManager
import logging
import time

# Configuração do logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

def handle_message(data):
    logger.info(f"Nova mensagem recebida: {data}")

def handle_qrcode(data):
    logger.info(f"QR Code atualizado: {data}")

def handle_connection(data):
    logger.info(f"Status da conexão: {data}")

def main():
    # Inicializa o WebSocket
    websocket = WebSocketManager(
        base_url="http://localhost:8081",
        instance_id="teste",
        api_token="seu-token-aqui"
    )

    # Registra os handlers
    websocket.on("messages.upsert", handle_message)
    websocket.on("qrcode.updated", handle_qrcode)
    websocket.on("connection.update", handle_connection)

    try:
        # Conecta ao WebSocket
        websocket.connect()
        logger.info("Conectado ao WebSocket. Aguardando eventos...")

        # Mantém o programa rodando
        while True:
            time.sleep(1)

    except KeyboardInterrupt:
        logger.info("Encerrando conexão...")
        websocket.disconnect()
    except Exception as e:
        logger.error(f"Erro: {e}")
        websocket.disconnect()

if __name__ == "__main__":
    main()

### Recursos Adicionais

#### Reconexão Automática

O WebSocket Manager possui reconexão automática com backoff exponencial:

```python
websocket = WebSocketManager(
    base_url="http://localhost:8081",
    instance_id="teste",
    api_token="seu-token-aqui",
    max_retries=5,        # Número máximo de tentativas de reconexão
    retry_delay=1.0       # Delay inicial entre tentativas em segundos
)

Logging

O WebSocket Manager utiliza o sistema de logging do Python. Você pode ajustar o nível de log conforme necessário:

# Para ver mais detalhes
logging.getLogger("evolutionapi.services.websocket").setLevel(logging.DEBUG)

Tratamento de Erros

O WebSocket Manager possui tratamento de erros robusto:

  • Reconexão automática em caso de desconexão
  • Logs detalhados de erros
  • Tratamento de eventos inválidos
  • Validação de dados recebidos

Dicas de Uso

  1. Sempre use try/except ao conectar ao WebSocket
  2. Implemente handlers para todos os eventos que você precisa monitorar
  3. Use logging para debug e monitoramento
  4. Considere implementar um mecanismo de heartbeat se necessário
  5. Mantenha o token de API seguro e não o exponha em logs