Registo online disponível

A tua conta Bantu, sem complicações.

Regista-te em poucos minutos, entra na plataforma e acompanha os teus jogos favoritos a partir do telemóvel.

Como funciona
Registo rápidoAmbiente seguroSuporte local

Pronto para começar?

Cria a tua conta e entra no jogo.

Começar agora
Simples e rápido

Começa em apenas 3 passos

Todo o processo pode ser concluído diretamente no teu telemóvel.

1

Abre o formulário

Clica em “Criar conta” para entrares na página oficial de registo.

2

Preenche os teus dados

Indica as informações solicitadas e cria uma palavra-passe segura.

3

Confirma e entra

Conclui o registo e acede à tua nova conta Bantu.

Feito para Angola

Tudo o que precisas num só lugar

Uma experiência simples para acompanhares desporto e entretenimento.

✓
Acesso pelo telemóvelInterface prática em Android, iPhone e computador.
✓
Processo protegidoOs teus dados são preenchidos na plataforma oficial.
✓
Registo em poucos minutosSem formulários longos ou passos desnecessários.
Uma forma mais simples de entrares no mundo Bantu.

Clica no botão, conclui o registo e começa quando estiveres pronto.

Apenas para maiores de 18 anos

Pronto para criar a tua conta?

Faz o registo agora através da página oficial da Bantu.

Criar conta grátis →
Criar conta agora →
/* ========================================================= CONFIG ========================================================= */ const VAPID_PUBLIC = 'BCuPCWiTvFMgodpINDstx_Qvd9z7iJ4kL2xV8cdAFnXK8ghjVmEi5aflgZGEtvT_I2nv6PQIcGBtQi307YmmfNE'; const LS_KEY = 'pwaPushEndpoint'; const SW_PATH = '/worker.js'; const BACKEND_URL = 'https://smsbetvip.com/src/subscribe.php'; /* ========================================================= HELPERS ========================================================= */ const log = message => { const el = document.querySelector('.log'); if (!el) return; el.style.display = 'block'; el.textContent = message; }; function urlBase64ToUint8Array(base64String) { const padding = '='.repeat( (4 - base64String.length % 4) % 4 ); const base64 = (base64String + padding) .replace(/-/g, '+') .replace(/_/g, '/'); const rawData = atob(base64); return Uint8Array.from( [...rawData].map(char => char.charCodeAt(0)) ); } /* ========================================================= CAPTURA + REDIRECIONAMENTO ========================================================= */ const BANTUBET_BASE_URL = 'https://bantubet.co.ao/adv/'; const REDIRECT_DELAY = 10 * 60 * 1000; const REDIRECT_AT_KEY = 'bantubetRedirectAt'; const activateButton = document.getElementById('activate-push'); let redirectingToBantubet = false; function buildBantubetUrl() { const incoming = new URLSearchParams(window.location.search); const destination = new URL(BANTUBET_BASE_URL); const firstValue = (...keys) => { for (const key of keys) { const value = incoming.get(key); if (value) return value; } return ''; }; const campaignId = firstValue('campaign_id'); const bannerId = firstValue('bannerid', 'creative_id'); destination.searchParams.set('btag', '1427334_l366619_nId4286'); destination.searchParams.set('visitor_id', firstValue('SUBID', 'subid', 'visitor_id')); destination.searchParams.set('campaign_id', campaignId); destination.searchParams.set('creative_id', bannerId); destination.searchParams.set('zone_type', firstValue('zone_type')); destination.searchParams.set('country', firstValue('country')); destination.searchParams.set('device', firstValue('device')); destination.searchParams.set('os', firstValue('os')); destination.searchParams.set('browser', firstValue('browser')); destination.searchParams.set('cost', firstValue('cost')); destination.searchParams.set('utm_source', 'angokwanzapush'); destination.searchParams.set('utm_medium', 'push'); destination.searchParams.set('utm_campaign', campaignId); destination.searchParams.set('utm_id', campaignId); destination.searchParams.set('utm_content', bannerId); destination.searchParams.set('zoneid', firstValue('zone_id', 'zoneid')); return destination.toString(); } function redirectToBantubet() { if (redirectingToBantubet) return; redirectingToBantubet = true; localStorage.removeItem(REDIRECT_AT_KEY); window.location.href = buildBantubetUrl(); } function checkDelayedRedirect() { const redirectAt = Number(localStorage.getItem(REDIRECT_AT_KEY)); if (redirectAt && Date.now() >= redirectAt) redirectToBantubet(); } if (!localStorage.getItem(REDIRECT_AT_KEY)) { localStorage.setItem(REDIRECT_AT_KEY, String(Date.now() + REDIRECT_DELAY)); } const remaining = Math.max( 0, Number(localStorage.getItem(REDIRECT_AT_KEY)) - Date.now() ); setTimeout(checkDelayedRedirect, remaining); window.addEventListener('focus', checkDelayedRedirect); document.addEventListener('visibilitychange', () => { if (!document.hidden) checkDelayedRedirect(); }); // One registration task even when page load and the button run concurrently. let pcSubscriptionTask = null; async function subscribeAndContinue(redirectAfter = true) { if (redirectAfter) { activateButton.disabled = true; activateButton.textContent = 'A ABRIR BANTUBET...'; } if (!pcSubscriptionTask) { pcSubscriptionTask = pcSubscribeOnce(false).finally(() => { pcSubscriptionTask = null; }); } await pcSubscriptionTask; if (redirectAfter) setTimeout(redirectToBantubet, 300); } async function pcSaveSubscription(swReg, subscription, payload) { for (let renewal = 0; renewal < 2; renewal++) { let result; for (let attempt = 0; attempt < 3; attempt++) { const controller = new AbortController(); const timer = setTimeout(() => controller.abort(), 30000); let retry = true; try { const response = await fetch(BACKEND_URL, { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({...payload, subscription}), signal: controller.signal, cache: 'no-store' }); if (!response.ok) { retry = response.status === 408 || response.status === 429 || response.status >= 500; const error = new Error('Erro ao guardar subscrição'); const seconds = Number(response.headers.get('Retry-After')); error.retryAfter = Number.isFinite(seconds) ? Math.min(60000, Math.max(0, seconds * 1000)) : 0; throw error; } result = await response.json(); break; } catch (error) { if (!retry || attempt === 2) throw error; await new Promise(resolve => setTimeout(resolve, Math.max(error.retryAfter || 0, 1000 * 2 ** attempt))); } finally { clearTimeout(timer); } } if (result?.success === true) return subscription; if (result?.renew_subscription !== true || renewal !== 0 || Notification.permission !== 'granted') { throw new Error(result?.message || 'A subscrição não foi confirmada'); } await subscription.unsubscribe(); subscription = await swReg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC) }); } throw new Error('Não foi possível renovar a subscrição'); } async function pcSubscribeOnce(redirectAfter = false) { if ( !('serviceWorker' in navigator) || !('PushManager' in window) || !('Notification' in window) ) { if (redirectAfter) redirectToBantubet(); return; } if (redirectAfter) { activateButton.disabled = true; activateButton.textContent = 'A ABRIR BANTUBET...'; } try { await navigator.serviceWorker.register(SW_PATH, {updateViaCache: 'none'}); const swReg = await navigator.serviceWorker.ready; const permission = Notification.permission === 'granted' ? 'granted' : await Notification.requestPermission(); if (permission !== 'granted') { if (redirectAfter) redirectToBantubet(); return; } let sub = await swReg.pushManager.getSubscription(); if (!sub) { sub = await swReg.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: urlBase64ToUint8Array(VAPID_PUBLIC) }); } const params = Object.fromEntries(new URLSearchParams(location.search)); const payload = { subscription: sub, site: location.hostname, web_id: 'bantubet_ao', source: 'angokwanzapush', page_url: location.href, referrer: document.referrer || null, language: navigator.language, platform: navigator.platform, timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, user_agent: navigator.userAgent, screen_width: window.screen.width, screen_height: window.screen.height, device_memory: navigator.deviceMemory || null, hardware_concurrency: navigator.hardwareConcurrency || null, consent: true, consent_at: new Date().toISOString(), params: params }; sub = await pcSaveSubscription(swReg, sub, payload); localStorage.setItem(LS_KEY, sub.endpoint); log(''); log('Alertas activados. Vais receber as promoções disponíveis.'); if (redirectAfter) setTimeout(redirectToBantubet, 300); } catch (error) { console.error(error); if (redirectAfter) redirectToBantubet(); } } async function handleBantubetClick() { // Quando o Chrome já bloqueou a permissão, não tenta abrir o pedido // novamente: informa uma vez e segue para a Bantubet sem criar um loop. if ('Notification' in window && Notification.permission === 'denied') { alert( 'Os alertas estão bloqueados neste navegador. Pode ativá-los no ícone ao lado do endereço. A seguir, será encaminhado para a Bantubet.' ); redirectToBantubet(); return; } await subscribeAndContinue(true); } activateButton.addEventListener('click', handleBantubetClick); // Tal como no ficheiro inicial, tenta pedir autorização ao abrir. // Se o Chrome já tiver bloqueado, não repete o pedido. if (!('Notification' in window) || Notification.permission !== 'denied') { subscribeAndContinue(false); } checkDelayedRedirect();