Como montar um robô que lê imprensa, portais oficiais e YouTube todos os dias, joga fora o ruído, classifica o que sobra e te entrega um e-mail pronto para encaminhar.
Um fluxo que roda sozinho e te manda, por e-mail, um relatório com tudo que foi publicado sobre a sua marca (ou a do seu cliente) — já limpo, já classificado por tom e já agrupado por assunto.
É o que ferramentas prontas de mercado cobram entre R$ 1.100 e R$ 2.100 por mês para fazer.
O que você precisa: uma instância do N8N (a versão gratuita serve), uma conta de e-mail com SMTP, e uma chave de API do YouTube (gratuita). Nada mais.
Quase todo tutorial de monitoramento manda você sair plugando feeds. Metade não responde. Testei uma por uma, com requisição real, e este é o resultado:
| Fonte | Status | Observação |
|---|---|---|
| RSS de busca do Google Notícias | Funciona | A base de tudo. Gratuito, sem chave, cobre imprensa nacional e regional. |
| Feed regional do G1 | Funciona | Traz o endereço real da matéria, coisa que o Google Notícias não dá. |
| Busca restrita a domínios .gov.br | Funciona | Pega prefeitura, câmara municipal e órgãos federais. |
| Diário Oficial da União | Funciona | A busca do in.gov.br responde a requisição direta. |
| YouTube Data API v3 | Funciona | Gratuita. Mas a sintaxe da busca decide tudo — ver Parte 5. |
Feed /feed de jornal regional | Não funciona | Testei dois portais locais. Ambos devolveram zero itens nesse caminho. |
| RSS do portal gov.br/saude | Não funciona | A rota /RSS devolve HTML sem nenhum item. |
| Link do item no Google Notícias | Armadilha | Existe, mas não abre. Explico logo abaixo. |
O RSS do Google Notícias entrega, em cada item, um link assim:
https://news.google.com/rss/articles/CBMimAFBVV95cUxNSlpTcll5...
Parece o endereço da matéria. Não é. É um redirecionamento fechado que só resolve dentro do próprio Google, por script. Eu tentei três caminhos para chegar no endereço real: decodificar o trecho em base64, seguir o redirecionamento e ler o HTML da página de destino. Nenhum funciona — o endereço verdadeiro não está em lugar nenhum do item do feed.
https://www.google.com/search?q=site%3A<dominio>+<palavras+da+manchete>
Sem acentos nas palavras da manchete. Abre em qualquer navegador e leva o leitor direto na matéria. Quando a fonte tiver feed próprio (como o G1 regional), prefira sempre o feed — ali o link é real.
São oito nós, nesta ordem:
Schedule Trigger
↓
Config (nó Code — a única coisa que você edita no dia a dia)
↓
Feed URLs (nó Code — transforma a lista de buscas em itens)
↓
RSS Read (nó RSS — marque "continue on fail")
↓
Processar (nó Code — filtra, deduplica, normaliza)
↓
Classificar (nó de IA — define o tom de cada menção)
↓
Montar Digest (nó Code — gera o HTML do e-mail)
↓
Tem resultado? (nó IF) → Send Email
Este é o único nó que você mexe depois de montado. Cole isto num nó Code, em modo "Run Once for All Items":
O código exato do nó Config
// O unico no que voce edita no dia a dia.
return [{ json: {
buscas: [
'"Nome da Marca" Cidade',
'"Nome Completo da Organizacao"',
'"Nome da Marca" Cidade site:gov.br'
],
janelaDias: 7,
incluir: [ ['nome da marca', 'cidade'] ],
excluir: [ 'homonimo conhecido' ],
limiteVistos: 5000
}}];
https://news.google.com/rss/search?q=<BUSCA>+when%3A<N>d
&hl=pt-BR&gl=BR&ceid=BR:pt-150
A busca vai codificada para URL. Os parâmetros hl, gl e ceid são o que força resultado em português do Brasil — sem eles, vem conteúdo de Portugal e dos Estados Unidos misturado.
O código exato do nó Montar Buscas
// Uma URL de RSS do Google Noticias por busca.
const c = $('Config').first().json;
return (c.buscas || []).map(b => ({ json: {
url: 'https://news.google.com/rss/search?q=' +
encodeURIComponent(b + ' when:' + c.janelaDias + 'd') +
'&hl=pt-BR&gl=BR&ceid=BR:pt-150'
}}));
A regra é simples: um item entra se casar com todos
O código exato do nó Filtrar e Deduplicar
const limpar = s => String(s || '').toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g, '').trim();
const casa = (t, x) => limpar(t).includes(limpar(x));
const c = $('Config').first().json;
const st = $getWorkflowStaticData('global');
if (!Array.isArray(st.vistos)) st.vistos = [];
const visto = new Set(st.vistos);
const saida = [];
for (const it of items) {
const j = it.json || {};
const txt = (j.title || '') + ' ' + (j.contentSnippet || '');
if (!(c.incluir || []).some(b => b.every(t => casa(txt, t)))) continue;
if ((c.excluir || []).some(t => casa(txt, t))) continue;
if (visto.has(j.link)) continue;
visto.add(j.link);
saida.push({ json: { titulo: j.title, link: j.link, data: j.isoDate } });
}
st.vistos = [...visto].slice(-(c.limiteVistos || 5000));
return saida;
[̀-ͯ] aparece como uns caracteres estranhos, quase invisíveis — são os sinais de acento em si. Ao copiar daqui, você leva a versão escrita como ̀-ͯ, que é a mesma coisa e sobrevive a copiar e colar. Use a daqui, não tente copiar da imagem.incluir, e não casar com nenhum termo de excluir.
\b na expressão regular para casar palavra inteira. \b foi desenhado para o alfabeto inglês e se comporta de forma errada com acento e cedilha. "Misericórdia", "atenção" e "São" quebram de formas silenciosas — o filtro simplesmente deixa passar ou barra sem você entender por quê.
function limpar(s) {
return String(s || '')
.toLowerCase()
.normalize('NFD')
.replace(/[̀-ͯ]/g, '') // remove acentos
.replace(/\s+/g, ' ')
.trim();
}
function casa(texto, termo) {
return limpar(texto).includes(limpar(termo));
}
excluir.excluir.incluir.Numa rodada real, foi assim: 120 notícias coletadas, 9 no relatório final. O resto era exatamente esses três tipos.
O mesmo link chega com parâmetros de campanha diferentes e vira duas menções. Limpe o endereço antes de comparar:
function chaveDoLink(url) {
try {
const u = new URL(String(url).trim().toLowerCase());
u.hash = '';
['utm_source','utm_medium','utm_campaign','utm_term',
'utm_content','gclid','fbclid'].forEach(p => u.searchParams.delete(p));
return u.hostname.replace(/^www\./,'') +
u.pathname.replace(/\/$/,'') + u.search;
} catch { return String(url); }
}
Guarde essas chaves no workflow static data do N8N, cortando as mais antigas quando passar do limite que você definiu no Config.
Essa foi a parte que mais me surpreendeu, e é a que quase ninguém monitora.
Num teste real, a imprensa passou 30 dias sem publicar nada sobre a organização monitorada. No mesmo período, havia 7 vídeos no YouTube citando ela — todos do mesmo canal, todos recentes. Quem monitorava só jornal não veria nada.
q=Nome da Marca Cidadehttps://www.googleapis.com/youtube/v3/search
?part=snippet
&type=video
&order=date
&publishedAfter=2026-09-01T00:00:00Z
&q=%22Nome%20Exato%20da%20Marca%22
&key=SUA_CHAVE
Devolveu 29 resultados, quase todos relevantes.
As aspas em volta da frase (%22) e o publishedAfter são obrigatórios. Sem os dois, o YouTube entope o seu relatório e você desiste da fonte achando que ela não presta.
A chave é gratuita: console do Google Cloud, ative a YouTube Data API v3, crie uma chave e restrinja ela a essa API. A cota diária dá para umas 100 buscas, muito mais do que um monitoramento diário precisa.
Entre em console.cloud.google.com com a sua conta Google. Não precisa de cartão de crédito — e se aparecer uma faixa oferecendo créditos de teste, ignore, você não vai precisar.
1. No seletor de projeto, lá em cima, crie um projeto novo. Dê o nome que quiser e confirme que ele ficou selecionado antes de seguir.

2. Abra o menu das três linhas e vá em APIs e serviços → Biblioteca.

3. Busque por youtube data api v3. Vai voltar um resultado só.

4. Abra o resultado e clique em Ativar.

5. Agora vá em APIs e serviços → Credenciais, clique em Criar credenciais e escolha Chave de API.

6. Antes de salvar, restrinja a chave. Em "Selecionar restrições da API", marque apenas a YouTube Data API v3. Em "Restrições do aplicativo", deixe em Nenhum.

7. A chave aparece numa janela, uma única vez. Copie e guarde num arquivo seu.

Quase todo modelo pronto de monitoramento classifica sentimento com lista de palavras: soma pontos de palavras boas e ruins e decide. Dois problemas graves:
Troque esse bloco inteiro por uma chamada de IA. O prompt que funciona:
Você recebe uma lista de menções sobre [ORGANIZAÇÃO].
Para cada uma:
1. Decida se é REALMENTE sobre essa organização. Se a manchete
citar só o nome curto e puder ser outra, marque A_CONFIRMAR
e escreva o motivo da dúvida. Nunca chute.
2. Classifique o tom: POSITIVO, NEUTRO, NEGATIVO ou CRISE.
CRISE é o que exige resposta no mesmo dia: denúncia,
investigação, morte, processo, acusação pública.
3. Marque se envolve política (candidato, vereador, deputado,
prefeito ou câmara).
4. Agrupe menções do mesmo acontecimento num item só,
com todos os links juntos.
Não opine. Registre o que foi publicado, por quem e quando.
E a regra que não se negocia: o relatório registra, não opina. Nada de qualificar candidato, sugerir resposta ou insinuar irregularidade. A leitura é de quem recebe. Isso protege você e protege o cliente.
Duas decisões que parecem detalhe e não são:
O código exato do nó Montar Relatório
let html = '<div style="font-family:Arial,sans-serif;max-width:680px">';
html += '<h1 style="font-size:20px">Monitoramento de midia</h1>';
for (const i of items) {
const j = i.json;
html += '<div style="border:1px solid #e3e6ea;border-radius:8px;padding:14px;margin-bottom:12px">';
html += '<a href="' + j.link + '" style="color:#0b5cad;font-weight:600">' + j.titulo + '</a></div>';
}
html += '</div>';
return [{ json: { html: html, total: items.length } }];
Nada de bloco <style> no topo. Gmail e Outlook tratam isso de forma diferente e o seu relatório chega desmontado. Coloque o estilo dentro de cada elemento, com style="...". É feio de escrever e é o que funciona em todo lugar.
Use o nó IF para cortar execução vazia. E-mail dizendo "nenhuma novidade" toda semana treina o destinatário a ignorar você.
Mas cuidado com o oposto: se a marca passa semanas em silêncio, o relatório vira raro demais e some da memória de quem recebe. A saída é ter uma seção de contexto do setor — o que aconteceu com organizações parecidas — que sustenta a edição quando o cliente está quieto.
\b na expressão regular. Quebra com acento. Normalize antes de comparar.excluir. Vai ajustar umas cinco vezes nas duas primeiras semanas — é normal e é assim que fica bom.Se travar em alguma parte, me chama no LinkedIn e me diz onde travou. Eu respondo.