Pular para o conteúdo

Escreva o script que confere sua página antes de publicar

Resposta curta

Você escreve um arquivo Node de quarenta linhas que abre a sua página publicada na Systeme.io, roda sete checagens e imprime a lista do que está errado. Lista vazia faz o script terminar com código 0 e você divulga; qualquer item faz terminar com 1, e você corrige antes de mandar gente para lá.

Assunto: Página de captura

Por Alan Victor · · · 7 min de leitura

  1. 1coloque a página num endereço que responda
  2. 2escreva o script com as sete checagens
  3. 3rode e leia a saída
  4. 4como fazer o script barrar a publicação?
  5. 5repita a conferência depois de publicar

No fim deste guia você tem um arquivo confere.mjs que baixa o HTML da sua página publicada na Systeme.io, roda sete checagens e imprime um JSON com a lista do que está errado. Lista vazia significa que o script terminou com código 0 e a página pode ser divulgada. Qualquer item na lista significa código 1, e você sabe exatamente o que corrigir antes de apontar tráfego para lá.

Sai um guia por dia, e o canal do Telegram avisa quando sai. A ferramenta que eu uso para a página, a captura e o e-mail automático no mesmo lugar é a Systeme.io, que tem plano gratuito.

O que você vai ter no fim

Eu monto minhas páginas na Systeme.io e é lá que eu rodo essa conferência, porque a página nasce, ganha endereço e guarda os campos de SEO no mesmo painel. Para mim é a melhor opção hoje: página, lista, e-mail e automação ficam no mesmo lugar, e você não precisa juntar ferramenta nenhuma para publicar e conferir.

Etapa 1: coloque a página num endereço que responda

Resposta direta: o script confere um endereço HTTP, então a página precisa estar publicada em algum endereço antes de a conferência rodar.

Na Systeme.io a página vive dentro de um funil e ganha endereço próprio quando você publica. Publique sem divulgar: nada de postar, nada de mandar para a lista, nada de apontar anúncio. O endereço existe, responde, e ninguém chega nele.

Com a página aberta, copie o endereço da barra do navegador. É essa string que você passa para o script em todas as etapas seguintes, entre aspas.

Confirme que o endereço responde antes de escrever qualquer código. No terminal:

curl -sI "COLE_O_ENDERECO_AQUI" | head -1

A primeira linha esperada é HTTP/2 200. Se vier 404, o endereço está errado ou a página ainda não foi publicada. Se vier 301 ou 302, o script segue o redirecionamento sozinho, mas vale abrir o destino e conferir se é a página certa.

Etapa 2: escreva o script com as sete checagens

Resposta direta: são sete checagens em um arquivo só, e nenhuma dependência: crie o arquivo confere.mjs e cole o bloco abaixo.

Você precisa de Node 18 ou mais novo, porque o script usa o fetch que já vem embutido nele. Rode node -v: se aparecer v18 ou maior, está pronto.

// confere.mjs - Node 18 ou mais novo. Sem dependencia para instalar.
const url = process.argv[2];
if (!url) {
  console.error('uso: node confere.mjs ENDERECO_DA_PAGINA');
  process.exit(2);
}

const res = await fetch(url, { redirect: 'follow' });
const html = await res.text();
const falhas = [];

function exige(ok, mensagem) {
  if (!ok) falhas.push(mensagem);
}

exige(res.status === 200, `status ${res.status}, esperado 200`);

const achado = html.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
const titulo = achado ? achado[1].trim() : '';
exige(titulo.length >= 10 && titulo.length <= 60, `titulo com ${titulo.length} caracteres, esperado de 10 a 60`);

const meta = html.match(/<meta[^>]+name=["']description["'][^>]*content=["']([^"']*)["']/i);
const descricao = meta ? meta[1] : '';
exige(descricao.length >= 50 && descricao.length <= 155, `descricao com ${descricao.length} caracteres, esperado de 50 a 155`);

const canonical = /<link[^>]+rel=["']canonical["']/i.test(html);
exige(canonical, 'sem link canonical');

exige(!/name=["']robots["'][^>]*noindex/i.test(html), 'pagina marcada com noindex');

const h1 = (html.match(/<h1[\s>]/gi) || []).length;
exige(h1 === 1, `${h1} tag h1 na pagina, esperado exatamente 1`);

const formularios = (html.match(/<form[\s>]/gi) || []).length;
exige(formularios >= 1, 'nenhum formulario na pagina');

console.log(JSON.stringify({ status: res.status, titulo, descricao: descricao.length, h1, formularios, canonical, falhas }, null, 2));

process.exit(falhas.length ? 1 : 0);

O arquivo baixa o HTML com fetch, conta o que encontrou e empilha uma mensagem em falhas a cada checagem que não passa. No fim ele imprime o JSON e sai com código 1 se houver qualquer falha.

ChecagemPassa quandoPor que importa
statusa resposta é 200página fora do ar ou endereço errado não é página
títulotem entre 10 e 60 caracteresé o texto da aba e do resultado de busca
descriçãotem entre 50 e 155 caracteresé o texto que aparece abaixo do título na busca
canonicalexiste um link canonicaldiz ao buscador qual endereço é o oficial quando a página responde em dois
noindexnão existenoindex tira a página da busca sem avisar ninguém
h1existe exatamente 1dois h1 dividem o assunto da página
formulárioexiste pelo menos 1 tag formsem form a página não coleta nada

Para fazer isso sem montar servidor

O que este guia faz por API, a Systeme.io faz por formulário: página, lista, etiqueta e e-mail automático na mesma conta. É a conta em que eu testo o que aparece aqui, e o plano gratuito já dá para publicar e capturar.

Ver o plano gratuito

Etapa 3: rode e leia a saída

Resposta direta: rode node confere.mjs "ENDERECO" e olhe o campo falhas; lista vazia é aprovação.

Uma página real com dois problemas devolve isto, e é isto que você vai ver na sua tela:

{
  "status": 200,
  "titulo": "Curso de fotografia para iniciantes",
  "descricao": 141,
  "h1": 2,
  "formularios": 1,
  "canonical": false,
  "falhas": [
    "2 tag h1 na pagina, esperado exatamente 1",
    "sem link canonical"
  ]
}

O campo descricao traz o comprimento em caracteres, não o texto. Se a falha for descricao com 0 caracteres e você enxerga a meta tag no código-fonte da página, o problema é a ordem dos atributos: a expressão do script procura name antes de content. No editor da Systeme.io, inverta a ordem no campo de descrição e rode de novo.

Uma limitação que você precisa saber agora: fetch não executa JavaScript. Se a sua página monta o conteúdo no navegador, o script vê só o HTML inicial e vai reprovar checagens que o navegador mostra certinho.

Etapa 4: como fazer o script barrar a publicação?

Resposta direta: pelo código de saída: o comando depois do && só roda se o script terminar em 0.

node confere.mjs "ENDERECO" && echo "pode divulgar" || echo "corrija antes"

Guarde o resultado em arquivo em vez de só ler na tela:

node confere.mjs "ENDERECO" > conferencia.json; echo $?

O echo $? imprime o código de saída da última linha. 0 é aprovado, 1 é reprovado, 2 é uso errado do comando, sem endereço.

Quem cria as páginas pela API da Systeme.io pode chamar o mesmo comando no passo seguinte da criação, em vez de digitar à mão; a documentação oficial da API mostra onde ler o endereço da página criada. Se você já dispara um webhook quando publica, pendure o comando nele e o resultado vai para o log do servidor.

Etapa 5: repita a conferência depois de publicar

Resposta direta: rode o script de novo sempre que editar a página, porque qualquer alteração no editor pode desfazer o que você corrigiu.

Cada edição no editor da Systeme.io gera uma versão nova do HTML. Título, descrição e canonical moram em campos separados e não viajam junto com o bloco de texto que você arrastou. Por isso a rotina é: editou, publicou, rodou o script, guardou o conferencia.json ao lado do anterior.

Aprovar a página não resolve a entrega. Se o formulário manda o contato para uma lista, o que decide quando você para de crescer é o plano. O plano gratuito da Systeme.io já serve para publicar a página e começar a lista hoje; quando o volume aperta, o plano pago é o próximo degrau de quem está crescendo, e você continua com página, lista, e-mail e automação no mesmo lugar, sem migrar de ferramenta no meio do caminho.

Se você ainda não tem conta, criar a conta gratuita na Systeme.io pelo botão desta página é o primeiro passo do guia, e você já publica a primeira página hoje, com o script conferindo ela em seguida. Cada dia sem página publicada é um dia de visita que não chega.

O que eu não vou afirmar

Travou em alguma etapa?

Abra uma discussão em github.com/alanvito1/funil-simples dizendo em que passo parou. Dúvida que aparece mais de uma vez tem boa chance de virar guia, e o código deste site está no mesmo lugar, aberto.

Se ainda não tem onde publicar o que montou, a conta gratuita da Systeme.io resolve a página e a lista.

Perguntas frequentes

Preciso saber programar para rodar esse script?

Não precisa de experiência com programação: são quarenta linhas para colar em um arquivo e um comando para digitar no terminal. O que você precisa saber é o endereço da página publicada e como abrir o terminal do seu sistema.

O script funciona com página feita em qualquer construtor?

Funciona com qualquer página que responda por HTTP e entregue o HTML no primeiro carregamento, o que inclui as páginas publicadas na Systeme.io. Página que só monta o conteúdo por JavaScript depois do carregamento engana o script e aparece como reprovada.

Quantas checagens o script faz e quais são?

São sete: status 200, título entre 10 e 60 caracteres, descrição entre 50 e 155 caracteres, presença de link canonical, ausência de noindex, exatamente uma tag h1 e pelo menos uma tag form. Cada checagem que não passa entra no campo falhas da saída.

O que eu faço quando o script reprova a página?

Corrija o item listado no campo falhas e rode o comando de novo, até a lista vir vazia e o código de saída ser 0. Cada linha da lista já diz o valor encontrado e o valor esperado, então não é preciso adivinhar o que mudar.

Preciso da API da Systeme.io para usar esse script?

Não precisa. O script lê a página pelo endereço público, com uma requisição HTTP comum, e não faz chamada autenticada nenhuma. A API só entra se você quiser disparar a conferência automaticamente a cada página criada, e a documentação oficial da API mostra onde ler o endereço da página criada.

Leve isto com você

Página de captura pronta

É um arquivo HTML completo, com a promessa, um campo, o aceite da LGPD e nada de terceiro — abre no navegador do jeito que está.

Baixar (HTML, 3.1 kB)

Abra no navegador para ver, troque o texto e o endereço do formulário, e suba para a sua hospedagem. Sem cadastro, sem e-mail: o arquivo baixa direto.

Receba o resto por e-mail

Eu testo ferramenta de funil e e-mail e mando o que descubro.