Communitygithub.com

harwal2000/skills

Use quando o usuário deseja extrair seus próprios dados de um site no qual faz login — histórico de pedidos, corridas, reservas, transações, histórico de reprodução, contas, extratos, itens salvos — e não há exportação utilizável, ou um repositório de scraper existente está desatualizado, quebrado ou exige a senha.

O que é skills?

Esta skill capacita o agente a extrair dados pessoais de sites onde o usuário faz login, sem jamais manipular credenciais. O usuário realiza o login manualmente em um navegador Playwright controlado pelo agente, que então intercepta as requisições reais da página (XHR, GraphQL ou HTML renderizado no servidor) e as reproduz dentro da mesma sessão para obter listas completas e detalhes de itens. A skill é ideal quando o site não oferece exportação nativa ou quando scrapers existentes (baseados em requests + senha/OTP) estão quebrados por verificações de bot. O agente descobre a fonte de dados, gerencia paginação, lida com filtros de partição (como guias ou intervalos de datas), salva as respostas brutas em disco e auxilia na construção de um parser para estruturar os dados, tudo respeitando rigorosamente o princípio de somente leitura, sem realizar mutações ou ações destrutivas.

Funciona com~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/harwal2000/skills/tree/HEAD/skills/scraping-account-data

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Extraindo Dados de Contas

Visão Geral

O usuário faz login manualmente no navegador Playwright; você encontra a fonte de dados que o próprio site utiliza para exibir informações e a reproduz dentro da página (cookies de sessão + cabeçalhos reais), salvando as respostas brutas em disco. Nunca manipule credenciais.

Quando Usar

  • "Obter meu histórico de <serviço>", "extrair meus pedidos/viagens/reservas", "usar este repositório de scraper"
  • Repositórios de scraper antigos (requests + login com senha/OTP): leia-os no GitHub apenas para obter nomes de endpoints e seletores. Nunca os execute — verificações de bot (HTTP 202 corpo vazio, captchas) os quebram, e eles exigem a senha.

Exportação oficial primeiro. Google Takeout, "Baixar seus dados", solicitações GDPR/DPDP, APIs públicas, recibos por e-mail. Exportações lentas levam dias — peça ao usuário para solicitar uma no início, depois extraia agora e cruze por ID quando ela chegar.

Fluxo de Trabalho

  1. Adicione o diretório de saída ao gitignore antes de escrever qualquer coisa (data/<servico>/ ou equivalente do projeto); confirme com git check-ignore. Dados brutos contêm endereços, telefones, GPS.
  2. Navegue, entregue o login. Abra a página da conta; diga ao usuário para digitar telefone/senha/OTP na janela do navegador e responder quando terminar. Nunca peça códigos no chat.
  3. Descubra a fonte (browser-snippets.md §1). Recarregue com um listener e classifique:
    • JSON XHR/fetch (melhor) — anote o endpoint da lista, a forma da paginação (next_url/cursor, page_number, offset = último id, endOfList) e o endpoint de detalhes (abra um item).
    • GraphQL — um POST /graphql; registre o corpo completo da requisição (operationName, query ou hash de consulta persistida, variables).
    • HTML renderizado no servidor — os dados chegam na resposta document; busque as páginas de lista e detalhes dentro da página e analise com DOMParser; salve o HTML bruto também para poder reanalisar.
    • Listas particionadas — se a lista for dividida por um filtro (menu suspenso de ano, intervalo de datas, guias como arquivado/cancelado/digital), leia cada valor de filtro e pagine cada um deles.
  4. Autenticação. Tente fetch(url, {credentials: 'include'}) primeiro. Se retornar 401/403/vazio, copie os cabeçalhos não-navegador de uma requisição ativa (§2) — copie, nunca adivinhe valores. Registre apenas os nomes dos cabeçalhos; nunca imprima ou salve valores.
  5. Paginação em segundo plano dentro da página (§2): window.__x = {running, pages, error}, 1,5s entre requisições, repetições, verifique com avaliações curtas. Cada resposta: se for uma página de login/captcha (URL contém signin/captcha, ou HTML em vez do JSON esperado), defina error e pare — muitas vezes essas chegam como 200.
  6. Salve antes de navegar (§3). Qualquer goto/recarregamento limpa window. Use browser_evaluate com um caminho de filename absoluto, retornando um objeto (JSON.stringify faz dupla codificação). ~5 MB por arquivo é aceitável; divida por lote além disso.
  7. Requisições assinadas/não reproduzíveis (cabeçalhos com assinatura de requisição, corpos com nonce, consultas persistentes que rejeitam edições): visite cada página de detalhes e capture passivamente suas respostas (§4).
  8. Construa + verifique (abaixo) com um script de parser fora do diretório de dados, depois uma nota de insights. Siga o layout existente do repositório, se houver (ex.: tools/<servico>/build_db.py, notas ao lado dos dados); caso contrário, pergunte.

Somente leitura. Reproduza apenas o que a própria página solicita para exibir dados. GraphQL: julgue pela operação (query/Get*/List*), nunca mutation. Nunca reordene, cancele, avalie, arquive ou exclua.

Verificação — faça todas estas

VerificaçãoPor que
A paginação terminou porque o cursor/lista acabou, não por erro ou redirecionamento de loginTruncamento silencioso
Procure por texto "ver pedidos mais antigos no aplicativo" no finalVisualizações na web limitam o histórico (Swiggy: ~11 meses)
Não confie apenas no endpoint de contagem ou cabeçalho do siteBlinkit disse 40; a lista tinha 83
Componentes somam ao total por linha (itens + taxas − descontos = pago)Detecta desvio do parser; se o site omitir linhas para registros antigos, diga — não force
Preços dos itens somam ao total do itemConfusão entre preço por unidade vs. total da linha
IDs únicos; deduplique duplicatas exatasExportações e recibos listam duplicado
Cruze outra fonte por ID (exportação, recibos)Comprova cobertura
Cada lista/guia/filtro foi coberto (arquivado, cancelado, outros anos, sub-serviços)"Todos os pedidos" muitas vezes abrange várias listas

Notas de Parsing

  • APIs de UI orientadas a servidor (snippets, widgets, widget_type, layout): percorra os widgets em ordem, colete os campos text de cada widget, mapeie por rótulos conhecidos. Um widget de texto único geralmente é um rótulo para o próximo — use uma lista branca de nomes de rótulos ou todos os campos se deslocam.
  • Valores podem estar em centavos; "FREE" = 0; "-" à esquerda = desconto; remova símbolos de moeda e agrupamento de vírgulas indiano. Mantenha moedas separadas.
  • Timestamps: compras → fuso horário do usuário; viagens/deslocamentos → hora local do registro.
  • Mantenha arquivos brutos datados (orders-raw-YYYY-MM-DD.json) ao lado do SQLite construído.

Git

Commit apenas: a linha do gitignore, o script do parser, qualquer README/linha de índice. Arquivos brutos e o SQLite permanecem locais. Faça stage de caminhos explícitos (nunca git add -A em uma árvore suja); commit apenas quando solicitado.

Erros Comuns

  • Um único loop de avaliação síncrono longo — estoura tempo limite; execute em segundo plano e verifique.
  • Retornar dados em massa para o chat em vez de filename.
  • Listeners de snippet deixados anexados — use page.off neles, ou execuções repetidas acumulam manipuladores.
  • Filtrar a descoberta apenas para xhr/fetch em um site renderizado em HTML e concluir "não há fonte de dados".

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Habilidades Relacionadas