Gustavo e11658b4e0 Correct misleading comment about the candidates derived-subquery rationale
Review found the comment claimed a per-row precomputation optimization
that SQLite does not actually perform: the reviewer counted replace()
opcodes in the compiled bytecode and got an identical count (305) for
both the inline and derived-subquery forms of the query, since SQLite
flattens the subquery and re-substitutes the expression text at each
usage site either way. Rewrote the comment to describe the derived
subquery as what it actually is (a readability device), and to state
plainly that the perf investigation did not conclusively isolate the
rare timing outliers to this SQL's shape.
2026-07-31 12:06:25 -03:00

Máquina Comercial Pessoal

Aplicação local para uma pessoa capturar, qualificar, tratar, exportar e contatar leads. Os dados ficam em SQLite no próprio computador e o WhatsApp funciona por uma sessão de dispositivo vinculado.

Instalação e acesso

Requisitos: Node.js 24 ou superior e npm.

npm install
npm start

Abra http://127.0.0.1:3910. O acesso inicial é admin / admin; abra Configurações > Alterar minha senha, informe admin como senha atual e defina uma nova senha com ao menos 8 caracteres. Essa opção está disponível para qualquer usuário autenticado. No Windows também é possível executar INICIAR-MAQUINA-PESSOAL.bat ou gerar o launcher com npm run build:launcher.

Variáveis opcionais ficam em .env. Consulte .env.example. A porta padrão é 3910 e pode ser alterada com APP_PORT.

Fluxo operacional

  1. Em Capturar Leads, escolha UF, cidades, nichos e fontes.
  2. Execute a captura e acompanhe o progresso.
  3. Em Tratar Leads, filtre e priorize a base.
  4. Use a ação de WhatsApp na primeira coluna para abrir o envio manual já preenchido com o lead real.
  5. Exporte o filtro atual em CSV e XLS quando precisar trabalhar fora da aplicação.

Conexão WhatsApp

  1. Abra Configurações como administrador.
  2. Clique em Conectar / gerar QR.
  3. No celular, abra WhatsApp > Dispositivos conectados > Conectar dispositivo.
  4. Leia o QR exibido na aplicação e aguarde o estado Conectado.

Os estados da conexão incluem parado, iniciando, QR necessário, autenticando, conectado, reconectando, desconectado e erro. Desconectar interrompe a conexão preservando a sessão. Sair e esquecer sessão remove o vínculo local e exigirá um novo QR.

O envio manual exige número com DDI e DDD, cadastro ativo desse número no WhatsApp, mensagem revisada e conexão pronta. O histórico distingue aceite local, confirmação do servidor, entrega e leitura; "aceito" ainda não significa que a mensagem foi entregue.

Automação e segurança comercial

  • A automação inicia desligada e deve ser ativada conscientemente pelo administrador.
  • Configure um limite diário baixo e mantenha os intervalos de envio.
  • Faça contato apenas em horários adequados e com uma finalidade legítima.
  • Adicione imediatamente à lista de bloqueio quem pedir para não receber mensagens.
  • Não faça spam, disparos indiscriminados nem compre listas de contatos.
  • A conexão usa integração não oficial por dispositivo vinculado. Mudanças no WhatsApp podem interromper o funcionamento e uso abusivo pode causar bloqueio da conta.

Templates automáticos são simples: serviço, mensagem e estado ativo. O catálogo inicial usa o serviço neutro Meu serviço; adapte sua oferta no mecanismo de configuração de serviços antes de ativar automações.

Dados locais

O banco, exportações, logs e autenticação do WhatsApp ficam em data/. A sessão vinculada fica em data/runtime/whatsapp-auth. Toda essa pasta é ignorada pelo Git.

Faça backup do banco indicado por APP_DB_PATH antes de manutenção ou migração. Nunca compartilhe .env, banco, logs ou a pasta de autenticação.

Comandos

npm start                 # servidor local
npm test                  # suíte automatizada
npm run capture           # captura por linha de comando
npm run download-rfb      # baixa/retoma os 21 ZIPs necessarios (~6 GB)
npm run extract -- --uf=BA # baixa o que faltar e extrai a base CNPJ da UF
npm run recalc-scores     # recalcula os scores
npm run outreach          # executa automação, quando habilitada
npm run build:launcher    # gera o launcher Windows

O botão Baixar e extrair base faz o mesmo fluxo em um clique. O downloader escolhe o snapshot público mais recente, mantém arquivos .part para retomada e valida tamanho e estrutura EOCD/diretório central dos ZIPs antes da extração. Um snapshot novo exige por padrão 8 GiB livres; ao retomar o mesmo snapshot, ZIPs finais confirmados e .part com metadata reduzem esse requisito, preservando uma margem mínima de 2 GiB para extração. O conjunto completo anterior fica em .rfb-backup até o novo snapshot ser validado. Se o índice ficar offline com o conjunto atual incompleto, o backup é validado e restaurado; finals e manifesto incompletos são movidos para .rfb-incomplete*, e .part permanece disponível quando a restauração não troca de snapshot. Para extrair somente com os arquivos locais já completos, use npm run extract -- --uf=BA --no-download.

Estrutura

public/                  interface web
prospeccao/config.json   nichos e serviço neutro inicial
scripts/                 comandos operacionais e build do launcher
src/capture/             captura de leads
src/treatment/           consultas e dashboard
src/outreach/            templates, limites e automação
src/whatsapp/            sessão local e envio
src/server/              servidor, autenticação e rotas
launcher/                launcher Windows
data/                    banco e estado local ignorados

Solução de problemas

  • A tela não abre: confirme npm install, rode npm start e acesse http://127.0.0.1:3910.
  • Porta ocupada: defina outra APP_PORT no .env e reinicie.
  • QR não aparece: clique em Conectar / gerar QR. Se o QR expirou ou a tentativa ficou presa, Atualizar QR reinicia o pareamento e solicita um QR novo.
  • WhatsApp desconectado: tente conectar novamente. Se a sessão estiver inválida, use Sair e esquecer sessão e vincule de novo.
  • Mensagem recusada: confira conexão, número com DDI/DDD, limite diário e lista de bloqueio.
  • Captura sem resultados: confirme a base CNPJ da UF, as fontes escolhidas e GOOGLE_PLACES_API_KEY caso use Google Places.
  • Launcher não compila: instale o .NET SDK ou execute a aplicação diretamente com npm start.

Boas práticas

Mantenha o servidor em 127.0.0.1, use senhas individuais, preserve a automação desligada até revisar templates e limites, e respeite privacidade, consentimento e pedidos de opt-out.

S
Description
No description provided
Readme
593 KiB
Languages
JavaScript 91.4%
CSS 3.7%
HTML 3.6%
C# 1%
Shell 0.1%
Other 0.1%