O Arbitragem de Apostas ajuda a encontrar e calcular oportunidades entre dois resultados possíveis de um jogo: vitória do Time A ou vitória do Time B.
A ferramenta monitora páginas da Betano, identifica jogos com odds válidas e exibe apenas oportunidades cujo ganho previsto seja maior que 30%, usando a regra de negócio atual da aplicação.
Importante: a estratégia não cobre empate. A ferramenta é um apoio matemático para análise de odds, não uma garantia de lucro.
- O robô consulta competições monitoradas na Betano.
- O scraper coleta dados via respostas JSON e também faz fallback lendo os cards renderizados no DOM.
- Os dados brutos da última execução são salvos no Cloudflare R2.
- A regra de negócio filtra apenas oportunidades com ganho previsto acima de 30%.
- A interface exibe as oportunidades, a última execução bem-sucedida e um resumo por competição.
Competições monitoradas hoje:
- Copa do Brasil
- Brasileirão Série A
- Brasileirão Série B
- Brasileirão Série C
- Brasileirão Série D
Principais recursos:
- Painel de oportunidades: mostra jogos que passaram na regra de ganho acima de 30%.
- Resumo por competição: informa quantas oportunidades existem no momento por campeonato.
- Status da coleta: mostra a data/hora da última execução bem-sucedida.
- Feedback de demora: informa que a primeira requisição pode demorar quando o serviço hospedado precisa acordar.
- Calculadora: calcula quanto apostar em cada lado para o retorno desejado.
O projeto usa:
- Frontend: HTML, CSS, Bootstrap e JavaScript puro em
src/public. - Backend: Express em
src/server.js. - Scraper: Puppeteer em
src/scrapers/betanoScraper.js. - Persistência: Cloudflare R2 via AWS SDK S3-compatible em
src/r2Storage.js.
Objetos salvos no R2:
oportunidades.json: oportunidades filtradas para consumo do front.betano/raw/latest.json: dados brutos da última coleta.oportunidades-meta.json: diagnóstico da última execução.
Status possíveis da última execução:
success_with_opportunities: coleta válida com oportunidades encontradas.success_no_opportunities: coleta válida, mas nenhuma oportunidade acima de 30%.completed_no_events: a coleta terminou, mas não encontrou eventos analisáveis.completed_no_odds: encontrou eventos, mas não conseguiu extrair odds válidas.
GET /api/oportunidadesRetorna as oportunidades filtradas salvas no R2.
GET /api/oportunidades/statusRetorna metadados da última execução.
POST /api/scrapeExecuta o scraper, salva o bruto no R2, atualiza as oportunidades filtradas e retorna o resultado.
1. Instale as dependências
npm install2. Configure o .env
Variáveis esperadas:
PORT=3001
R2_ENDPOINT=
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_BUCKET=3. Garanta o Chrome para o Puppeteer
Se sua máquina já tiver Chrome/Chromium instalado, o scraper tenta usar automaticamente.
Se precisar baixar o Chrome do Puppeteer:
npm run setup:chrome4. Suba a aplicação
npm run webAcesse:
http://localhost:3001
5. Execute o scraper
Pelo botão da interface ou via endpoint:
curl -X POST http://localhost:3001/api/scrapeTambém é possível rodar direto:
npm run scrapeO projeto possui configuração para Render em render.yaml.
No plano gratuito, o serviço pode ficar inativo. Por isso, a primeira requisição pode demorar mais enquanto a aplicação inicializa.
Dumps brutos locais e artefatos de debug do scraper não devem ser versionados. O projeto usa .gitignore para ignorar arquivos como:
data/*dump*.jsondata/*.htmldata/*.pngdata/betano_jogos_*.json
O bruto oficial da última coleta deve ficar no R2, não no repositório.



