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)¶
- Plataforma → Conexões → Agente de captura do Marketplace → Gerar token.
O token (
bvcap_…) aparece uma vez; copie o trecho doagent.env. - 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 |