Carregando status...
Dashboard
WhatsApp
Mensagens hoje
Comandos hoje
Falhas hoje
Fila pendente
Opt-ins ativos
Crons ativos
OLTs cadastradas
Última falha de cron
Carregando...
Último backup
Carregando...
Separe múltiplos por vírgula.
0 / 4096
Gerenciar Comandos

Fixos (sistema)

ComandoDescriçãoTipo

Personalizados

Nenhum comando personalizado ainda.
Clique em Novo Comando para adicionar.
Novo Agendamento
Predefinições:
— preencha os campos acima ou clique em uma predefinição
Sintaxe do campo:
* — qualquer valor 1,7,14,19 — múltiplos horários 1-5 — intervalo (seg a sex) */15 — a cada 15 min/horas
Exemplos: 0 8 * * 1-5 seg–sex às 8h  ·  0 0,7,14,19 * * * 4× por dia  ·  */30 * * * * a cada 30 min
Preenchido automaticamente ao enviar um arquivo abaixo ou usar um exemplo.
Executado sempre ao final, mesmo em caso de erro. Ex: pkill -f chromium, pkill -f firefox-esr, pkill -f chromium >> /home/script.log 2>&1
Após enviar, o caminho é preenchido automaticamente.
Instala no ambiente Python usado pelos scripts (venv ou sistema). Necessário se o script novo importar uma lib que ainda não está instalada.


                            
Bibliotecas instaladas
Carregando...

Cole a função abaixo no seu script e chame enviar_mensagem(mensagem) onde quiser.

import os, requests
from datetime import datetime

def enviar_mensagem(mensagem, file_path=None):
    url      = "http://localhost:3001/api/send"
    payload  = {
        'recipients': '5527999999999, 5527988888888',  # vírgula p/ múltiplos; grupo: "120363XXX@g.us"
        'message': mensagem
    }

    if file_path and not os.path.exists(file_path):
        print(f"⚠️ Arquivo '{file_path}' não encontrado. Envio sem anexo.")
        file_path = None

    if file_path:
        with open(file_path, 'rb') as f:
            resposta = requests.post(url, data=payload, files={'file': f})
    else:
        resposta = requests.post(url, data=payload)

    agora = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    if resposta.status_code == 200:
        print(f"✅ [{agora}] Mensagem enviada com sucesso!")
    else:
        print(f"❌ [{agora}] Erro ao enviar: {resposta.status_code} - {resposta.text}")
Uso: enviar_mensagem("Texto") ou enviar_mensagem("Texto", "relatorio.pdf")

WHATSAPP_URL="http://localhost:3001/api/send"
WHATSAPP_RECIPIENTS="5527999999999, 5527988888888"  # vírgula p/ múltiplos; grupo: "120363XXX@g.us"

enviar_mensagem() {
  local MENSAGEM="$1"
  local ARQUIVO="${2:-}"
  local AGORA=$(date '+%Y-%m-%d %H:%M:%S')

  [ -n "$ARQUIVO" ] && [ ! -f "$ARQUIVO" ] && { echo "⚠️ Arquivo não encontrado. Envio sem anexo."; ARQUIVO=""; }

  if [ -n "$ARQUIVO" ]; then
    STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X POST "$WHATSAPP_URL" \
      -F "recipients=$WHATSAPP_RECIPIENTS" -F "message=$MENSAGEM" -F "file=@$ARQUIVO")
  else
    STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X POST "$WHATSAPP_URL" \
      -F "recipients=$WHATSAPP_RECIPIENTS" -F "message=$MENSAGEM")
  fi

  [ "$STATUS" = "200" ] \
    && echo "✅ [$AGORA] Mensagem enviada com sucesso!" \
    || echo "❌ [$AGORA] Erro ao enviar (HTTP $STATUS)"
}

# Uso:
# enviar_mensagem "Texto da mensagem"
# enviar_mensagem "Texto" "/caminho/relatorio.pdf"
Uso: enviar_mensagem "Texto" ou enviar_mensagem "Texto" "arquivo.pdf"

TipoValorExemplo
Número pessoalDDI + número5527999999999
MúltiplosSeparados por vírgula5527999999999, 5527888888888
GrupoJID completo120363XXXXXXXX@g.us

💡 Use o painel Meus Grupos abaixo para copiar o JID do grupo com um clique.

Meus Grupos

Clique em Carregar para listar os grupos que o bot participa.

Agendamentos

Nenhum agendamento cadastrado.

Números Autorizados

Quando a autorização estiver ativa, só esses números podem usar comandos restritos.

Nenhum número autorizado ainda.
Lista Opt-in (confirmaram !aceito)
Nenhum número confirmado ainda.
OLTs cadastradas
Nome Host / IP Usuário Modelo
Carregando...
Autorização
Separe por vírgula. Esses comandos funcionam sem autorização.
Opt-in
Define com que frequência o pedido de !aceito é reenviado para o mesmo número.
Chamadas
Rate Limit (Anti-flood)
Modo Interativo
Palavra que inicia o fluxo.
Carregado automaticamente do cadastro de OLTs. Gerencie na aba OLTs.
Serial 16 chars → ONT; demais → ONU.
Proteção de Envios

Evita ban no WhatsApp ao enviar múltiplos alertas. O remetente (Zabbix, MKAuth, etc.) recebe 200 OK imediatamente — o bot entrega em background no ritmo certo.

Vários alertas para o mesmo número

ms
Tempo de espera antes de enviar o grupo. Padrão: 2000ms. Aumente se os alertas chegarem com intervalo maior.
chars
Se passar, divide em partes (parte 1/2, 2/2…).
ms
Se sobrar mais de uma parte, espaça o envio. Padrão: 2000ms.

Envios para números diferentes (boletos, mensagem para todos)

ms
Intervalo mínimo entre envios, mesmo para números diferentes. 0 = livre. Padrão: 1000ms.
Acima disso, o excedente é descartado e registrado no log.
Linha divisória entre cada alerta agrupado.
Anti-ban

Proteções contra detecção de comportamento de bot pelo WhatsApp. Recomendadas para envios em massa (boletos, alertas para múltiplos destinatários).

Variação aleatória ±%. 30 = ±30%. 0 = desativado.
Máx. mensagens por dia. 0 = sem limite.
Exibe indicador antes de cada mensagem.
Aguarda o próximo horário válido. Envios com "urgente":true sempre passam.
Deduplicação de Alertas

Evita reenvio da mesma mensagem quando o Zabbix retenta. Hash SHA-256(dest + msg) salvo por uma janela de tempo.

300 = 5 min. Retentativas dentro desse intervalo são descartadas.
Fila de Mensagens

Quando o WhatsApp desconectar, os alertas ficam na fila e são enviados ao reconectar.

Notificação de Status

Avisa um número quando o bot ficar online ou offline.

API Key

Protege /api/send e /api/broadcast.
Header: X-API-Key: sua-chave. Vazio = desativado.

Exemplo de uso:
curl -X POST http://SEU_IP:3001/api/send \
  -H "X-API-Key: sua-chave" \
  -H "Content-Type: application/json" \
  -d '{"recipients":"5511999999999","message":"Olá!"}'
Senha da Interface Web

Protege o painel web. Deixe em branco para acesso livre (apenas IP whitelist).

⚠️ Após salvar com nova senha, você será deslogado.
IPs Permitidos

Controla quais endereços podem acessar o painel e a API. Localhost é sempre permitido — não há risco de auto-bloqueio.
Aceita IPs simples (192.168.1.10) ou ranges CIDR (192.168.1.0/24). Um por linha.

⚠️ Se remover todos os IPs externos e salvar fora da rede local, você perderá o acesso remoto. Localhost (127.0.0.1) nunca é removido.
Backup / Restore

Gera um único .zip com os dados (autorizados, opt-in, configurações) e todos os scripts do projeto. Use o mesmo arquivo para restaurar ou para instalar em outro servidor.

Baixar Backup (.zip)
Log de Auditoria
Nenhum registro encontrado.
Auditoria de Comandos
Aplique os filtros e clique em Buscar.
Estatísticas de Uso
Top Comandos
Carregando...
Usuários Mais Ativos
Carregando...
Atividade Diária
Pico de Uso por Hora
Métricas Operacionais
De até
Sem dados para o período selecionado.