<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>WhatsApp Archives - Leonardo Nascimento | Engenheiro de Software</title>
	<atom:link href="https://leonardonascimento.dev/tag/whatsapp/feed/" rel="self" type="application/rss+xml" />
	<link>https://leonardonascimento.dev/tag/whatsapp/</link>
	<description>Especializado em backend, APIs e sistemas escaláveis. Experiência em arquitetura de sistemas, integrações, mensageria, performance e aplicações de alta disponibilidade.</description>
	<lastBuildDate>Thu, 29 Jan 2026 16:56:16 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://leonardonascimento.dev/wp-content/uploads/2021/05/cropped-programming-32x32.png</url>
	<title>WhatsApp Archives - Leonardo Nascimento | Engenheiro de Software</title>
	<link>https://leonardonascimento.dev/tag/whatsapp/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Como monitorar aplicação e servidor pelo WhatsApp (logs, erros e alertas)</title>
		<link>https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/</link>
					<comments>https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Thu, 29 Jan 2026 15:19:35 +0000</pubDate>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Backend]]></category>
		<category><![CDATA[Produção]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Alertas]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[monitoramento]]></category>
		<category><![CDATA[notifish]]></category>
		<category><![CDATA[produção]]></category>
		<category><![CDATA[WhatsApp]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2290</guid>

					<description><![CDATA[<p>WhatsApp é um canal excelente para alerta porque ele tem uma característica que e-mail e dashboard não têm: chega onde você está. O problema é que a maioria das implementações vira bagunça rápido — alerta demais, duplicado, sem contexto, e em pouco tempo todo mundo ignora. A forma correta de fazer isso é tratar WhatsApp [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/">Como monitorar aplicação e servidor pelo WhatsApp (logs, erros e alertas)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>WhatsApp é um canal excelente para alerta porque ele tem uma característica que e-mail e dashboard não têm: <strong>chega onde você está</strong>. O problema é que a maioria das implementações vira bagunça rápido — alerta demais, duplicado, sem contexto, e em pouco tempo todo mundo ignora.</p>



<p>A forma correta de fazer isso é tratar WhatsApp como <strong><a href="https://leonardonascimento.dev/blog/updown-io-receba-notificacao-no-whatsapp-caso-seu-site-fique-indisponivel/" type="post" id="164">camada de notificação</a></strong>, não como sistema de monitoramento. Você continua monitorando com ferramentas e sinais confiáveis (uptime, métricas, logs, filas, erros), mas centraliza o envio e a governança dos alertas em um lugar só — e aí o <a href="http://notifish.com/" type="link" id="http://notifish.com/" target="_blank" rel="noreferrer noopener nofollow">Notifish </a>entra bem.</p>



<p>A ideia é simples: <strong>qualquer evento relevante → vira um “evento de notificação” → Notifish entrega no WhatsApp</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-o-que-vale-a-pena-mandar-para-o-whatsapp-e-o-que-nao-vale">O que vale a pena mandar para o WhatsApp (e o que não vale)</h2>



<p>WhatsApp deve receber só o que exige ação ou atenção rápida. Em produção, eu separo em três níveis:</p>



<p><strong>Crítico (manda sempre):</strong></p>



<ul class="wp-block-list">
<li>aplicação fora do ar / endpoint crítico fora</li>



<li>erro 5xx em alta (explosão de taxa de erro)</li>



<li>fila parou de consumir / backlog crescendo rápido</li>



<li>disco quase cheio / risco de indisponibilidade</li>



<li>falha em integração crítica (pagamento, mensagens, etc.)</li>
</ul>



<p><strong>Alerta (manda com filtro):</strong></p>



<ul class="wp-block-list">
<li>latência acima do normal por X minutos</li>



<li>aumento gradual de erros específicos</li>



<li>Redis indisponível (com fallback) ou lento</li>



<li>uso de CPU/memória alto por período sustentado</li>
</ul>



<p><strong>Informativo (geralmente não manda no WhatsApp):</strong></p>



<ul class="wp-block-list">
<li>deploy realizado</li>



<li>logs de rotina</li>



<li>warnings esporádicos</li>
</ul>



<p>O que destrói o canal é “alerta informativo demais”. WhatsApp é para <strong>sinal forte</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-arquitetura-recomendada-sem-gambiarra">Arquitetura recomendada (sem gambiarra)</h2>



<p>O melhor padrão é este:</p>



<ol class="wp-block-list">
<li>Você tem fontes de evento (monitoramento/observabilidade):</li>
</ol>



<ul class="wp-block-list">
<li>Uptime/health-check (aplicação)</li>



<li>Métricas do servidor (CPU, RAM, disco)</li>



<li>Logs (erros específicos, padrões)</li>



<li>Erros de aplicação (exceptions)</li>



<li>Filas (backlog, falhas, retries)</li>
</ul>



<ol start="2" class="wp-block-list">
<li>Um “gerador de eventos” cria um evento padronizado.</li>



<li>Você envia esse evento para o <a href="https://developers.notifish.com/" type="link" id="https://developers.notifish.com/" target="_blank" rel="noreferrer noopener nofollow"><strong>Notifish via API</strong>.</a></li>



<li>Você define roteamento, deduplicação e templates</li>
</ol>



<ul class="wp-block-list">
<li>para qual número/grupo enviar</li>



<li>se deve agrupar, deduplicar, aplicar rate limit</li>



<li>qual template usar (curto, completo, escalonamento)</li>
</ul>



<p>Esse desenho escala porque você não espalha envio de WhatsApp por todo sistema. Você centraliza.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-como-fica-uma-mensagem-boa-no-whatsapp">Como fica uma mensagem boa no WhatsApp</h2>



<p>Uma mensagem útil precisa ter contexto mínimo e ação sugerida:</p>



<ul class="wp-block-list">
<li><strong>Título curto</strong> (o que aconteceu)</li>



<li><strong>Ambiente</strong> (prod, staging)</li>



<li><strong>Serviço</strong> (api, worker, site)</li>



<li><strong>Sintoma</strong> (erro, timeout, backlog)</li>



<li><strong>Impacto</strong> (estimado)</li>



<li><strong>Link</strong> (dashboard/logs, se existir)</li>



<li><strong>Ação recomendada</strong> (1 linha)</li>
</ul>



<p>Exemplo de payload humano:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>ALERTA CRÍTICO</strong>: API 5xx alto<br>Ambiente: prod | Serviço: api<br>Erros 5xx: 18% (últimos 5 min)<br>Endpoint: /api/orders<br>Ação: verificar logs + dependência “Payments”</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading" id="h-implementacao-via-api-com-notifish-modelo-pratico">Implementação via API com Notifish (modelo prático)</h2>



<p>Você pode integrar de dois jeitos:</p>



<h3 class="wp-block-heading" id="h-1-seu-sistema-envia-eventos-diretamente-laravel-cron-scripts">1) Seu sistema envia eventos diretamente (Laravel, cron, scripts)</h3>



<p>Bom quando você mesmo detecta (fila, logs, métricas internas).</p>



<h3 class="wp-block-heading" id="h-2-ferramentas-externas-chamam-o-notifish-uptime-monitoramento">2) Ferramentas externas chamam o Notifish (uptime/monitoramento)</h3>



<p>Bom para health-check e métricas do servidor (quando a ferramenta já faz o “detector”).</p>



<p>Como você pediu implementação via API, vou te mostrar um modelo que funciona bem</p>



<h3 class="wp-block-heading" id="h-payload-recomendado-evento">Payload recomendado (evento)</h3>



<p></p>



<pre class="wp-block-preformatted">{<br>  "message": "Sua mensagem de alerta",<br>  "identifier": "seu identificador único de disparo",<br>  "link": true,<br>  "typing": "composing",<br>  "delayMessage": 1200<br>}<br></pre>



<p><strong>Por que esse formato funciona:</strong></p>



<ul class="wp-block-list">
<li><strong>identifier</strong>: chave de deduplicação / idempotência do alerta</li>



<li><strong>message</strong>: texto já formatado com contexto (ambiente/serviço/ação)</li>



<li><strong>delayMessage/typing</strong>: ajustes de entrega (opcionais)</li>
</ul>



<h2 class="wp-block-heading">Exemplo em Laravel enviando evento ao Notifish</h2>



<pre class="wp-block-preformatted">class NotifishClient
{
    public function sendToGroups(string $message, string $identifier, bool $link = true, int $delayMs = 0, string $typing = 'composing'): void
    {
        $url = rtrim(config('services.notifish.base_url'), '/')
            . '/api/v2/' . config('services.notifish.instance')
            . '/whatsapp/message/groups';

        $payload = [
            'message' => $message,
            'identifier' => $identifier,
            'link' => $link,
            'typing' => $typing,
            'delayMessage' => $delayMs,
        ];

        $response = Http::withToken(config('services.notifish.token'))
            ->acceptJson()
            ->contentType('application/json')
            ->timeout(8)
            ->post($url, $payload);

        if (!$response->successful()) {
            logger()->error('Notifish send failed', [
                'status' => $response->status(),
                'body' => $response->body(),
                'identifier' => $identifier,
            ]);
        }
    }
}

</pre>



<h2 class="wp-block-heading">Regras importantes para não virar caos</h2>



<p>Se você fizer só “manda mensagem”, em 2 semanas o canal morre. Algumas regras que eu considero obrigatórias:</p>



<p><strong>1) Deduplicação</strong></p>



<ul class="wp-block-list">
<li>Todo alerta precisa de <code>dedupe_key</code>.</li>



<li>Se o mesmo alerta acontecer 100 vezes, você manda 1 e “atualiza”/agrupa.</li>
</ul>



<p><strong>2) Rate limit por severidade</strong></p>



<ul class="wp-block-list">
<li>Crítico: pode repetir, mas com intervalo mínimo (ex.: 5–10 min).</li>



<li>Alerta: intervalo maior (ex.: 15–30 min).</li>



<li>Informativo: geralmente fora do WhatsApp.</li>
</ul>



<p><strong>3) Idempotência</strong></p>



<ul class="wp-block-list">
<li>Eventos iguais devem produzir o mesmo estado.</li>



<li>Se a chamada repetir, não deve disparar em duplicidade.</li>
</ul>



<p><strong>4) Conteúdo curto</strong><br>WhatsApp é leitura rápida. Se precisar detalhe, coloque em <code>meta</code> e mande link para logs/dashboard quando possível.</p>



<p><strong>5) Escalonamento</strong><br>Se continuar crítico por X tempo, notifica outro grupo/gestor.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O que monitorar para disparar eventos úteis (fontes típicas)</h2>



<p>Você pode começar com estes gatilhos (são os que mais dão retorno):</p>



<ul class="wp-block-list">
<li><strong>Health-check HTTP</strong> (200/500, tempo de resposta, quedas)</li>



<li><strong>Taxa de erro</strong> (5xx e exceções por minuto)</li>



<li><strong>Fila</strong> (backlog, jobs failed, tempo médio)</li>



<li><strong>Banco</strong> (conexões, queries lentas, timeouts)</li>



<li><strong>Redis</strong> (latência, indisponibilidade, memória/eviction)</li>



<li><strong>Servidor</strong> (disco, load alto sustentado)</li>



<li><strong>Integrações externas</strong> (timeout e falha por janela)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Monitorar “pelo WhatsApp” não é substituir observabilidade por chat. É transformar sinais importantes em alertas acionáveis, com governança. O Notifish entra como a peça que centraliza o envio e impede que cada sistema invente seu próprio jeito de notificar.</p>



<p>Se você faz dedupe, rate limit, severidade e contexto mínimo, o WhatsApp vira um canal confiável — e não um spam de produção.</p>
<p>The post <a href="https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/">Como monitorar aplicação e servidor pelo WhatsApp (logs, erros e alertas)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/como-monitorar-aplicacao-e-servidor-pelo-whatsapp-logs-erros-e-alertas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Fluxo n8n: API, WhatsApp, Log (com dedupe e tratamento de erro)</title>
		<link>https://leonardonascimento.dev/blog/fluxo-n8n-api-whatsapp-log-com-dedupe-e-tratamento-de-erro/</link>
					<comments>https://leonardonascimento.dev/blog/fluxo-n8n-api-whatsapp-log-com-dedupe-e-tratamento-de-erro/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Tue, 20 Jan 2026 22:30:00 +0000</pubDate>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[automação]]></category>
		<category><![CDATA[integrações]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[n8n]]></category>
		<category><![CDATA[webhooks]]></category>
		<category><![CDATA[WhatsApp]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=2316</guid>

					<description><![CDATA[<p>O cenário (realista) Você quer receber um evento via API (Webhook), enviar uma mensagem no WhatsApp via Notifish e registrar o resultado (sucesso/erro) em log. Esse fluxo é útil para: Pré-requisitos Aqui vou usar a opção A (mais “produção”). Parte 1 — Contrato da API (Webhook) Você vai expor um endpoint no n8n, por exemplo: [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/fluxo-n8n-api-whatsapp-log-com-dedupe-e-tratamento-de-erro/">Fluxo n8n: API, WhatsApp, Log (com dedupe e tratamento de erro)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading" id="h-o-cenario-realista">O cenário (realista)</h2>



<p>Você quer receber um evento via API (Webhook), enviar uma mensagem no WhatsApp via <a href="https://notifish.com/" type="link" id="https://notifish.com/" target="_blank" rel="noreferrer noopener nofollow">Notifish </a>e registrar o resultado (sucesso/erro) em log.</p>



<p>Esse fluxo é útil para:</p>



<ul class="wp-block-list">
<li>alertas operacionais</li>



<li>notificações de deploy</li>



<li>falhas de integração</li>



<li>notificações de sistema para grupos</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Pré-requisitos</h2>



<ol class="wp-block-list">
<li><a href="https://leonardonascimento.dev/tag/n8n/" type="post_tag" id="267">n8n rodando e acessível</a></li>



<li>endpoint do Notifish (o seu padrão):<br><code>POST https://meu-dominio.notifish.com/api/v2/{INSTANCE_UUID}/whatsapp/message/groups</code><br>com header <code>Authorization: Bearer ...</code></li>



<li>um lugar para log<br>Vou te dar 2 opções:</li>
</ol>



<ul class="wp-block-list">
<li><strong>A)</strong> log em arquivo via HTTP (endpoint seu) — mais profissional</li>



<li><strong>B)</strong> log no próprio n8n (Execution data) + uma planilha/banco (se preferir)</li>
</ul>



<p>Aqui vou usar a opção <strong>A</strong> (mais “produção”).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Parte 1 — Contrato da API (Webhook)</h1>



<p>Você vai expor um endpoint no <a href="https://leonardonascimento.dev/blog/n8n-o-que-e-como-funciona-e-quando-faz-sentido-usar/" type="post" id="2313">n8n</a>, por exemplo:</p>



<pre class="wp-block-code"><code>POST https://SEU_N8N/webhook/notify
</code></pre>



<p>Payload recomendado (simples e suficiente):</p>



<pre class="wp-block-code"><code>{
  "title": "API 5xx alto",
  "message": "Erros 5xx acima do normal em /api/orders",
  "url": "https://seu-dashboard",
  "identifier": "prod:api:5xx",
  "delayMessage": 0
}
</code></pre>



<p>Repare que já mandamos <code>identifier</code>. Isso permite deduplicar e evitar spam.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Parte 2 — Dedupe (anti-spam) usando Redis (opcional, mas recomendado)</h1>



<p>Se você tiver Redis (muito comum), dá para usar um passo “check” antes do envio.</p>



<ul class="wp-block-list">
<li>chave: <code>dedupe:{identifier}</code></li>



<li>TTL: 300s (5 minutos) por exemplo<br>Se existir, você não envia.</li>
</ul>



<p>Se você não tiver Redis, dá para deduplicar com “Data Store” do n8n ou com um endpoint seu.</p>



<p>Vou te passar o fluxo com <strong>Data Store do n8n</strong> (não depende de infra extra).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Parte 3 — Enviar WhatsApp via Notifish</h1>



<p>O <a href="https://notifish.com/" target="_blank" rel="noreferrer noopener nofollow">Notifish </a>recebe:</p>



<pre class="wp-block-code"><code>{
  "message": "...",
  "identifier": "...",
  "link": true,
  "typing": "composing",
  "delayMessage": 1200
}
</code></pre>



<p>A gente vai montar isso no n8n.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Parte 4 — Registrar Log</h1>



<p>Depois do envio (sucesso ou falha), registramos em um endpoint de log. Exemplo:</p>



<pre class="wp-block-code"><code>POST https://seu-sistema.com/api/logs/notifish
</code></pre>



<p>Log recomendado:</p>



<pre class="wp-block-code"><code>{
  "identifier": "prod:api:5xx",
  "status": "success",
  "http_status": 200,
  "provider": "notifish",
  "payload": { ... },
  "response": { ... },
  "created_at": "2026-01-22T00:00:00-03:00"
}
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">NODES DO WORKFLOW (passo a passo)</h1>



<h2 class="wp-block-heading">1) Webhook (Trigger)</h2>



<ul class="wp-block-list">
<li>Method: <strong>POST</strong></li>



<li>Path: <strong>notify</strong></li>



<li>Response: JSON (200)</li>
</ul>



<h2 class="wp-block-heading">2) Function (Normalize)</h2>



<p>Cria um formato consistente e monta a mensagem final do WhatsApp:</p>



<ul class="wp-block-list">
<li>título + mensagem + url</li>



<li>garante identifier</li>



<li>define delayMessage</li>
</ul>



<h2 class="wp-block-heading">3) Data Store (Get)</h2>



<p>Busca <code>identifier</code> na datastore (dedupe).</p>



<h2 class="wp-block-heading">4) IF (Já enviou?)</h2>



<p>Se já existe registro recente, responde 200 “ignored” e não envia.</p>



<h2 class="wp-block-heading">5) HTTP Request (Notifish)</h2>



<p>POST no endpoint do Notifish com Bearer Token.</p>



<h2 class="wp-block-heading">6) Data Store (Set)</h2>



<p>Salva <code>identifier</code> com TTL (ex.: 300s) para dedupe.</p>



<h2 class="wp-block-heading">7) HTTP Request (Log Success)</h2>



<p>Envia log para seu endpoint.</p>



<h2 class="wp-block-heading">8) Error Trigger / Catch (Log Error)</h2>



<p>Se Notifish falhar, manda log com status <code>error</code>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">JSON do workflow para importar no n8n</h1>



<p>Abaixo um workflow base. Você só precisa trocar:</p>



<ul class="wp-block-list">
<li><code>NOTIFISH_INSTANCE_UUID</code></li>



<li><code>NOTIFISH_TOKEN</code></li>



<li><code>LOG_ENDPOINT_URL</code></li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Import: n8n → Workflows → Import from file/clipboard</p>
</blockquote>



<pre class="wp-block-code"><code>{
  "name": "API → Notifish WhatsApp → Log (com dedupe)",
  "nodes": &#91;
    {
      "parameters": {
        "path": "notify",
        "httpMethod": "POST",
        "responseMode": "lastNode",
        "options": {}
      },
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": &#91;260, 300]
    },
    {
      "parameters": {
        "functionCode": "const body = $json;\n\nconst title = body.title || 'Notificação';\nconst msg = body.message || '';\nconst url = body.url || '';\n\nconst identifier = body.identifier || `generic:${Date.now()}`;\nconst delayMessage = body.delayMessage ?? 0;\n\nconst whatsappMessage = `*${title}*\\n\\n${msg}${url ? `\\n\\n${url}` : ''}`;\n\nreturn &#91;{\n  identifier,\n  delayMessage,\n  notifishPayload: {\n    message: whatsappMessage,\n    identifier,\n    link: true,\n    typing: 'composing',\n    delayMessage\n  },\n  original: body\n}];"
      },
      "name": "Normalize",
      "type": "n8n-nodes-base.function",
      "typeVersion": 2,
      "position": &#91;520, 300]
    },
    {
      "parameters": {
        "operation": "get",
        "key": "={{$json.identifier}}"
      },
      "name": "Dedupe Get",
      "type": "n8n-nodes-base.dataStore",
      "typeVersion": 1,
      "position": &#91;760, 300]
    },
    {
      "parameters": {
        "conditions": {
          "boolean": &#91;
            {
              "value1": "={{$json.value !== undefined &amp;&amp; $json.value !== null}}",
              "value2": true
            }
          ]
        }
      },
      "name": "Já enviou?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": &#91;980, 300]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\"status\":\"ignored\",\"reason\":\"dedupe\",\"identifier\":\"{{$json.identifier}}\"}",
        "options": {}
      },
      "name": "Return Ignored",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1,
      "position": &#91;1210, 200]
    },
    {
      "parameters": {
        "url": "https://meu-dominio.notifish.com/api/v2/NOTIFISH_INSTANCE_UUID/whatsapp/message/groups",
        "method": "POST",
        "authentication": "none",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": &#91;
            {
              "name": "Authorization",
              "value": "Bearer NOTIFISH_TOKEN"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Accept",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "contentType": "json",
        "jsonBody": "={{$json.notifishPayload}}",
        "options": {
          "timeout": 8000
        }
      },
      "name": "Send Notifish",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": &#91;1210, 380]
    },
    {
      "parameters": {
        "operation": "set",
        "key": "={{$json.identifier}}",
        "value": "={{JSON.stringify({sentAt: new Date().toISOString()})}}"
      },
      "name": "Dedupe Set",
      "type": "n8n-nodes-base.dataStore",
      "typeVersion": 1,
      "position": &#91;1450, 380]
    },
    {
      "parameters": {
        "url": "LOG_ENDPOINT_URL",
        "method": "POST",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": &#91;
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "contentType": "json",
        "jsonBody": "={{ {\n  identifier: $json.identifier,\n  status: 'success',\n  provider: 'notifish',\n  response: $json,\n  created_at: new Date().toISOString()\n} }}"
      },
      "name": "Log Success",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": &#91;1690, 380]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\"status\":\"sent\",\"identifier\":\"{{$json.identifier}}\"}",
        "options": {}
      },
      "name": "Return OK",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1,
      "position": &#91;1910, 380]
    }
  ],
  "connections": {
    "Webhook": {
      "main": &#91;
        &#91;
          {
            "node": "Normalize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize": {
      "main": &#91;
        &#91;
          {
            "node": "Dedupe Get",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dedupe Get": {
      "main": &#91;
        &#91;
          {
            "node": "Já enviou?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Já enviou?": {
      "main": &#91;
        &#91;
          {
            "node": "Return Ignored",
            "type": "main",
            "index": 0
          }
        ],
        &#91;
          {
            "node": "Send Notifish",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Notifish": {
      "main": &#91;
        &#91;
          {
            "node": "Dedupe Set",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dedupe Set": {
      "main": &#91;
        &#91;
          {
            "node": "Log Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Success": {
      "main": &#91;
        &#91;
          {
            "node": "Return OK",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false
}
</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Observações importantes (produção)</h2>



<h3 class="wp-block-heading">1) Dedupe com Data Store não tem TTL nativo</h3>



<p>Ele salva “para sempre” se você não limpar. Em produção, o ideal é:</p>



<ul class="wp-block-list">
<li>usar Redis para TTL real, ou</li>



<li>incluir timestamp e limpar por job diário</li>
</ul>



<p>Se você quiser, eu te mando a versão com Redis (TTL real).</p>



<h3 class="wp-block-heading">2) Log endpoint</h3>



<p>Se você não tiver endpoint pronto, você pode logar em:</p>



<p id="h-">ou até em um arquivo via API sua</p>



<p>PostgreSQL/MySQL via node de banco</p>



<p>Google Sheets (rápido)</p>



<p></p>
<p>The post <a href="https://leonardonascimento.dev/blog/fluxo-n8n-api-whatsapp-log-com-dedupe-e-tratamento-de-erro/">Fluxo n8n: API, WhatsApp, Log (com dedupe e tratamento de erro)</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/fluxo-n8n-api-whatsapp-log-com-dedupe-e-tratamento-de-erro/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>UPDOWN.IO: Receba notificação no WhatsApp caso seu site fique indisponível</title>
		<link>https://leonardonascimento.dev/blog/updown-io-receba-notificacao-no-whatsapp-caso-seu-site-fique-indisponivel/</link>
					<comments>https://leonardonascimento.dev/blog/updown-io-receba-notificacao-no-whatsapp-caso-seu-site-fique-indisponivel/#respond</comments>
		
		<dc:creator><![CDATA[Leonardo]]></dc:creator>
		<pubDate>Sun, 20 Oct 2024 23:55:18 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Alertas]]></category>
		<category><![CDATA[Api WhatsApp]]></category>
		<category><![CDATA[Callback]]></category>
		<category><![CDATA[Callbacks]]></category>
		<category><![CDATA[Composer]]></category>
		<category><![CDATA[Configurar Projeto]]></category>
		<category><![CDATA[Estratégia]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Integração WhatsApp]]></category>
		<category><![CDATA[Interface Simples]]></category>
		<category><![CDATA[Intervalos de Tempo]]></category>
		<category><![CDATA[Localizações]]></category>
		<category><![CDATA[Monitoramento de Sites]]></category>
		<category><![CDATA[Múltiplos Sites]]></category>
		<category><![CDATA[Número Configurado]]></category>
		<category><![CDATA[Pasta Public]]></category>
		<category><![CDATA[PHP 7.4]]></category>
		<category><![CDATA[Requisições POST]]></category>
		<category><![CDATA[Servidor HTTP]]></category>
		<category><![CDATA[Slack]]></category>
		<category><![CDATA[SMS]]></category>
		<category><![CDATA[StatusPage]]></category>
		<category><![CDATA[Subdomínio de Teste]]></category>
		<category><![CDATA[Telegram]]></category>
		<category><![CDATA[Tempo de Resposta]]></category>
		<category><![CDATA[Tempo Real]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Updown Notify Whatsapp]]></category>
		<category><![CDATA[Updown.io]]></category>
		<category><![CDATA[WhatsApp]]></category>
		<category><![CDATA[WppConnect]]></category>
		<category><![CDATA[Wppconnect-server]]></category>
		<category><![CDATA[Zapier]]></category>
		<guid isPermaLink="false">https://leonardonascimento.dev/?p=164</guid>

					<description><![CDATA[<p>Com mais de 6 pontos de acompanhamento espalhados pelo mundo, o Updown.io é um sistema de monitoramento de sites em tempo real. Através de uma interface simples e agradável, é possível monitorar múltiplos sites , com intervalos de tempo entre 15 segundos e 1 hora, selecionar até 8 localizações,&#160; com tempo mínimo de resposta entre [&#8230;]</p>
<p>The post <a href="https://leonardonascimento.dev/blog/updown-io-receba-notificacao-no-whatsapp-caso-seu-site-fique-indisponivel/">UPDOWN.IO: Receba notificação no WhatsApp caso seu site fique indisponível</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p> Com mais de 6 pontos de acompanhamento espalhados pelo mundo, o <a rel="noreferrer noopener" href="https://bit.ly/3IlDSdD" data-type="URL" data-id="https://bit.ly/3IlDSdD" target="_blank">Updown.io</a> é um sistema de monitoramento de sites em tempo real. </p>



<p>Através de uma interface simples e agradável, é possível monitorar múltiplos sites , com intervalos de tempo entre 15 segundos e 1 hora, selecionar até 8 localizações,&nbsp; com tempo mínimo de resposta entre 0.125 e 2.0 segundos e “callbacks” (SMS, Telegram, Slack, StatusPage, Zapier) para ser informado em caso de queda ou restauração do serviço.</p>



<p>Desenvolvi a estratégia para um amigo, que gostaria de receber alertas no WhatsApp em tempo real, quando algum site ou sistema fica-se fora do ar, decidimos tornar o código fonte público.</p>



<h2 class="wp-block-heading">Requerimentos</h2>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" href="https://github.com/wppconnect-team/wppconnect-server" data-type="URL" data-id="https://github.com/wppconnect-team/wppconnect-server" target="_blank">Wppconnect Server</a></li><li>PHP 7.4</li></ul>



<p></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>O Wppconnect Server é uma lib não oficial do WhatsApp para envio e recebimento de mensagens. para receber a notificação em seu WhatsApp é necessário ter configurado o Wppconnect server. </p><p>Neste tutorial, aprenderemos a configurar o Updown Notify WhatsApp</p></blockquote>



<h3 class="wp-block-heading">Updown Notify Whatsapp</h3>



<p></p>



<p><strong>Clone o projeto e acesse o diretório </strong></p>



<p><code>git clone https://github.com/leonardop21/updown-notify-whatsapp &amp;&amp; cd updown-notify-whatsapp</code></p>



<p><strong>Instale as dependências (Necessário ter o composer configurado na máquina)</strong></p>



<p><code>composer install</code></p>



<p><strong>Configurando o projeto</strong></p>



<p>      No arquivo <code>/public/callback</code> configure um chave pública, ex: Afwe14we555d1230we23sdx</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="354" src="https://leonardonascimento.dev/wp-content/uploads/2022/03/key-1024x354.png" alt="" class="wp-image-175" srcset="https://leonardonascimento.dev/wp-content/uploads/2022/03/key-1024x354.png 1024w, https://leonardonascimento.dev/wp-content/uploads/2022/03/key-300x104.png 300w, https://leonardonascimento.dev/wp-content/uploads/2022/03/key-768x265.png 768w, https://leonardonascimento.dev/wp-content/uploads/2022/03/key-1536x531.png 1536w, https://leonardonascimento.dev/wp-content/uploads/2022/03/key.png 1632w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<p>      No arquivo&nbsp;<code>/services/WppInfo</code>&nbsp;na função <code>__construct() </code>preencha os dados gerados no Wppconnect-server, para receber notificações no WhatsApp</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="430" src="https://leonardonascimento.dev/wp-content/uploads/2022/03/wpp-info-1024x430.png" alt="" class="wp-image-177" srcset="https://leonardonascimento.dev/wp-content/uploads/2022/03/wpp-info-1024x430.png 1024w, https://leonardonascimento.dev/wp-content/uploads/2022/03/wpp-info-300x126.png 300w, https://leonardonascimento.dev/wp-content/uploads/2022/03/wpp-info-768x323.png 768w, https://leonardonascimento.dev/wp-content/uploads/2022/03/wpp-info.png 1514w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<p><strong>Apontando para a pasta public</strong></p>



<p>Configure seu servidor http, para ler a partir da pasta public.</p>



<p><strong>Agora, no sistema do Updown.io </strong></p>



<p>      No <a rel="noreferrer noopener" href="https://bit.ly/3IlDSdD" data-type="URL" data-id="https://bit.ly/3IlDSdD" target="_blank">Updown.io</a> insira a sua url de callback junto com a key que definiu, ex:&nbsp;<code>https://meusite.com.br/callback?key=Afwe14we555d1230we23sdx</code></p>



<p>O Updown Notify Whatsapp<strong> aceita apenas requisições post</strong> com a key configurada no passo anterior, do contrário, uma página 404 será exibida.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="610" height="280" src="https://leonardonascimento.dev/wp-content/uploads/2022/03/webhook.png" alt="" class="wp-image-178" srcset="https://leonardonascimento.dev/wp-content/uploads/2022/03/webhook.png 610w, https://leonardonascimento.dev/wp-content/uploads/2022/03/webhook-300x138.png 300w" sizes="(max-width: 610px) 100vw, 610px" /></figure>



<p><strong>Testando a aplicação</strong></p>



<p>      Criei um subdomínio de teste e inseri no updown.io.</p>



<p>      No momento em que o site ficou fora do ar, recebi um aviso no WhatsApp, quando voltou ao normal, recebi outro aviso, conforme demonstra as imagens abaixo.</p>



<p><strong>Updown detectou site fora do ar</strong></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="352" src="https://leonardonascimento.dev/wp-content/uploads/2022/03/site-fora-1024x352.png" alt="" class="wp-image-180" srcset="https://leonardonascimento.dev/wp-content/uploads/2022/03/site-fora-1024x352.png 1024w, https://leonardonascimento.dev/wp-content/uploads/2022/03/site-fora-300x103.png 300w, https://leonardonascimento.dev/wp-content/uploads/2022/03/site-fora-768x264.png 768w, https://leonardonascimento.dev/wp-content/uploads/2022/03/site-fora.png 1244w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<p><strong>Callback Updown</strong></p>



<p>      O Updown enviou um callback ao sistema, que por sua vez acionou o Wppconnect-Server enviando uma mensagem para o número configurado no services/WppInfo</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="493" height="1024" src="https://leonardonascimento.dev/wp-content/uploads/2022/03/Whats-Fora-493x1024.png" alt="" class="wp-image-186" srcset="https://leonardonascimento.dev/wp-content/uploads/2022/03/Whats-Fora-493x1024.png 493w, https://leonardonascimento.dev/wp-content/uploads/2022/03/Whats-Fora-144x300.png 144w, https://leonardonascimento.dev/wp-content/uploads/2022/03/Whats-Fora.png 616w" sizes="auto, (max-width: 493px) 100vw, 493px" /></figure>



<p></p>



<p><strong>Site funcionando normalmente</strong></p>



<p>      Updown detectou que o site voltou a funcionar</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="311" src="https://leonardonascimento.dev/wp-content/uploads/2022/03/site-ok-1-1024x311.png" alt="" class="wp-image-187" srcset="https://leonardonascimento.dev/wp-content/uploads/2022/03/site-ok-1-1024x311.png 1024w, https://leonardonascimento.dev/wp-content/uploads/2022/03/site-ok-1-300x91.png 300w, https://leonardonascimento.dev/wp-content/uploads/2022/03/site-ok-1-768x233.png 768w, https://leonardonascimento.dev/wp-content/uploads/2022/03/site-ok-1.png 1217w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<p><strong>Callback Updown</strong></p>



<p>      O Updown enviou um callback ao sistema, que por sua vez acionou o Wppconnect-Server enviando uma mensagem para o número configurado no services/WppInfo</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="491" height="1024" src="https://leonardonascimento.dev/wp-content/uploads/2022/03/whats-ok-491x1024.png" alt="" class="wp-image-188" srcset="https://leonardonascimento.dev/wp-content/uploads/2022/03/whats-ok-491x1024.png 491w, https://leonardonascimento.dev/wp-content/uploads/2022/03/whats-ok-144x300.png 144w, https://leonardonascimento.dev/wp-content/uploads/2022/03/whats-ok.png 614w" sizes="auto, (max-width: 491px) 100vw, 491px" /></figure>



<p></p>



<p>Links úteis</p>



<p><a href="https://github.com/wppconnect-team/wppconnect-server" data-type="URL" data-id="https://github.com/wppconnect-team/wppconnect-server" target="_blank" rel="noreferrer noopener">WPPCONNECT-SERVER</a></p>



<p><a href="https://github.com/leonardop21/updown-notify-whatsapp" data-type="URL" data-id="https://github.com/leonardop21/updown-notify-whatsapp" target="_blank" rel="noreferrer noopener">UPDOWN-NOFITY-WHATSAPP</a></p>
<p>The post <a href="https://leonardonascimento.dev/blog/updown-io-receba-notificacao-no-whatsapp-caso-seu-site-fique-indisponivel/">UPDOWN.IO: Receba notificação no WhatsApp caso seu site fique indisponível</a> appeared first on <a href="https://leonardonascimento.dev">Leonardo Nascimento | Engenheiro de Software</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://leonardonascimento.dev/blog/updown-io-receba-notificacao-no-whatsapp-caso-seu-site-fique-indisponivel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
