WhatsApp API Multi Device Version
Um servidor de API WhatsApp multi-dispositivo para agentes e ferramentas de IA.
Documentação
Golang WhatsApp - Construído com Go para uso eficiente de memória
Se você está usando estas ferramentas para gerar renda, considere apoiar o desenvolvimento tornando-se um membro Patreon! Seu apoio ajuda a garantir que a biblioteca permaneça mantida e receba atualizações regulares!
Suporte para Arquitetura ARM & AMD juntamente com Suporte MCP
Download:
Suporte ao pacote n8n (n8n.io)
- Pacote n8n
- Vá para Configurações -> Community Nodes -> Insira
@aldinokemal2104/n8n-nodes-gowa-> Instalar
Mudanças de Quebra
v6- Para o modo REST, você precisa executar
<binary> restem vez de<binary>- por exemplo:
./whatsapp restem vez de./whatsapp - Para o modo MCP, você precisa executar
<binary> mcp - por exemplo:
./whatsapp mcp
- por exemplo:
- Para o modo REST, você precisa executar
v7- A partir da versão 7.x, estamos usando goreleaser para compilar o binário, então você pode baixar o binário do release
v8- Suporte a múltiplos dispositivos: Agora você pode conectar e gerenciar múltiplas contas WhatsApp simultaneamente em uma única instância do servidor
- Nova API de Gerenciamento de Dispositivos: Novos endpoints sob
/devicespara gerenciar múltiplos dispositivos - Escopo de dispositivo obrigatório: Todas as chamadas REST da API com escopo de dispositivo agora exigem:
- Cabeçalho
X-Device-Id, ou - Parâmetro de consultadevice_id- Se apenas um dispositivo estiver registrado, ele será usado como padrão - Escopo de dispositivo WebSocket: Conecte-se a
/ws?device_id=<id>para definir o escopo do WebSocket para um dispositivo específico - Suporte a UI remota: CORS permite os cabeçalhos
AuthorizationeX-Device-Id, então uma UI web independente (ex.: gowa-ui) hospedada em outra origem pode chamar a API diretamente.GET /app/infoexpõe a versão e os limites de tamanho de mídia. Como os navegadores não podem definir cabeçalhos em conexões WebSocket, passe/ws?device_id=<id>&authorization=<base64(user:pass)>quando a autenticação básica estiver habilitada (use TLS — a credencial fica visível na URL) - Mudanças no payload do webhook: Todos os payloads de webhook agora incluem um campo
device_idde nível superior identificando qual dispositivo recebeu o evento:
\`\`\`json { "event": "message", "device_id": "628123456789@s.whatsapp.net", "payload": { ... } } \`\`\` - Nova API de Gerenciamento de Dispositivos: Novos endpoints sob
- Suporte a múltiplos dispositivos: Agora você pode conectar e gerenciar múltiplas contas WhatsApp simultaneamente em uma única instância do servidor
v9- MCP e API estão unificados sob
rest: MCP não é mais um modo ou processo separado. Execute./whatsapp restpara servir tanto a API REST quanto o MCP; MCP está disponível em/mcp(sem subcomandomcpautônomo). Consulte Servidor MCP (Model Context Protocol) para detalhes de migração.- UI movida para um repositório separado: O painel web não está mais incluído neste repositório. Agora ele está em aldinokemal/gowa-ui e é distribuído como um único
gowa-ui.htmlautocontido. Este servidor agora é um backend de API puro que baixa a versão mais recente do painel na inicialização, verifica seu hash sha256, armazena em cache sobstorages/ui/, e o serve em/. Consulte Painel web (gowa-ui) para as configurações deAPP_UI_*, fixação da cadeia de suprimentos e implantação em ambiente isolado.
- UI movida para um repositório separado: O painel web não está mais incluído neste repositório. Agora ele está em aldinokemal/gowa-ui e é distribuído como um único
- MCP e API estão unificados sob
Recursos
- Enviar mensagem WhatsApp via API http, docs/openapi.yaml para mais detalhes
- Suporte a Servidor MCP (Model Context Protocol) - Integre-se a agentes e ferramentas de IA usando protocolo padronizado
- Mencionar alguém
@phoneNumber- exemplo:
Hello @628974812XXXX, @628974812XXXX
- exemplo:
- Menções Fantasma (Mencionar Todos) - Mencione participantes do grupo sem mostrar
@phoneno texto da mensagem- Passe números de telefone no campo
mentionspara mencionar usuários sem@visível na mensagem- Use a palavra-chave especial
@everyonepara mencionar automaticamente TODOS os participantes do grupo - Caixa de seleção na UI disponível no modal Enviar Mensagem para grupos
- Use a palavra-chave especial
- Passe números de telefone no campo
- Publicar Status do WhatsApp
- Enviar Figurinhas - Converte automaticamente imagens para o formato de figurinha WebP
- Suporta formatos JPG, JPEG, PNG, WebP e GIF
- Redimensionamento automático para 512x512 pixels
- Preserva transparência para imagens PNG
- Figurinhas WebP animadas são suportadas, mas devem atender aos requisitos do WhatsApp:
- Devem ter exatamente 512x512 pixels - Devem ter menos de 500KB de tamanho de arquivo - Duração máxima de 10 segundos - Se sua figurinha animada não atender a esses requisitos, redimensione-a antes de enviar usando ferramentas como ezgif.com
- Suporta formatos JPG, JPEG, PNG, WebP e GIF
- Comprimir imagem antes de enviar
- Comprimir vídeo antes de enviar
- Alterar o nome do SO para o seu aplicativo (é o nome do dispositivo ao conectar via celular)
--os=Chromeou--os=MyApplication
- Autenticação Básica (capaz de adicionar múltiplas credenciais)
--basic-auth=kemal:secret,toni:password,userName:secretPassword, ou você pode simplificar-b=kemal:secret,toni:password,userName:secretPassword
- Suporte a implantação em subcaminho
--base-path="/gowa"(permite implantação sob um caminho específico como/gowa/sub/path)
- Porta personalizável e modo de depuração
--port 8000--debug true
- Resposta automática de mensagens
--autoreply="Don't reply this message"
- Marcação automática de leitura de mensagens recebidas
--auto-mark-read=true(marca automaticamente mensagens recebidas como lidas)
- Download automático de mídia de mensagens recebidas
--auto-download-media=false(desativa downloads automáticos de mídia, padrão:true)
- Rejeição automática de chamadas recebidas
--auto-reject-call=trueouWHATSAPP_AUTO_REJECT_CALL=true(consulte Payload do Webhook para eventos de chamada)
- Presença configurável ao conectar
--presence-on-connect=unavailableouWHATSAPP_PRESENCE_ON_CONNECT=unavailableavailable— marcar como online (suprime notificações do telefone)unavailable— registrar pushname sem ficar online (padrão, preserva notificações do telefone)none— pular presença completamente (pushname não será registrado, contatos podem ver "-" como nome)
- Pulso diário de presença
--presence-pulse-enabled=trueouWHATSAPP_PRESENCE_PULSE_ENABLED=true(padrão:true)--presence-pulse-interval=24hcontrola com que frequência cada dispositivo conectado recebe o pulso--presence-pulse-duration=5mcontrola por quanto tempo a conta permaneceavailableantes de retornar aunavailable
- Webhook para mensagem recebida
--webhook="http://yourwebhook.site/handler", ou você pode simplificar-w="http://yourwebhook.site/handler"- para mais detalhes, consulte Documentação do Payload do Webhook
- Webhook por Dispositivo - Cada dispositivo pode ter sua própria URL de webhook
- Definir via API:
PATCH /devices/:device_id/webhookcom{"webhook_url": "https://device-webhook.site/handler"}- Obter via API:
GET /devices/:device_id/webhook - Quando um dispositivo tem um webhook personalizado, eventos para esse dispositivo são enviados para a URL específica do dispositivo
- Quando nenhum webhook de dispositivo é definido, os eventos voltam para o webhook global (
--webhook) - Defina como string vazia
""via PATCH para limpar e usar o webhook global
- Obter via API:
- Definir via API:
- Segredo do Webhook Nosso webhook será enviado a você com um cabeçalho HMAC e uma chave padrão sha256
secret. Você pode modificar isso usando a opção abaixo:--webhook-secret="secret"
- Documentação do Payload do Webhook Para esquemas detalhados de payload de webhook, implementação de segurança e exemplos de integração, consulte Documentação do Payload do Webhook
- Filtragem de Eventos do Webhook Você pode filtrar quais eventos são encaminhados para seu webhook usando:
--webhook-events="message,message.ack"(lista separada por vírgulas)- Ou variável de ambiente:
WHATSAPP_WEBHOOK_EVENTS=message,message.ackEventos de Webhook Disponíveis: | Evento | Descrição | | --- | --- | |message| Mensagens de texto, mídia, contato, localização | |message.reaction| Reações de emoji a mensagens | |message.revoked| Mensagens excluídas/revogadas | |message.edited| Mensagens editadas | |message.ack| Confirmações de entrega e leitura | |message.deleted| Mensagens excluídas para o usuário | |chat_presence| Indicadores de digitação e gravação de contatos | |group.participants| Eventos de entrada/saída/promoção/rebaixamento de membros do grupo | |group.joined| Você foi adicionado a um grupo | |label.edit| Metadados de etiqueta do WhatsApp alterados | |label.association| Etiqueta aplicada ou removida de um chat | |newsletter.joined| Você se inscreveu em um boletim informativo/canal | |newsletter.left| Você cancelou a inscrição em um boletim informativo | |newsletter.message| Nova(s) mensagem(ns) publicada(s) em um boletim informativo | |newsletter.mute| Configuração de silenciamento do boletim informativo alterada | |call.offer| Chamada recebida | Se não configurado (vazio), todos os eventos serão encaminhados.
- Ou variável de ambiente:
- Filtragem de JID do Webhook
Você pode pular eventos para chats ou remetentes específicos (ex.: silenciar todos os grupos) antes de serem encaminhados:
--webhook-ignore-jids="@g.us,628123456789@s.whatsapp.net"(lista separada por vírgulas)- Ou variável de ambiente:
WHATSAPP_WEBHOOK_IGNORE_JIDS=@g.us - Suporta os curingas
@g.us/@s.whatsapp.net/@lid(correspondem a um espaço de endereço inteiro) e JIDs exatos. - Isso filtra por conversa/remetente e é independente de
--webhook-events(que filtra por tipo de evento). A integração Chatwoot mantém seu próprioCHATWOOT_IGNORE_JIDS.
- Ou variável de ambiente:
- Configuração TLS do Webhook
Se você encontrar erros de verificação de certificado TLS ao usar webhooks (ex.: com túneis Cloudflare ou certificados autoassinados):
Você pode desativar a verificação de certificado TLS usando:tls: failed to verify certificate: x509: certificate signed by unknown authority--webhook-insecure-skip-verify=true- Ou variável de ambiente:
WHATSAPP_WEBHOOK_INSECURE_SKIP_VERIFY=trueAviso de Segurança: Esta opção desativa a verificação de certificado TLS e deve ser usada apenas em:
- Ou variável de ambiente:
- Ambientes de desenvolvimento/teste
- Túneis Cloudflare (que fornecem sua própria camada de segurança)
- Redes internas com certificados autoassinados Para ambientes de produção, é fortemente recomendado usar certificados SSL adequados (ex.: Let's Encrypt) em vez de desativar a verificação.
Configuração
Você pode configurar o aplicativo usando flags de linha de comando (mostradas acima) ou variáveis de ambiente. A configuração pode ser definida de três maneiras (em ordem de prioridade):
- Flags de linha de comando (maior prioridade)
- Variáveis de ambiente
- Arquivo
.env(menor prioridade)
Variáveis de Ambiente
Você pode configurar o aplicativo usando variáveis de ambiente. A configuração pode ser definida de três maneiras (em ordem de prioridade):
- Flags de linha de comando (maior prioridade)
- Variáveis de ambiente
- Arquivo
.env(menor prioridade)
Para usar variáveis de ambiente:
- Copie
.env.examplepara.envna raiz do seu projeto (cp src/.env.example src/.env) - Modifique os valores em
.envde acordo com suas necessidades - Ou defina as mesmas variáveis como variáveis de ambiente do sistema
Variáveis de Ambiente Disponíveis
| Variável | Descrição | Padrão | Exemplo |
|---|---|---|---|
APP_PORT | Porta da aplicação | 3000 | APP_PORT=8080 |
APP_HOST | Endereço do host para vincular o servidor | 0.0.0.0 | APP_HOST=127.0.0.1 |
APP_DEBUG | Ativar registro de depuração | false | APP_DEBUG=true |
APP_OS | Nome do SO (nome do dispositivo no WhatsApp) | GOWA | APP_OS=MyApp |
APP_BASIC_AUTH | Credenciais de autenticação básica | - | APP_BASIC_AUTH=user1:pass1,user2:pass2 |
APP_BASE_PATH | Caminho base para implantação em subcaminho | - | APP_BASE_PATH=/gowa |
APP_TRUSTED_PROXIES | Faixas de IP de proxy confiável para proxy reverso | - | APP_TRUSTED_PROXIES=0.0.0.0/0 |
APP_CORS_ALLOWED_ORIGINS | Origens CORS permitidas (qualquer origem quando vazio) | - | APP_CORS_ALLOWED_ORIGINS=https://ui.example.com |
DB_URI | URI de conexão do banco de dados | file:storages/whatsapp.db | DB_URI=postgres://user:pass@host/db |
DB_KEYS_URI | URI opcional do banco de dados para cache de criptografia/chave de sessão. Deixe em branco para usar DB_URI; evite armazenamento em memória em produção porque reinicializações podem perder o estado da sessão do WhatsApp. | - | DB_KEYS_URI=file:storages/whatsapp-keys.db?_foreign_keys=on |
CHAT_STORAGE_MAX_OPEN_CONNS | Máximo de conexões SQLite simultâneas para armazenamento de conversas | 5 | CHAT_STORAGE_MAX_OPEN_CONNS=10 |
WHATSAPP_AUTO_REPLY | Mensagem de resposta automática | - | WHATSAPP_AUTO_REPLY="Auto reply message" |
WHATSAPP_AUTO_MARK_READ | Marcar automaticamente mensagens recebidas como lidas | false | WHATSAPP_AUTO_MARK_READ=true |
WHATSAPP_AUTO_DOWNLOAD_MEDIA | Baixar automaticamente mídia de mensagens recebidas | true | WHATSAPP_AUTO_DOWNLOAD_MEDIA=false |
WHATSAPP_AUTO_REJECT_CALL | Rejeitar automaticamente chamadas recebidas do WhatsApp | false | WHATSAPP_AUTO_REJECT_CALL=true |
WHATSAPP_WEBHOOK | URL(s) de webhook para eventos (separados por vírgula) | - | WHATSAPP_WEBHOOK=https://webhook.site/xxx |
WHATSAPP_WEBHOOK_SECRET | Segredo do webhook para validação | secret | WHATSAPP_WEBHOOK_SECRET=super-secret-key |
WHATSAPP_WEBHOOK_INSECURE_SKIP_VERIFY | Ignorar verificação TLS para webhooks (inseguro) | false | WHATSAPP_WEBHOOK_INSECURE_SKIP_VERIFY=true |
WHATSAPP_WEBHOOK_EVENTS | Lista de permissões de eventos para encaminhar (separados por vírgula, vazio = todos) | - | WHATSAPP_WEBHOOK_EVENTS=message,message.ack |
WHATSAPP_WEBHOOK_IGNORE_JIDS | JIDs/curingas para ignorar ao encaminhar (separados por vírgula) | - | WHATSAPP_WEBHOOK_IGNORE_JIDS=@g.us |
WHATSAPP_ACCOUNT_VALIDATION | Ativar validação de conta | true | WHATSAPP_ACCOUNT_VALIDATION=false |
WHATSAPP_PRESENCE_ON_CONNECT | Presença ao conectar: available, unavailable ou none | unavailable | WHATSAPP_PRESENCE_ON_CONNECT=unavailable |
WHATSAPP_PROXY | Proxy de saída para o WebSocket do WhatsApp (socks5/http/https) | - | WHATSAPP_PROXY=socks5://user:pass@host:1080 |
WHATSAPP_PRESENCE_PULSE_ENABLED | Ativar pulso diário de presença disponível/indisponível | true | WHATSAPP_PRESENCE_PULSE_ENABLED=false |
WHATSAPP_PRESENCE_PULSE_INTERVAL | Intervalo entre pulsos de presença | 24h | WHATSAPP_PRESENCE_PULSE_INTERVAL=24h |
WHATSAPP_PRESENCE_PULSE_DURATION | Duração para permanecer disponível durante cada pulso | 5m | WHATSAPP_PRESENCE_PULSE_DURATION=5m |
CHATWOOT_ENABLED | Ativar integração com Chatwoot | false | CHATWOOT_ENABLED=true |
CHATWOOT_URL | URL da instância do Chatwoot | - | CHATWOOT_URL=https://app.chatwoot.com |
CHATWOOT_API_TOKEN | Token de acesso da API do Chatwoot | - | CHATWOOT_API_TOKEN=your-api-token |
CHATWOOT_ACCOUNT_ID | ID da conta do Chatwoot | - | CHATWOOT_ACCOUNT_ID=12345 |
CHATWOOT_INBOX_ID | ID da caixa de entrada do Chatwoot | - | CHATWOOT_INBOX_ID=67890 |
CHATWOOT_DEVICE_ID | ID do dispositivo WhatsApp para Chatwoot (dispositivo único / fallback de env) | - | CHATWOOT_DEVICE_ID=628xxx@s.whatsapp.net |
CHATWOOT_ALLOWED_HOSTS | Lista de permissões de hosts do Chatwoot para configurações por dispositivo (proteção SSRF) | - | CHATWOOT_ALLOWED_HOSTS=app.chatwoot.com,chat.example.com |
CHATWOOT_IMPORT_MESSAGES | Ativar sincronização de histórico de mensagens para o Chatwoot | false | CHATWOOT_IMPORT_MESSAGES=true |
CHATWOOT_DAYS_LIMIT_IMPORT_MESSAGES | Dias de histórico para importar | 3 | CHATWOOT_DAYS_LIMIT_IMPORT_MESSAGES=7 |
CHATWOOT_IMPORT_DB_URI | URI PostgreSQL direto do Chatwoot para sincronização de histórico | - | CHATWOOT_IMPORT_DB_URI=postgresql://user:pass@host:5432/chatwoot_production?sslmode=disable |
CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE | Inserir espaços reservados de texto para linhas de mídia durante importação direta no banco | true | CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE=true |
CHATWOOT_IMPORT_MEDIA_WITH_REST | Enviar linhas de mídia de importação direta no banco via REST do Chatwoot | false | CHATWOOT_IMPORT_MEDIA_WITH_REST=true |
CHATWOOT_AUTO_CREATE | Criar automaticamente ou reutilizar a caixa de entrada da API do Chatwoot na inicialização | false | CHATWOOT_AUTO_CREATE=true |
CHATWOOT_INBOX_NAME | Nome da caixa de entrada usado quando a criação automática está ativada | WhatsApp | CHATWOOT_INBOX_NAME=WhatsApp Support |
CHATWOOT_WEBHOOK_URL | URL pública do webhook de resposta do GOWA Chatwoot | - | CHATWOOT_WEBHOOK_URL=https://api.example.com/chatwoot/webhook?secret=shared |
CHATWOOT_WEBHOOK_SECRET | Segredo compartilhado exigido para webhooks recebidos do Chatwoot | - | CHATWOOT_WEBHOOK_SECRET=shared |
CHATWOOT_REOPEN_CONVERSATION | Reabrir conversas resolvidas do Chatwoot para contatos que retornam | true | CHATWOOT_REOPEN_CONVERSATION=false |
CHATWOOT_CONVERSATION_PENDING | Criar novas conversas do Chatwoot como pendentes | false | CHATWOOT_CONVERSATION_PENDING=true |
CHATWOOT_IGNORE_JIDS | JIDs ou curingas para excluir do encaminhamento do Chatwoot | - | CHATWOOT_IGNORE_JIDS=@g.us,628123@s.whatsapp.net |
CHATWOOT_SIGN_MSG | Prefixar respostas de agentes do Chatwoot com o nome do agente | false | CHATWOOT_SIGN_MSG=true |
CHATWOOT_SIGN_DELIMITER | Delimitador entre a assinatura do agente do Chatwoot e o corpo da mensagem | \n\n | CHATWOOT_SIGN_DELIMITER=" - " |
CHATWOOT_FORWARD_EDITS | Espelhar edições do WhatsApp em notas encadeadas do Chatwoot | true | CHATWOOT_FORWARD_EDITS=false |
CHATWOOT_FORWARD_DELETES | Espelhar eventos de exclusão para todos do WhatsApp em notas do Chatwoot | true | CHATWOOT_FORWARD_DELETES=false |
CHATWOOT_MESSAGE_READ | Sincronizar estado de leitura para mensagens vinculadas do WhatsApp/Chatwoot | false | CHATWOOT_MESSAGE_READ=true |
CHATWOOT_MESSAGE_DELETE | Excluir mensagens vinculadas do lado oposto quando a exclusão for relatada | false | CHATWOOT_MESSAGE_DELETE=true |
Documentação:
- Para esquemas detalhados de payload de webhook, implementação de segurança e exemplos de integração, consulte Documentação de Payload de Webhook
- Para um guia abrangente de integração com Chatwoot, consulte Documentação de Integração com Chatwoot
Nota: Os sinalizadores de linha de comando substituirão quaisquer valores definidos em variáveis de ambiente ou no arquivo .env.
- Para mais comandos
./whatsapp --help
Requisitos
Requisitos do Sistema
- Go 1.26.0 ou superior (para compilar a partir do código-fonte)
- FFmpeg (para processamento de mídia)
Suporte de Plataforma
- Linux (x86_64, ARM64)
- macOS (Intel, Apple Silicon)
- Windows (x86_64) - WSL recomendado
Dependências (sem docker)
- Mac OS:
brew install ffmpeg webpexport CGO_CFLAGS_ALLOW="-Xpreprocessor"
- Linux:
sudo apt updatesudo apt install ffmpeg webp
- Windows (não recomendado, prefira usar WSL):
- Instale o ffmpeg: baixe aqui
- Instale o libwebp: baixe aqui (extraia e adicione a pasta
binao PATH) - Adicione ambos à variável de ambiente
- Instale o libwebp: baixe aqui (extraia e adicione a pasta
- Instale o ffmpeg: baixe aqui
Nota: O pacote
webpfornece as ferramentascwebp(codificador),dwebp(decodificador) ewebpmux(extrator de quadros). O FFmpeg é necessário para processamento de mídia. As ferramentas libwebp (webpmux+dwebp) são usadas para suporte a figurinhas WebP animadas.
Como usar
Básico
- Clone este repositório:
git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice - Abra a pasta clonada via cmd/terminal.
- execute
cd src - execute
go run . rest(para modo REST API) - Abra
http://localhost:3000
Docker (você não precisa instalar os requisitos)
- Clone este repositório:
git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice - Abra a pasta clonada via cmd/terminal.
- execute
docker-compose up -d --build - abra
http://localhost:3000
Compile seu próprio binário
- Clone este repositório
git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice - Abra a pasta clonada via cmd/terminal.
- execute
cd src - execute
- Linux e MacOS:
go build -o whatsapp2. Windows (CMD / PowerShell):go build -o whatsapp.exe
- Linux e MacOS:
- execute
- Linux e MacOS:
./whatsapp rest(para modo REST API)- execute
./whatsapp --helppara mais detalhes de sinalizadores - Windows:
.\whatsapp.exe rest(para modo REST API) - execute
.\whatsapp.exe --helppara mais detalhes de sinalizadores
- execute
- Linux e MacOS:
- abra
http://localhost:3000no navegador
Compilação Cruzada para Raspberry Pi (ARM)
Se você quiser compilar para Raspberry Pi ou outros dispositivos ARM sem precisar de um toolchain C (CGO), você pode usar a tag de compilação purego. Isso usará uma implementação SQLite pura em Go.
- Clone este repositório
git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice - Abra a pasta clonada via cmd/terminal.
- execute
cd src - Compile para Raspberry Pi Zero / 1 (ARMv6):
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -tags purego -o whatsapp-armv6 - Compile para Raspberry Pi 2 / 3 / 4 (ARMv7 32 bits):
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -tags purego -o whatsapp-armv7 - Transfira o binário para o seu Pi, dê permissão de execução (
chmod +x) e execute-o:- Se você compilou ARMv6:
./whatsapp-armv6 rest- Se você compilou ARMv7:
./whatsapp-armv7 rest
- Se você compilou ARMv7:
- Se você compilou ARMv6:
Servidor MCP (Model Context Protocol)
MCP não é um modo ou processo separado — ele é servido pelo próprio servidor REST. Sempre que ./whatsapp rest estiver em execução, o endpoint MCP está disponível em http://<host>:<port><base-path>/mcp (padrão http://localhost:3000/mcp) usando o transporte HTTP streamable. Desative-o com MCP_ENABLED=false ou --mcp-enabled=false (padrão: ativado).
Ferramentas MCP Disponíveis
Existem 5 ferramentas consolidadas; os agentes escolhem o comportamento por meio de um argumento type / action em vez de uma ferramenta por operação:
| Ferramenta | Valores de type / action |
|---|---|
whatsapp_send | text, image, video, audio, document, sticker, location, contact, poll, link, forward |
whatsapp_message | react, edit, revoke, delete, mark_read, star, unstar, download_media |
whatsapp_chat | list_chats, list_contacts, get_messages, archive |
whatsapp_group | create, join_with_link, leave, info, participants, add_participants, remove_participants, promote, demote, invite_link, set_name, set_topic, set_settings, join_requests, manage_join_requests |
whatsapp_app | status, login_qr, login_code, logout, reconnect |
Seleção de Dispositivo
Para implantações com vários dispositivos, o cabeçalho X-Device-Id na conexão do cliente MCP seleciona o dispositivo usado por cada chamada de ferramenta nessa conexão (usa o dispositivo padrão se omitido, igual ao REST). Qualquer chamada individual pode substituí-lo com um argumento opcional device_id.
Configuração MCP
Aponte seu cliente MCP para o endpoint /mcp. Ele herda a autenticação básica do servidor REST, então inclua o mesmo cabeçalho Authorization que suas chamadas REST usam:
{
"mcpServers": {
"whatsapp": {
"url": "http://localhost:3000/mcp",
"headers": {
"Authorization": "Basic dXNlcjpzZWNyZXQ=",
"X-Device-Id": "628123456789"
}
}
}
}
headers é opcional: inclua Authorization apenas quando a autenticação básica estiver configurada, e X-Device-Id apenas para configurações com vários dispositivos.
Migrando do modo MCP autônomo
./whatsapp mcp→./whatsapp rest(MCP agora é incluído automaticamente)http://localhost:8080/sse→http://localhost:3000/mcp- 40 ferramentas granulares → 5 ferramentas consolidadas (os agentes escolhem ações por meio do campo
type/action)
Modo de Produção REST (docker)
Usando Docker Hub:
docker run --detach --publish=3000:3000 --name=whatsapp --restart=always --volume=$(docker volume create --name=whatsapp):/app/storages aldinokemal2104/go-whatsapp-web-multidevice rest --autoreply="Dont't reply this message please"
Usando GitHub Container Registry:
docker run --detach --publish=3000:3000 --name=whatsapp --restart=always --volume=$(docker volume create --name=whatsapp):/app/storages ghcr.io/aldinokemal/go-whatsapp-web-multidevice rest --autoreply="Dont't reply this message please"
Modo de Produção REST (docker compose)
crie o arquivo docker-compose.yml com a seguinte configuração:
Usando Docker Hub:
services:
whatsapp:
image: aldinokemal2104/go-whatsapp-web-multidevice
container_name: whatsapp
restart: always
ports:
- "3000:3000"
volumes:
- whatsapp:/app/storages
command:
- rest
- --basic-auth=admin:admin
- --port=3000
- --debug=true
- --os=Chrome
- --account-validation=false
volumes:
whatsapp:
Usando GitHub Container Registry:
services:
whatsapp:
image: ghcr.io/aldinokemal/go-whatsapp-web-multidevice
container_name: whatsapp
restart: always
ports:
- "3000:3000"
volumes:
- whatsapp:/app/storages
command:
- rest
- --basic-auth=admin:admin
- --port=3000
- --debug=true
- --os=Chrome
- --account-validation=false
volumes:
whatsapp:
ou com arquivo env (Docker Hub):
services:
whatsapp:
image: aldinokemal2104/go-whatsapp-web-multidevice
container_name: whatsapp
restart: always
ports:
- "3000:3000"
volumes:
- whatsapp:/app/storages
environment:
- APP_BASIC_AUTH=admin:admin
- APP_PORT=3000
- APP_DEBUG=true
- APP_OS=Chrome
- WHATSAPP_ACCOUNT_VALIDATION=false
volumes:
whatsapp:
ou com arquivo env (GitHub Container Registry):
services:
whatsapp:
image: ghcr.io/aldinokemal/go-whatsapp-web-multidevice
container_name: whatsapp
restart: always
ports:
- "3000:3000"
volumes:
- whatsapp:/app/storages
environment:
- APP_BASIC_AUTH=admin:admin
- APP_PORT=3000
- APP_DEBUG=true
- APP_OS=Chrome
- WHATSAPP_ACCOUNT_VALIDATION=false
volumes:
whatsapp:
Modo de Produção (binário)
- baixe o binário do release
Você pode fazer fork ou editar este código-fonte!
API Atual
API MCP (Model Context Protocol)
- Servida em
/mcppelo servidor REST (transporte HTTP streamable) sempre queMCP_ENABLEDfor verdadeiro; comAPP_BASE_PATHdefinido, a rota é<base-path>/mcp. - As ferramentas disponíveis estão listadas na seção "Ferramentas MCP Disponíveis" acima.
- Compatível com ferramentas e agentes de IA habilitados para MCP
API HTTP REST
- Consulte docs/openapi.yaml para especificações detalhadas da API.
- Use o SwaggerEditor para visualizar a API.
- Gere clientes HTTP usando o openapi-generator. | Recurso | Menu | Método | URL | | --- | --- | --- | --- | | ✅ | Health Check | GET | /health | | ✅ | Listar Dispositivos | GET | /devices | | ✅ | Adicionar Dispositivo | POST | /devices | | ✅ | Obter Informações do Dispositivo | GET | /devices/:device_id | | ✅ | Remover Dispositivo | DELETE | /devices/:device_id | | ✅ | Login do Dispositivo (QR) | GET | /devices/:device_id/login | | ✅ | Login do Dispositivo (Código) | POST | /devices/:device_id/login/code | | ✅ | Logout do Dispositivo | POST | /devices/:device_id/logout | | ✅ | Reconectar Dispositivo | POST | /devices/:device_id/reconnect | | ✅ | Obter Status do Dispositivo | GET | /devices/:device_id/status | | ✅ | Obter Webhook do Dispositivo | GET | /devices/:device_id/webhook | | ✅ | Definir Webhook do Dispositivo | PATCH | /devices/:device_id/webhook | | ✅ | Login com QR Scan | GET | /app/login | | ✅ | Login com Código de Pareamento | GET | /app/login-with-code | | ✅ | Status do Pareamento Passkey | GET | /app/passkey | | ✅ | Resposta do Pareamento Passkey | POST | /app/passkey/response | | ✅ | Confirmar Pareamento Passkey | POST | /app/passkey/confirm | | ✅ | Logout | GET | /app/logout | | ✅ | Reconectar | GET | /app/reconnect | | ✅ | Dispositivos | GET | /app/devices | | ✅ | Status da Conexão | GET | /app/status | | ✅ | Informações do App (versão, limites) | GET | /app/info | | ✅ | Informações do Usuário | GET | /user/info | | ✅ | Avatar do Usuário | GET | /user/avatar | | ✅ | Alterar Avatar do Usuário | POST | /user/avatar | | ✅ | Alterar PushName do Usuário | POST | /user/pushname | | ✅ | Meus Grupos do Usuário* | GET | /user/my/groups | | ✅ | Meus Newsletters do Usuário | GET | /user/my/newsletters | | ✅ | Minha Configuração de Privacidade do Usuário | GET | /user/my/privacy | | ✅ | Meus Contatos do Usuário | GET | /user/my/contacts | | ✅ | Verificação do Usuário | GET | /user/check | | ✅ | Perfil Comercial do Usuário | GET | /user/business-profile | | ✅ | Enviar Mensagem | POST | /send/message | | ✅ | Enviar Imagem | POST | /send/image | | ✅ | Enviar Áudio | POST | /send/audio | | ✅ | Enviar Arquivo | POST | /send/file | | ✅ | Enviar Vídeo | POST | /send/video | | ✅ | Enviar Sticker | POST | /send/sticker | | ✅ | Enviar Contato | POST | /send/contact | | ✅ | Enviar Link | POST | /send/link | | ✅ | Enviar Localização | POST | /send/location | | ✅ | Enviar Enquete / Votação | POST | /send/poll | | ✅ | Enviar Presença | POST | /send/presence | | ✅ | Enviar Presença no Chat (Indicador de Digitação) | POST | /send/chat-presence | | ✅ | Revogar Mensagem | POST | /message/:message_id/revoke | | ✅ | Reagir à Mensagem | POST | /message/:message_id/reaction | | ✅ | Excluir Mensagem | POST | /message/:message_id/delete | | ✅ | Editar Mensagem | POST | /message/:message_id/update | | ✅ | Marcar Mensagem como Lida (DM) | POST | /message/:message_id/read | | ✅ | Favoritar Mensagem | POST | /message/:message_id/star | | ✅ | Desfavoritar Mensagem | POST | /message/:message_id/unstar | | ✅ | Baixar Mídia da Mensagem | GET | /message/:message_id/download | | ✅ | Rejeitar Chamada | POST | /call/reject | | ✅ | Entrar em Grupo com Link | POST | /group/join-with-link | | ✅ | Informações do Grupo a partir do Link | GET | /group/info-from-link | | ✅ | Informações do Grupo | GET | /group/info | | ✅ | Sair do Grupo | POST | /group/leave | | ✅ | Criar Grupo | POST | /group | | ✅ | Listar Participantes do Grupo | GET | /group/participants | | ✅ | Adicionar Participantes no Grupo | POST | /group/participants | | ✅ | Remover Participante do Grupo | POST | /group/participants/remove | | ✅ | Promover Participante no Grupo | POST | /group/participants/promote | | ✅ | Rebaixar Participante no Grupo | POST | /group/participants/demote | | ✅ | Exportar Participantes do Grupo (CSV) | GET | /group/participants/export | | ✅ | Listar Participantes Solicitados no Grupo | GET | /group/participant-requests | | ✅ | Aprovar Participante Solicitado no Grupo | POST | /group/participant-requests/approve | | ✅ | Rejeitar Participante Solicitado no Grupo | POST | /group/participant-requests/reject | | ✅ | Definir Foto do Grupo | POST | /group/photo | | ✅ | Definir Nome do Grupo | POST | /group/name | | ✅ | Definir Grupo como Bloqueado | POST | /group/locked | | ✅ | Definir Anúncio do Grupo | POST | /group/announce | | ✅ | Definir Tópico do Grupo | POST | /group/topic | | ✅ | Obter Link de Convite do Grupo | GET | /group/invite-link | | ✅ | Deixar de Seguir Newsletter | POST | /newsletter/unfollow | | ✅ | Obter Mensagens do Newsletter | GET | /newsletter/messages | | ✅ | Obter Lista de Chats | GET | /chats | | ✅ | Obter Mensagens do Chat | GET | /chat/:chat_jid/messages | | ✅ | Fixar Chat | POST | /chat/:chat_jid/pin | | ✅ | Arquivar Chat | POST | /chat/:chat_jid/archive | | ✅ | Definir Mensagens que Desaparecem | POST | /chat/:chat_jid/disappearing | | ✅ | Sincronizar Histórico do Chatwoot | POST | /chatwoot/sync | | ✅ | Status da Sincronização do Chatwoot | GET | /chatwoot/sync/status | | ✅ | Webhook de Resposta do Chatwoot | POST | /chatwoot/webhook |
✅ = Available
❌ = Not Available Yet
* = Has known limitations (see notes below)
Notas:
*User My Groups: Retorna no máximo 500 grupos devido à limitação do protocolo do WhatsApp. Isso é imposto pelos servidores do WhatsApp, não por esta API. Consulte a fonte do whatsmeow para detalhes./healthé público e sempre registrado no caminho raiz, mesmo quandoAPP_BASE_PATHestá definido.- As rotas do Chatwoot são registradas apenas quando
CHATWOOT_ENABLED=true.
Interface do Usuário
MCP UI
Painel web (gowa-ui)
O painel vive em seu próprio repositório: aldinokemal/gowa-ui. Cada versão do gowa-ui publica um único gowa-ui.html autocontido; o servidor baixa a versão mais recente na inicialização (e a cada APP_UI_UPDATE_INTERVAL, padrão 3h), verifica seu digest sha256, armazena em cache em storages/ui/ e o serve em / atrás de autenticação básica.
| Configuração | Padrão | Finalidade |
|---|---|---|
APP_UI_ENABLED | true | Servir o painel em /; false retorna um banner JSON (somente API) |
APP_UI_AUTO_UPDATE | true | Baixar/atualizar do GitHub; desative para implantações sem conexão com a internet |
APP_UI_REPO | aldinokemal/gowa-ui | Repositório que o atualizador segue — sempre sua versão mais recente, não um pin de versão |
APP_UI_ASSET_NAME | gowa-ui.html | Nome do arquivo do asset da versão a ser baixado |
APP_UI_UPDATE_INTERVAL | 3h | Com que frequência verificar releases/latest |
APP_UI_GITHUB_TOKEN | (vazio) | Token opcional para aumentar o limite de taxa da API do GitHub |
APP_UI_ASSET_SHA256 | (vazio) | Pin da cadeia de suprimentos: recusar qualquer painel cujo sha256 seja diferente |
Modelo de confiança: o digest da versão prova que o download corresponde ao que o GitHub anuncia, não quem o publicou. Operadores que auditam uma compilação específica podem fixá-la com APP_UI_ASSET_SHA256 (cada versão inclui um asset .sha256 — esta é a única configuração que fixa uma compilação exata), apontar APP_UI_REPO para um fork que controlam (o atualizador ainda rastreia a versão mais recente desse repositório), ou pré-popular o cache e desativar a atualização automática completamente.
Servidores sem conexão com a internet: coloque um gowa-ui.html baixado em storages/ui/index.html e defina APP_UI_AUTO_UPDATE=false. O painel também pode ser auto-hospedado em qualquer lugar estático e apontado para a URL deste servidor (veja o readme do gowa-ui).
NOTA para Mac OS
- Por favor, faça isso se você tiver um erro (invalid flag in pkg-config --cflags: -Xpreprocessor)
export CGO_CFLAGS_ALLOW="-Xpreprocessor"
Importante
- Este projeto não é oficial e não é afiliado ao WhatsApp.
- Por favor, use a API oficial do WhatsApp para evitar quaisquer problemas.