| name | szt-scraping-tool |
|---|---|
| description | Scraper inteligente para garimpar itens específicos em classificados (OLX, Mercado Livre, Facebook). Coleta → normaliza via Gemini Flash → classifica com playbook curatorial → alerta via Telegram → relatório. Custo zero (Crawl4AI + Gemini free tier). Use quando disser 'scraper de [item]', 'garimpar [item]', 'monitora anúncios de [item]', 'busca classificados de [item]', 'roda o scraper'. |
Scraper inteligente para garimpar itens específicos em classificados brasileiros. Nasceu para buscar TVs CRT para a instalação Totem CRT (PLAYER 1), mas é genérico o suficiente para qualquer garimpagem.
- "scraper de CRT" / "roda o scraper de CRT"
- "garimpar [item] no OLX"
- "monitora anúncios de [item]"
- "busca classificados de [item]"
- "cria um scraper para [item]"
- "relatório do scraper"
┌─────────────────┐
│ CAMPAIGN.json │ ← Playbook: o que buscar, como classificar
└────────┬────────┘
│
┌──────────────────────────┼──────────────────────────┐
│ ▼ │
│ ┌─────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Crawl4AI│──▶│ Normalizer │──▶│ Reporter │ │
│ │ (coleta)│ │ (Gemini LLM) │ │ (ranking) │ │
│ └─────────┘ └──────────────┘ └──────┬───────┘ │
│ $0 $0 │ │
│ ┌──────▼───────┐ │
│ │ Alertas │ │
│ │ (Telegram) │ │
│ └──────────────┘ │
│ szt-scraping-tool │
└─────────────────────────────────────────────────────┘
Cada scraper é uma "campaign" — um JSON que define:
- O que buscar (termos, plataformas, filtros)
- Como classificar (playbook curatorial para o Gemini)
- Como alertar (score mínimo, destinatário)
O motor é o mesmo. O que muda é o playbook.
szt-scraping-tool/
├── SKILL.md ← esta documentação
└── scripts/
├── run.js ← CLI principal
├── db.js ← persistência JSON por campaign
├── normalize.js ← classificação LLM (Gemini Flash)
├── alert.js ← alertas Telegram
├── report.js ← relatório curatorial
├── collectors/
│ ├── olx.js ← Crawl4AI → OLX
│ └── mercadolivre.js ← Crawl4AI → Mercado Livre
└── campaigns/
└── crt-totem.json ← campaign ativa: CRTs para Totem
SKILL=~/.pi/agent/skills/felipe/szt-scraping-tool/scripts
# Pipeline completo: coleta → normalização → alertas
node $SKILL/run.js --campaign crt-totem
# Só coleta (sem normalizar/alertar)
node $SKILL/run.js --campaign crt-totem --collect-only
# Só normalizar pendentes
node $SKILL/run.js --campaign crt-totem --normalize-only
# Relatório
node $SKILL/run.js --campaign crt-totem --report
# Stats
node $SKILL/run.js --campaign crt-totem --stats
# Enviar relatório por e-mail
node $SKILL/run.js --campaign crt-totem --report --email felipe@aya.cx# O Pi cria o JSON de campaign a partir de uma descrição
# Exemplo: "preciso garimpar projetores Epson usados em SP"O Pi gera um campaigns/projetor-epson.json com termos de busca, playbook de classificação e critérios curatoriais.
{
"id": "crt-totem",
"name": "CRTs para Totem CRT — PLAYER 1",
"description": "TVs CRT 27-29 pol para instalação artística",
"active": true,
"created": "2026-03-24",
"search": {
"sources": ["olx"],
"maxPages": 2,
"delayMs": 3000,
"terms": {
"olx": ["tv tubo sony 29", "tv crt 29", "..."],
"mercadolivre": ["tv tubo crt 29", "..."]
},
"location": "São Paulo",
"fetchDetails": false
},
"classification": {
"system_prompt": "Você é um especialista em TVs CRT vintage...",
"user_prompt_template": "Analise este anúncio...\n\nTÍTULO: {title}\nDESCRIÇÃO: {description}\nPREÇO: {price}\nLOCAL: {location}",
"score_weights": {
"uniformity_frame": 0.30,
"image_quality": 0.20,
"availability": 0.15,
"rarity": 0.10,
"condition": 0.10,
"price_attractiveness": 0.15
},
"priority_families": { "...": {} },
"red_flags": ["liga mas não testei", "..."],
"green_flags": ["testada", "funcionando", "..."]
},
"alerts": {
"min_score": 2.5,
"max_per_run": 10,
"telegram": true,
"email": null
}
}| Componente | Tecnologia | Custo |
|---|---|---|
| Coleta OLX | Crawl4AI (self-hosted no Unraid) | $0 |
| Coleta ML | Crawl4AI | $0 |
| Normalização | Gemini 2.5 Flash (free tier: 1500 req/dia) | $0 |
| Persistência | JSON local (1 arquivo por campaign) | $0 |
| Alertas | Telegram Bot API | $0 |
| Relatório | Console + HTML (e-mail via aya-gmail) | $0 |
- Node.js (já instalado)
- Crawl4AI container no Unraid (192.168.15.169:11235)
- GEMINI_API_KEY env var
- Telegram (opcional): TELEGRAM_BOT_TOKEN + TELEGRAM_CHAT_ID
cd ~/.pi/agent/skills/felipe/szt-scraping-tool/scripts && npm installNasceu como ferramenta para o Totem CRT (PLAYER 1, exposição 19/06/2026). Generalizado em 24/03/2026 para aceitar qualquer "campaign" de garimpagem.
Gesto-origem (P2): Felipe precisava de 11 TVs CRT idênticas para uma instalação — coisa que não se compra em loja. O scraper nasce da necessidade de garimpar no mercado de usados com critério curatorial: uniformidade de moldura, família de produto, qualidade de imagem. Não é um comparador de preços — é uma ferramenta de curadoria de objetos.
Teste de existência (P3): o scraper existe fora do implante — roda como CLI, gera HTML, manda e-mail. Pode ser usado por qualquer pessoa com Node.js + Crawl4AI.
| Campaign | Descrição | Listings | Status |
|---|---|---|---|
crt-totem |
TVs CRT 27-29" para Totem CRT / PLAYER 1 | 90 | 🟢 ativa |
- Preços OLX — a página de lista não mostra preço (escondido em JS). Precisa de
fetchDetails: truepara pegar da página de detalhe (mais lento). - Mercado Livre — parsing de HTML frágil, muitos false positives em termos genéricos. Funciona bem com termos específicos.
- Facebook Marketplace — collector não implementado ainda. Patchright está instalado para quando necessário.
- Gemini JSON — o modelo às vezes retorna JSON malformado. O normalizer tem fallback de regex, mas ~5% dos anúncios podem precisar de retry.
- Sem cron ainda — execução manual. Pode ser agendado no gateway quando estabilizar.
- Facebook Marketplace — collector via Patchright (anti-fingerprint)
- Gemini Vision — analisar fotos do anúncio para identificar modelo/estado
- Cron no gateway — rodar a cada 2-4h automaticamente
- Google Sheets — exportar ranking para planilha compartilhável
- Novas campaigns — projetores, sensores, equipamento de montagem