mirror of
https://github.com/EvolutionAPI/evolution-client-python.git
synced 2025-07-13 15:14:48 -06:00
507 lines
12 KiB
Markdown
507 lines
12 KiB
Markdown
# Evolution Client Python
|
|
|
|
Client Python para interagir com a API evolutionapi.
|
|
|
|
## Instalação
|
|
|
|
```bash
|
|
pip install evolutionapi
|
|
```
|
|
|
|
## Uso Básico
|
|
|
|
### Inicializando o Cliente
|
|
|
|
```python
|
|
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
|
|
```python
|
|
instances = client.instances.fetch_instances()
|
|
```
|
|
|
|
#### Criar Nova Instância
|
|
```python
|
|
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
|
|
```python
|
|
estado = client.instance_operations.connect(instance_id, instance_token)
|
|
```
|
|
|
|
#### Verificar Estado da Conexão
|
|
```python
|
|
estado = client.instance_operations.get_connection_state(instance_id, instance_token)
|
|
```
|
|
|
|
#### Definir Presença
|
|
```python
|
|
from evolutionapi.models.presence import PresenceStatus
|
|
|
|
client.instance_operations.set_presence(
|
|
instance_id,
|
|
PresenceStatus.AVAILABLE,
|
|
instance_token
|
|
)
|
|
```
|
|
|
|
### Enviando Mensagens
|
|
|
|
#### Mensagem de Texto
|
|
```python
|
|
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
|
|
```python
|
|
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
|
|
```python
|
|
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
|
|
```python
|
|
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
|
|
```python
|
|
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
|
|
```python
|
|
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
|
|
```python
|
|
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
|
|
```python
|
|
from evolutionapi.models.profile import ProfileName
|
|
|
|
config = ProfileName(
|
|
name="Novo Nome"
|
|
)
|
|
|
|
response = client.profile.update_profile_name(instance_id, config, instance_token)
|
|
```
|
|
|
|
#### Atualizar Status
|
|
```python
|
|
from evolutionapi.models.profile import ProfileStatus
|
|
|
|
config = ProfileStatus(
|
|
status="Novo status"
|
|
)
|
|
|
|
response = client.profile.update_profile_status(instance_id, config, instance_token)
|
|
```
|
|
|
|
#### Configurar Privacidade
|
|
```python
|
|
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
|
|
```python
|
|
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
|
|
```python
|
|
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
|
|
```python
|
|
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
|
|
```python
|
|
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
|
|
|
|
```python
|
|
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:
|
|
|
|
```python
|
|
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
|
|
|
|
```python
|
|
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
|
|
|
|
```python
|
|
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:
|
|
|
|
```python
|
|
# 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 |