← Voltar para o Blog ← Back to Blog

Criando um CLI em Go para extrair metadados

Marco Antonio Gonzalez Junior Vibe Coding
Vibe Coding

Motivação

Neste site, existe uma seção chamada Artigos, destinada a ser uma coleção de notícias recentes sobre Vibe Coding e assuntos relacionados. Sempre que surgir algum artigo interessante na mídia, ele será curado por nossa equipe e salvo aqui para referência. Os dados são armazenados em um arquivo JSON. Um artigo possui os seguintes atributos:

type Article {
  title: string
  description: string
  image: string
  source: string
  slug: string
  publishDate: Date
}

Esses atributos foram escolhidos intencionalmente porque se baseiam no Open Graph Protocol. Você já deve ter percebido que, ao colar um link em alguma rede social, após um ou dois segundos, ele se expande exibindo uma imagem, um título e um resumo. Esses dados vêm das tags Open Graph contidas no código-fonte da página que você compartilhou.

Para adicionar novos artigos ao site, precisamos inspecionar o código-fonte da página, encontrar as tags Open Graph, copiar e colar os conteúdos para criar um novo objeto, e, finalmente, adicioná-lo ao array no arquivo JSON.

O arquivo JSON se parece com isso:

{
  "articles": [
    {
      "slug": "vibe-code-or-retire",
      "url": "https://www.infoworld.com/article/3960574/vibe-code-or-retire.html",
      "title": "Vibe code or retire",
      "description": "Vibe coding é como todos escreveremos código no futuro. Comece a aprender agora, ou sua carreira como desenvolvedor de software chegará ao fim.",
      "image": "https://www.infoworld.com/wp-content/uploads/2025/04/3960574-0-34945300-1745312518-shutterstock_1724042191.jpg",
      "source": "InfoWorld",
      "publishDate": "2025-04-22"
    }
    // ...
  ]
}

Esse processo é trabalhoso, entediante e sujeito a erros. Vamos resolver isso com um pouco de Vibe Coding! Vamos automatizar esse processo, aprender algo novo e nos divertir. Sabemos que a linguagem GO é ótima para ferramentas CLI. Eu tenho apenas conhecimentos básicos dessa linguagem, então demoraria horas para construir algo aceitável sozinho. Portanto, mãos à obra!

Ferramentas

Para este desafio, vamos usar o Visual Studio Code e o Anthropic Claude (Claude 3.7 Sonnet). Além disso, o GO deve estar instalado. Estou usando o Fedora Linux.

Engenharia de Prompt

Se há algo em que o Vibe Coding se baseia fortemente, é na engenharia de prompt. Os resultados obtidos estão totalmente relacionados à forma como você elabora os prompts. Eles precisam ser objetivos, fornecer contexto, ter instruções claras e uma descrição detalhada do que você deseja como resposta. Teremos um post dedicado apenas a esse assunto.

Requisitos

Vamos reunir os requisitos do nosso problema e construir o primeiro prompt.

Começamos com um link para um artigo interessante. Nosso CLI deve buscar a página HTML, analisá-la, encontrar as tags especificadas, extrair seu conteúdo, associá-las aos atributos do artigo previamente definidos, montar um objeto JSON e adicioná-lo ao array no arquivo de banco de dados. Fácil! 😅

Vamos extrair informações das seguintes tags:

"og:url"           --> url e slug
"og:title"         --> title
"og:description"   --> description
"og:image"         --> image

A propriedade slug precisará de algum processamento e falta uma propriedade: publishDate. Não existe uma tag padrão para a data de publicação, e o artigo pode não ter sido publicado no mesmo dia em que for processado. Sem problemas — vamos encontrar uma solução no caminho.

Nosso objetivo é terminar com algo como:

add_vibe_article <url> <arquivo de banco de dados>

Codificando

Vamos abrir o Claude no navegador, que terá uma tela de boas-vindas como esta:

Claude

Começamos. Será um processo iterativo.

  1. Declarando o problema:
1. Preciso de um software CLI escrito em Go.
2. Ele receberá dois argumentos e deve mostrar instruções de uso caso não sejam fornecidos.
3. O primeiro argumento será uma URL para uma página web pública.
4. O segundo argumento será o caminho para um arquivo JSON.
5. A página web deve ser buscada e analisada; o conteúdo das seguintes tags deve ser extraído: "og:url", "og:title", "og:description" e "og:image".
6. Criar um objeto JSON com as chaves url, title, description e image usando as informações extraídas no passo anterior.
7. Imprimir o objeto no console, devidamente formatado e indentado.
8. Fornecer instruções detalhadas e claras sobre como testar a solução no ambiente de desenvolvimento local.

Eu costumo estruturar os prompts como listas numeradas por vários motivos: ajudam o Claude a processar requisitos de forma sequencial, facilitam a referência em prompts de acompanhamento e evitam que detalhes críticos sejam ignorados conforme a complexidade aumenta.

Em poucos segundos, Claude começa a transmitir a resposta, fornecendo o código-fonte e instruções conforme pedido.

Tela:

Iteration 1

O código-fonte e instruções da primeira iteração estão aqui.

No entanto, surgiu um bug:

bug 1

A mensagem de erro era clara. Tínhamos duas opções: pedir ajuda ao Claude diretamente ou investigar o código para tentar corrigir. Recomendo a segunda opção — você aprende mais e ainda economiza tokens. Foi o que fiz.

Código:

package main

import (
 "encoding/json"
 "fmt"
 "io/ioutil"
 "net/http"
 "os"
 "strings"
 "golang.org/x/net/html"
)
// ...

Bastou remover a importação do "strings" na linha 9 — e funcionou perfeitamente.

Testes:

Usage no args

Result 1

Excelente! Extraímos os quatro atributos corretamente.

Nota: Estamos focando no caminho feliz (happy path). Em produção, precisaríamos adicionar tratamentos robustos para erros, como tags ausentes ou falha na conexão.


  1. Segunda Iteração

Agora faltam os atributos slug e publishDate.

Primeiramente, sobre slug: na prática, é a última parte do URL que identifica a página, como em https://example.com/blog/o-que-e-slug onde o slug é o-que-e-slug.

Prompt enviado:

1. Adaptar o script para extrair o slug da URL.
2. Dividir a URL por barras e pegar a última seção.
3. Remover query strings e fragmentos.
4. Criar uma propriedade "slug" e adicioná-la ao conjunto de propriedades.
5. Fornecer instruções detalhadas de como aplicar e testar as mudanças.

Resultado: segunda iteração.

Curiosamente, Claude criou uma pasta output para salvar o arquivo JSON — mesmo sem termos pedido!

Result 2


  1. Terceira Iteração

Para o publishDate, perguntei:

Dada uma URL de artigo, existe uma maneira padronizada de extrair a data de publicação? Se não, quais seriam os workarounds?

Resposta: não há padrão. Mas sugeriu métodos alternativos, como:

  • Buscar a tag article:published_time
  • Deduzir a data do URL, se estiver embutida
  • Analisar o conteúdo HTML

Claude gerou o código automaticamente: terceira iteração.

Result 3


  1. Quarta Iteração

Hora de adicionar a entrada no banco de dados!

Prompt:

1. Utilizar o caminho fornecido como arquivo JSON existente.
2. Criar uma cópia de backup no mesmo diretório, nomeada <arquivo>.json.YYYYMMDD.bkp.
3. A estrutura do arquivo é {"articles":[{...},...]}.
4. Adicionar a nova entrada ao array "articles".
5. O JSON gerado deve ser válido.
6. Fornecer o código-fonte completo.
7. Fornecer documentação detalhada.

Resultado: quarta iteração.

Além disso, Claude entregou também um shell script para facilitar os testes.

Teste final:

Result 4

Artigo adicionado com sucesso!

site


Conclusão

Neste artigo, mostramos como o Vibe Coding pode acelerar muito tarefas de desenvolvimento, usando assistentes de IA como Claude. O que levaria horas de codificação manual foi feito em poucas iterações de engenharia de prompt e refinamento de código.

A ferramenta CLI em Go:

  • Extrai metadados OpenGraph de URLs de artigos
  • Cria entradas JSON corretamente formatadas
  • Atualiza o banco de dados com segurança, criando backups
  • Economiza um tempo enorme comparado ao processo manual

Principais vantagens observadas:

  1. Desenvolvimento Rápido: Criamos uma ferramenta funcional em minutos.
  2. Oportunidade de Aprendizado: Mesmo com pouca experiência em Go.
  3. Melhoria Iterativa: Cada prompt melhorou o anterior.
  4. Resolução de Problemas: Usamos a IA para encontrar soluções alternativas.

O Go foi uma excelente escolha para essa ferramenta CLI por compilar em binários únicos, ter um modelo de concorrência poderoso para operações de rede, e uma biblioteca padrão robusta.

Enquanto o desenvolvimento tradicional envolveria consultar documentação e Stack Overflow, o Vibe Coding nos permitiu focar na definição do problema e dos requisitos da solução.

Na próxima vez que você se deparar com tarefas repetitivas ou desafios em uma linguagem desconhecida, considere usar Vibe Coding para criar uma solução personalizada de maneira mais eficiente.