Ir para o conteúdo

Agente de captura do Marketplace no Linux (home lab)

O agente abre o Marketplace do ClickBank no Chrome já logado, lê o catálogo e envia as ofertas para a página Ofertas (Radar) da plataforma. Cada execução aparece no topo de Ofertas e em Conexões (item "Captura diária de ofertas" do checklist). Se algo falhar, chega um aviso no Telegram.

systemd timer (03:30) → xvfb-run → node scripts/marketplace-daily.mjs
   → bridge local (porta 4179) → Chrome (perfil persistente) → Marketplace
   → POST /api/agent/capture/import (token do agente) → Ofertas
   → POST /api/agent/capture/report (started/finished) → status na plataforma

1. Token do agente (uma vez)

  1. Plataforma → Conexões → Agente de captura do Marketplace → Gerar token. O token (bvcap_…) aparece uma vez; copie o trecho do agent.env.
  2. No servidor, no usuário que roda a captura:
mkdir -p ~/.brandvelia && chmod 700 ~/.brandvelia
cat > ~/.brandvelia/agent.env <<'EOF'
BRANDVELIA_APP_URL=https://app.brandvelia.com
BRANDVELIA_AGENT_TOKEN=bvcap_COLE_AQUI
# opcional — Chromium em vez do Google Chrome:
# BV_CHROME_EXECUTABLE=/usr/bin/chromium
EOF
chmod 600 ~/.brandvelia/agent.env

O token só serve para enviar capturas deste workspace. Se vazar, revogue em Conexões e gere outro. Ele é guardado no banco apenas como hash.

Vindo do CRON_SECRET

Versões antigas do agente usavam CRON_SECRET. Ele ainda funciona, com aviso, somente se houver um único workspace; com mais de um, o servidor responde 409 e pede o token. Troque para BRANDVELIA_AGENT_TOKEN e apague o CRON_SECRET do agent.env. Se as duas variáveis existirem, o token vence.

2. Atualizar e conferir

cd ~/mypaidtraffic
git pull
pnpm install --frozen-lockfile
node scripts/marketplace-daily.mjs --doctor

O --doctor confere Node, playwright-core, navegador, display, perfil do Chrome (inclusive se está travado por outro processo), idade dos cookies, agent.env, conexão com a plataforma (/api/agent/capture/ping) e o tamanho do último arquivo de captura. Cada item aparece com ✔, ! ou ✖.

3. Recuperar o que já foi capturado

Capturas antigas ficaram em scripts/captures/ sem chegar à plataforma (o envio antigo só mandava capturas completas e saía com sucesso mesmo sem segredo). Para enviar agora:

node scripts/marketplace-daily.mjs --import-latest
# ou um arquivo específico
node scripts/marketplace-daily.mjs --import-file scripts/captures/marketplace-2026-09-22.json

Capturas parciais são aceitas quando têm pelo menos 100 ofertas e metade da última captura completa; elas só acrescentam ou atualizam ofertas, nunca removem.

4. Agendamento

Se você já tem um timer (marketplace-capture@.timer + runner próprio)

Mantenha. O runner só precisa continuar chamando, dentro do xvfb-run:

BV_UNATTENDED=1 node scripts/marketplace-daily.mjs

e respeitar o código de saída:

Código Significado O que fazer
0 Ofertas enviadas (completa, parcial aceita ou já enviada) nada
1 Captura falhou (Chrome, bridge, timeout) --doctor e journalctl
2 Configuração (token ausente ou recusado) gerar token em Conexões
3 Sessão do ClickBank expirou --login via RDP
4 Captura recusada pelo servidor ver o motivo em Ofertas

Com BV_UNATTENDED=1, sessão expirada falha em ~90 s com código 3 (antes a janela invisível esperava 10 min). O homelab-browser.sh pode usar o código 3 para abrir o incidente SessionExpired.

Referência pronta (systemd)

sudo cp scripts/linux/brandvelia-capture@.service scripts/linux/brandvelia-capture@.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now brandvelia-capture@SEU_USUARIO.timer
systemctl list-timers | grep brandvelia
journalctl -u brandvelia-capture@SEU_USUARIO -n 100

O timer dispara às 03:30 (hora do servidor, com até 5 min de variação) e tem Persistent=true (se o servidor estava desligado, roda ao ligar); o serviço roda dentro do xvfb-run com limite de 75 minutos.

5. Sessão do ClickBank (2FA)

Quando o ClickBank pedir login ou 2FA, abra a sessão gráfica (RDP/VNC) e rode:

node scripts/marketplace-daily.mjs --login

A janela do Chrome da captura abre no seu display; faça o login. A sessão fica salva no perfil e a próxima execução agendada roda sem janela.

Perfil do Chrome: o padrão é ~/.brandvelia/marketplace-chrome (BV_CHROME_PROFILE_DIR muda). Se o seu auto-login (homelab-autologin.js) usa outro perfil, aponte os dois para o mesmo diretório e nunca rode os dois ao mesmo tempo — o Chrome trava o perfil (o --doctor avisa).

6. O que a plataforma mostra

Mensagem em Ofertas/Conexões Causa provável
Captura completa importada tudo certo
Captura parcial importada algumas páginas falharam; a próxima tenta de novo
Sessão do ClickBank expirou rodar --login via RDP
Captura recusada pelo servidor parcial pequena demais ou arquivo inválido — motivo no histórico
Sem sinal do agente há mais de 26 h timer parado, servidor desligado ou token revogado
Captura não terminou a tempo travou por mais de 90 min — ver journalctl
Configuração do agente incompleta agent.env sem token ou token revogado — --doctor

O cron marketplace-sync da plataforma faz a vigilância: agente mudo por mais de 26 h ou execução sem fim por mais de 90 min gera aviso no Telegram, e execuções presas há mais de 2 h são marcadas como falhas.

Variáveis

Variável Padrão Uso
BRANDVELIA_APP_URL https://app.brandvelia.com endereço da plataforma
BRANDVELIA_AGENT_TOKEN — token do agente (Conexões)
BV_CHROME_EXECUTABLE Google Chrome caminho do Chrome/Chromium
BV_CHROME_CHANNEL chrome canal do Playwright quando não há executável
BV_CHROME_PROFILE_DIR ~/.brandvelia/marketplace-chrome perfil persistente
BV_COOKIE_FILE ~/.brandvelia/clickbank-cookies.json cookies salvos
BV_AGENT_BRIDGE_PORT 4179 porta local do bridge do agente
BV_UNATTENDED 1 na execução agendada falha rápido sem sessão