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
- 1coloque a página num endereço que responda
- 2escreva o script com as sete checagens
- 3rode e leia a saída
- 4como fazer o script barrar a publicação?
- 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
- Um arquivo único, sem biblioteca para instalar, que confere status HTTP, título, descrição, canonical, noindex, h1 e formulário.
- Um comando que devolve código de saída 0 ou 1, para a decisão de publicar sair do seu palpite e passar a sair do resultado.
- Um JSON salvo em disco com o resultado de cada conferência, para comparar antes e depois da correção.
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.
| Checagem | Passa quando | Por que importa |
|---|---|---|
| status | a resposta é 200 | página fora do ar ou endereço errado não é página |
| título | tem entre 10 e 60 caracteres | é o texto da aba e do resultado de busca |
| descrição | tem entre 50 e 155 caracteres | é o texto que aparece abaixo do título na busca |
| canonical | existe um link canonical | diz ao buscador qual endereço é o oficial quando a página responde em dois |
| noindex | não existe | noindex tira a página da busca sem avisar ninguém |
| h1 | existe exatamente 1 | dois h1 dividem o assunto da página |
| formulário | existe pelo menos 1 tag form | sem 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.
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
- Não afirmo que a página aprovada vende mais. O script confere estrutura, não oferta, não preço, não texto.
- Não afirmo que sete checagens cobrem tudo. Velocidade de carregamento, contraste, versão para celular e ortografia ficam de fora.
- Não afirmo nada sobre posição em buscador. Canonical e noindex são as duas coisas que o script olha, e olhar não é garantir resultado.
- Não afirmo que o script funciona em página que monta o conteúdo por JavaScript depois do carregamento.
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á.
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.