Aplicacao para monitorar preco de vinhos e enviar e-mail quando houver queda de preco.
Este projeto foi preparado para rodar sem execucao local, usando apenas recursos gratuitos do GitHub:
- GitHub Actions para monitoramento recorrente.
- Edicao de arquivos pelo GitHub Web.
- Workflow administrativo para cadastrar/editar/remover trackers por formulario.
- Arquitetura
- Fluxo 100% nuvem
- Passo a passo inicial (GitHub)
- Usar CLI remoto no GitHub Codespaces
- Configurar e-mail (secrets)
- Forma 1: cadastrar vinhos editando
config/trackers.yaml - Forma 2: cadastrar vinhos via workflow Tracker Admin
- Como adicionar novos sites para monitoramento
- Workflows disponiveis
- Estrutura dos dados
- Troubleshooting
config/sites.yaml: cadastro de sites suportados (Super Adega + novos sites por CSS selectors).config/trackers.yaml: cadastro dos vinhos monitorados (fonte de verdade para trackers).data/state.json: estado interno (ultimo preco, URL encontrada, historico de observacoes).
Fluxo interno:
sync-trackerssincronizaconfig/trackers.yamlparadata/state.json.checkconsulta preco dos trackers ativos no periodo.- Se houver queda, envia e-mail.
- O GitHub Action faz commit do
data/state.jsonatualizado.
Voce nao precisa rodar python no seu computador.
Operacao diaria pode ser feita assim:
- Cadastrar/editar/remover trackers por uma das 2 formas abaixo.
- Deixar o workflow
Price Monitorexecutar no agendamento. - Receber e-mail quando houver queda de preco.
- Crie um repositorio no GitHub (ou use um existente).
- Suba estes arquivos para o repositorio.
- Verifique se estes workflows existem:
.github/workflows/price-monitor.yml.github/workflows/tracker-admin.yml
- Abra a aba
Actionse habilite workflows, se o GitHub pedir confirmacao.
Este repositorio ja inclui configuracao pronta em:
.devcontainer/devcontainer.json
- No GitHub, abra o repositorio.
- Clique em
Code-> abaCodespaces. - Clique em
Create codespace on main(ou na branch desejada). - Aguarde a inicializacao do container.
O Codespaces executa automaticamente:
pip install -r requirements.txtNo terminal do Codespace:
python -m app.main cfg-list
python -m app.main cfg-add --wine "Vinho Catena Malbec" --site superadega --days 30
python -m app.main sync-trackers
python -m app.main check --send-emailSe quiser testar envio de e-mail manualmente no Codespace, defina:
export SMTP_HOST="smtp.gmail.com"
export SMTP_PORT="587"
export SMTP_USER="seu_usuario"
export SMTP_PASS="sua_senha_ou_app_password"
export EMAIL_FROM="alertas@seudominio.com"
export EMAIL_TO="voce@seudominio.com"Observacao:
- Para execucao automatica dos workflows, os segredos oficiais continuam sendo os
Repository Secretsdo GitHub Actions.
No GitHub:
Settings -> Secrets and variables -> Actions -> New repository secret
Crie os secrets abaixo:
SMTP_HOSTSMTP_PORT(ex.:587)SMTP_USERSMTP_PASSEMAIL_FROMEMAIL_TO
Sem esses secrets o monitoramento roda, mas o envio de e-mail nao funciona.
Essa forma e boa quando voce quer controlar tudo por arquivo versionado.
Arquivo: config/trackers.yaml
Exemplo:
trackers:
- id: catena-malbec-001
wine_name: "Vinho Catena Malbec"
site: superadega
start_date: "2026-03-02"
end_date: "2026-05-31"
active: true
- id: dv-catena-001
wine_name: "Vinho DV Catena"
site: superadega
start_date: "2026-03-10"
end_date: "2026-06-10"
active: trueCampos:
id(obrigatorio, unico)wine_name(obrigatorio)site(obrigatorio; deve existir emconfig/sites.yaml)start_date(obrigatorio, formatoYYYY-MM-DD)end_date(obrigatorio, formatoYYYY-MM-DD)active(opcional, defaulttrue)
- Edite
config/trackers.yamlno GitHub Web. - Commit da alteracao.
- Execute workflow
Price Monitormanualmente (ou aguarde o agendamento).
O workflow ja roda sync-trackers antes da checagem, entao as mudancas entram automaticamente.
Essa forma e boa para nao editar YAML manualmente.
Actions -> Tracker Admin -> Run workflow
addupdateremovelist
action: acao administrativa.tracker_id: obrigatorio paraupdate/remove; opcional paraadd.wine_name: obrigatorio paraadd.site: site configurado emconfig/sites.yaml(default no add:superadega).start_dateeend_date: periodoYYYY-MM-DD.days: alternativa astart/end.activate/deactivate: controle de ativo noupdate.
- O workflow altera
config/trackers.yaml. - Em seguida executa
sync-trackers. - Faz commit automatico de
config/trackers.yamledata/state.json.
Arquivo: config/sites.yaml
Ja existe suporte nativo:
superadega:
provider: superadega
enabled: truePara um novo site, use provider: generic_css.
Exemplo:
superadega:
provider: superadega
enabled: true
lojavinhos:
provider: generic_css
enabled: true
base_url: "https://www.lojavinhos.com.br"
search_url_template: "https://www.lojavinhos.com.br/busca?q={query}"
card_selector: ".product-card"
card_name_selector: ".product-card__name"
card_link_selector: "a"
card_price_selector: ".product-card__price"
product_price_selector: ".product-page__price"
timeout_seconds: 20Depois disso, use site: lojavinhos nos trackers.
- Abra o site e faca uma busca por um vinho.
- Inspecione o card de produto no DevTools.
- Mapeie nome, link e preco da listagem.
- Abra a pagina de produto e mapeie o seletor de preco final.
- Atualize
config/sites.yamle commit.
Arquivo: .github/workflows/price-monitor.yml
- Agenda: a cada 6 horas.
- Tambem pode rodar manualmente.
- Etapas:
- instala dependencias
- sincroniza trackers
- executa checagem de preco
- envia e-mail se houver queda
- commit do
data/state.json
Arquivo: .github/workflows/tracker-admin.yml
- Execucao manual por formulario.
- Gerencia trackers sem edicao manual de YAML.
- Commit automatico das alteracoes.
Fonte de verdade dos trackers (o que monitorar, onde, e por quanto tempo).
Estado de execucao:
- trackers sincronizados
- URL de produto encontrada
- ultimo preco observado
- historico de observacoes
- confira secrets SMTP
- confira se SMTP exige App Password
- confira
SMTP_PORT(geralmente587)
- valide
idunico - valide datas em
YYYY-MM-DD - valide
end_date >= start_date
sitedo tracker nao existe emconfig/sites.yaml
- seletor CSS pode ter mudado
- revise seletores em
config/sites.yaml
Resumo operacional recomendado:
- Use
Tracker Adminpara operacao rapida (add/update/remove/list). - Use edicao direta de
config/trackers.yamlpara alteracoes em lote. - Deixe
Price Monitorrodando no cron.