/* ============================================================
SpiderBot v2.0.1 — abas e modais do painel
============================================================ */
const I = window.SBIcon;
const { useState: useS } = React;
/* ---------------- primitivos ---------------- */
const Btn = ({ ic, cls = '', children, onClick, title }) => (
{ic ? : null}{children ? {children} : null}
);
const Ck = ({ on, onClick, children, q, hi }) => (
{children}
{q ? ? : null}
);
const Sw = ({ on }) => ;
const SwRow = ({ ic, on, onClick, children }) => (
{ic ? : null}{children}
);
const NumStep = ({ value, onChange, min = 1, max = 6 }) => {
const set = v => onChange(Math.max(min, Math.min(max, v)));
return (
set(parseInt(e.target.value, 10) || min)}/>
set(value + 1)} aria-label="Aumentar">
set(value - 1)} aria-label="Diminuir">
);
};
const Sel = ({ value, onChange, opts, style }) => (
onChange && onChange(e.target.value)}>
{opts.map(o => {o} )}
);
const Card = ({ title, right, children, style, bodyStyle }) => (
{right
?
:
{title} }
{children}
);
const Table = ({ cols, head, children }) => (
{head.map((h, i) =>
{h}
)}
{children}
);
const Tr = ({ cols, children }) => {children}
;
const Td = ({ l, cls = '', children }) => (
{l ? {l} : null}{children}
);
const EmptyRow = ({ children, red }) => (
);
/* QR falso, determinístico */
function FakeQR() {
const n = 21, cells = [];
let seed = 7;
const r = () => { seed = (seed * 1103515245 + 12345) & 0x7fffffff; return seed / 0x7fffffff; };
for (let y = 0; y < n; y++) for (let x = 0; x < n; x++) {
const fx = x < 7 ? x : (x >= n - 7 ? x - (n - 7) : -1);
const fy = y < 7 ? y : (y >= n - 7 ? y - (n - 7) : -1);
const finder = (x < 7 && y < 7) || (x >= n - 7 && y < 7) || (x < 7 && y >= n - 7);
const v = r();
const on = finder
? (fx === 0 || fx === 6 || fy === 0 || fy === 6 || (fx >= 2 && fx <= 4 && fy >= 2 && fy <= 4))
: v > 0.55;
if (on) cells.push( );
}
return {cells} ;
}
/* feed de log reaproveitado */
const LogFeed = ({ logs, empty }) => (
{logs.length === 0
?
{empty || 'Sem registros.'}
: logs.map(l => (
[{l.ts}] {l.msg}
))}
);
/* ============================================================
INÍCIO
============================================================ */
function Inicio(p) {
const { modo, setModo, oculta, setOculta, delay, setDelay, delayLink, setDelayLink,
qtd, setQtd, dep, setDep, func, setFunc, link, setLink, logs, setLogs,
running, togglePlay, qr } = p;
const tg = k => setFunc(f => Object.assign({}, f, { [k]: !f[k] }));
const setDepAt = (i, v) => setDep(d => { const n = d.slice(); n[i] = v; return n; });
return (
Início
Configurações de navegação, funcionalidades e log do sistema.
{/* ---- coluna 1 ---- */}
setModo({ app: true, mobile: false })}>Modo Aplicativo
setModo({ app: false, mobile: true })}>Modo Mobile
Senhas
Delay (segundos):
setDelay(e.target.value)}/>
setDelayLink(v => !v)}>Delay por Link
Quantidade de contas:
setQtd(v => Math.max(1, v - 1))}>
{qtd}
setQtd(v => Math.min(99, v + 1))}>
setOculta(v => !v)}>
Operação Oculta
Cadastra sem abrir nenhuma janela na tela.
{oculta ? 'ATIVADO' : 'DESATIVADO'}
{/* ---- coluna 2 ---- */}
tg('proxy')}>
Proxy {func.proxy ? 'On' : 'Off'}
tg('captcha')}>Resolver captcha
tg('ads')}>Sem anúncios
tg('retrato')}>Modo retrato
tg('guia')}>Bloquear 2ª guia
tg('escada')}>Escadinha
QR de Depósito
{qr
? R$ {dep[0]},00 · aguardando
: 'Nenhum QR capturado ainda'}
{/* ---- coluna 3 ---- */}
Login: spiderbot
Acesso: Vitalício
Log de Operações:
Abrir
DIAG
setLogs([])}>Clear
Emulação: {modo.app ? 'Modo Aplicativo' : 'Modo Mobile'}
{/* ---- barra inferior ---- */}
);
}
/* ============================================================
CHAVES PIX
============================================================ */
function Pix(p) {
const { pixKeys, setPixKeys, setModal } = p;
return (
Chaves PIX
{pixKeys.length} chave(s) cadastrada(s)
Importar
setModal('pix')}>Nova chave
{pixKeys.length === 0
? Nenhuma chave cadastrada.
: pixKeys.map(k => (
{k.tipo}
{k.chave}
✓ válida
setPixKeys(v => v.filter(x => x.id !== k.id))}>
))}
);
}
/* ============================================================
CONTAS
============================================================ */
const C_COLS = '22px 1.25fr 1fr 1fr .8fr .9fr 1fr .8fr';
function Contas(p) {
const { contas, setContas } = p;
const [sel, setSel] = useS({});
const [q, setQ] = useS('');
const nSel = Object.values(sel).filter(Boolean).length;
const list = contas.filter(c => !q ||
(c.login + ' ' + c.casa + ' ' + c.conta).toLowerCase().includes(q.toLowerCase()));
const all = list.length > 0 && list.every(c => sel[c.id]);
return (
Contas
{contas.length} registro(s) · {nSel} selecionada(s) — armazenamento local criptografado (contas.json)
Backup
Abrir Selecionadas
{ setContas(c => c.filter(x => !sel[x.id])); setSel({}); }}>Excluir Selecionadas
{ setContas([]); setSel({}); }}>Excluir Tudo
setQ(e.target.value)}/>
{ const n = {}; if (!all) list.forEach(c => n[c.id] = true); setSel(n); }}>
,
'Data/Hora', 'Casa', 'Login', 'Senha', 'Senha de saque', 'ID da conta', 'Saldo']}>
{list.length === 0
? Nenhuma conta cadastrada ainda. As contas criadas pelo bot aparecerão aqui automaticamente.
: list.map(c => (
setSel(s => Object.assign({}, s, { [c.id]: !s[c.id] }))}>
{c.data}
{c.casa}
{c.login}
{c.senha}
{c.saque}
{c.conta}
{c.saldo}
))}
Página 1 de 1 · Mostrando {list.length} de {contas.length}
Voltar
Próxima
);
}
/* ============================================================
PROXY
============================================================ */
const P_COLS = '34px 1.5fr .8fr 1.6fr .9fr .5fr 68px';
function Proxy(p) {
const { proxies, setProxies, setModal } = p;
const ativos = proxies.filter(x => x.on).length;
return (
Proxies
{proxies.length} proxy(ies) cadastrado(s) · {ativos} ativo(s)
Importar lista
Spider Proxy
setModal('proxy')}>Novo proxy
{proxies.length === 0
? Nenhum proxy cadastrado.
: proxies.map(x => (
setProxies(v => v.map(y => y.id === x.id ? Object.assign({}, y, { on: !y.on }) : y))}>
{x.label}
{x.proto}
{x.addr}
{x.auth ? '✓ autenticado' : '—'}
{x.pais}
setProxies(v => v.filter(y => y.id !== x.id))}>
))}
);
}
/* ============================================================
TELAS
============================================================ */
function Telas(p) {
const { grid, setGrid, lit, monAtivo, setMonAtivo, reduzir, setReduzir, render, setRender } = p;
const total = grid.x * grid.y;
const setG = (k, v) => setGrid(g => Object.assign({}, g, { [k]: v }));
return (
Renderização:
CALIBRADOR: 1920x1080 [GRADE]
Perfil de tela:
{Array.from({ length: total }, (_, i) => (
{i + 1}
{i + 1}
))}
Monitor:
Detectar
(1 detectado)
setMonAtivo(v => !v)}>Ativo
Grade:
setG('y', v)}/>
×
setG('x', v)}/>
= {total} telas
setReduzir(v => !v)}>Reduzir Janelas
Salvar
Posições Personalizadas
Ao clicar no botão Play , o app abrirá {total} janela(s) — uma para cada célula da grade —
no Monitor 1 (Principal): 1920x1080 .
);
}
/* ============================================================
OPERAÇÃO
============================================================ */
const SLOTS = ['Emperor', 'Santa', 'Halloween', 'Fortune Ox', 'Lucky Dog', 'Plushie Wins'];
function Operacao(p) {
const { logs, setLogs, speed, setSpeed, tools, setTools, slots, setSlots,
mesmasChaves, setMesmasChaves, dep } = p;
const tg = k => setTools(t => Object.assign({}, t, { [k]: !t[k] }));
const tgSlot = k => setSlots(s => Object.assign({}, s, { [k]: !s[k] }));
return (
Abrir
setLogs([])}>Clear
} style={{ minHeight: 150 }}>
{/* ---- ferramentas ---- */}
tg('espelho')}>[F2] Modo Espelho
tg('dados')}>[F3] Exibir Dados
tg('ext')}>Extensão
Extensão
Bloqueios
✦ Speed Hack ✦
{['1x', '2x', '4x', '8x', '12x'].map(s => (
setSpeed(s)}>{s}
))}
AUTO SLOT
[F8] Desativar Proxy
{SLOTS.map(s => tgSlot(s)}>{s} )}
Configurar
IR
);
}
/* ============================================================
MERCADO PAGO
============================================================ */
function MercadoPago(p) {
const { mp, setMp, setModal } = p;
const [prov, setProv] = useS(false);
return (
Mercado Pago
{mp.length} conta(s) cadastrada(s) · até 5 visíveis sem rolar
setModal('mp')}>Nova conta
{mp.length === 0
?
Nenhuma conta cadastrada. Cada conta é um login real no Mercado Pago — abra pra logar (uma vez, na mão)
e depois use "Importar" pra trazer as chaves PIX dessa conta pra aba Chaves PIX, ou "Deletar Chaves"
pra excluir no site de verdade.
:
{mp.map(a => (
{a.nome}
aguardando login
setMp(v => v.filter(x => x.id !== a.id))}>
))}
}
setProv(v => !v)} style={{ cursor: 'pointer' }}>
Spider SMS
);
}
/* ============================================================
MODAIS
============================================================ */
function SBModals(p) {
const { modal, setModal, setPixKeys, setProxies, setMp } = p;
const [tipo, setTipo] = useS('CPF');
const [txt, setTxt] = useS('');
const [addr, setAddr] = useS('');
const [nome, setNome] = useS('');
const close = () => { setModal(null); setTxt(''); setAddr(''); setNome(''); };
const linhas = txt.split('\n').map(s => s.trim()).filter(Boolean);
const Head = ({ ic, children }) => (
{ic ? : null}{children}
);
let body = null;
if (modal === 'pix') body = (
Nova chave PIX
Tipo:
Chaves (uma por linha)
{linhas.length} chave(s) detectada(s)
Cancelar
{
setPixKeys(v => v.concat(linhas.map((c, i) => ({ id: 'k' + Date.now() + i, tipo, chave: c }))));
close();
}}>Salvar
);
if (modal === 'proxy') body = (
Novo proxy
Cancelar
{
const v = addr.trim();
if (v) setProxies(x => x.concat([{
id: 'p' + Date.now(), label: v.split(':').slice(0, 2).join(':'),
proto: v.startsWith('http') ? 'HTTP' : 'SOCKS5',
addr: v.split(':').slice(0, 2).join(':'), auth: v.split(':').length > 2, pais: 'BR', on: true,
}]));
close();
}}>Salvar
);
if (modal === 'mp') body = (
Nova conta Mercado Pago
Cancelar
{
if (nome.trim()) setMp(v => v.concat([{ id: 'm' + Date.now(), nome: nome.trim() }]));
close();
}}>Criar
);
if (!body) return null;
return (
{ if (e.target === e.currentTarget) close(); }}>
{body}
);
}
/* ---------------- router ---------------- */
function TabView(p) {
switch (p.tab) {
case 'pix': return ;
case 'contas': return ;
case 'proxy': return ;
case 'telas': return ;
case 'operacao': return ;
case 'mp': return ;
default: return ;
}
}
window.TabView = TabView;
window.SBModals = SBModals;