Dashboard

Vue d'ensemble de vos performances

0
Messages envoyés
0
Leads scrapés
0
Comptes connectés
0
Campagnes
Messages envoyés
Total: 0 messages

Campaigns

Gérez vos campagnes d'outreach

Comptes

Gérez vos comptes Telegram

Connectez vos comptes Telegram pour scraper des groupes et envoyer des messages. Chaque compte augmente votre limite quotidienne.
if (!confirm('Démarrer?')) return; fetch(`/api/campaigns/${id}/start`, { method: 'POST' }) .then(() => { alert('✅ Démarrée!'); loadCampaigns(); }); } function deleteCampaign(id) { if (!confirm('Supprimer?')) return; fetch(`/api/campaigns/${id}`, { method: 'DELETE' }).then(() => loadCampaigns()); } // Create Campaign function showCreateCampaign() { if (!accounts.length) { alert('⚠️ Ajoutez un compte d\'abord!'); return showPage('accounts'); } currentStep = 1; keywords = []; messages = []; sendAccounts = []; scrapedUsers = []; document.getElementById('createCampaignModal').classList.add('active'); const sel = document.getElementById('scrapeAccount'); sel.innerHTML = '' + accounts.filter(a => a.status === 'connected').map(a => ``).join(''); updateSteps(); } function closeCampaign() { document.getElementById('createCampaignModal').classList.remove('active'); } function nextStep() { if (currentStep < 4) { currentStep++; updateSteps(); if (currentStep === 3) renderSendAccounts(); if (currentStep === 4) updateSummary(); } else { createCampaign(); } } function previousStep() { if (currentStep > 1) { currentStep--; updateSteps(); } } function updateSteps() { document.querySelectorAll('.step').forEach(s => { const n = parseInt(s.dataset.step); s.classList.remove('active', 'completed'); if (n === currentStep) s.classList.add('active'); else if (n < currentStep) s.classList.add('completed'); }); document.querySelectorAll('.step-content').forEach(c => c.classList.remove('active')); document.querySelector(`.step-content[data-step="${currentStep}"]`).classList.add('active'); const btn = document.getElementById('nextStepBtn'); btn.innerHTML = currentStep === 4 ? 'Lancer' : 'Continuer '; } function addKeyword() { const inp = document.getElementById('keywordInput'); const kw = inp.value.trim(); if (kw && !keywords.includes(kw)) { keywords.push(kw); renderKeywords(); inp.value = ''; } } function renderKeywords() { document.getElementById('keywordsList').innerHTML = keywords.map(k => `
${k}
` ).join(''); } function removeKeyword(k) { keywords = keywords.filter(x => x !== k); renderKeywords(); } function startScraping() { const acc = document.getElementById('scrapeAccount').value; const ch = document.getElementById('telegramChannel').value; const mu = parseInt(document.getElementById('maxUsers').value); const mm = parseInt(document.getElementById('maxMessages').value); if (!acc || !ch) return alert('Remplissez les champs'); const st = document.getElementById('scrapeStatus'); st.innerHTML = '🔄 Scraping... 0%'; const id = 'temp_' + Date.now(); const ai_prompt = analysisMode === 'ai' ? document.getElementById('aiPrompt').value : ''; fetch('/api/scrape', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ campaign_id: id, account: acc, channel: ch, max_users: mu, max_messages: mm, keywords, ai_prompt }) }).then(() => { const int = setInterval(() => { fetch(`/api/scrape/${id}/status`).then(r => r.json()).then(d => { document.getElementById('scrapeProgress').textContent = `${Math.round(d.progress || 0)}% - ${d.found || 0} users`; if (d.status === 'completed') { clearInterval(int); scrapedUsers = d.usernames || []; scrapedUsersData = d.user_data || {}; // Sauvegarder les données st.innerHTML = `✅ ${scrapedUsers.length} users!`; } }); }, 2000); }); } function showMessageModal() { document.getElementById('addMessageModal').classList.add('active'); } function closeMessageModal() { document.getElementById('addMessageModal').classList.remove('active'); } function saveMessage() { const content = document.getElementById('messageContent').value.trim(); if (content) { messages.push(content); renderMessages(); closeMessageModal(); } } function renderMessages() { document.getElementById('messagesList').innerHTML = messages.map((m, i) => `
${m}
` ).join(''); } function renderSendAccounts() { sendAccounts = accounts.filter(a => a.status === 'connected').map(a => ({ ...a, active: true })); document.getElementById('sendAccountsList').innerHTML = sendAccounts.map((a, i) => `
${a.name}
` ).join(''); } function toggleSendAccount(i) { sendAccounts[i].active = !sendAccounts[i].active; event.target.closest('.toggle').classList.toggle('active'); } function updateSummary() { document.getElementById('summaryUsers').textContent = scrapedUsers.length; document.getElementById('summaryMessages').textContent = messages.length; const active = sendAccounts.filter(a => a.active).length; document.getElementById('summaryAccounts').textContent = active; const perDay = parseInt(document.getElementById('messagesPerDay').value) || 10; document.getElementById('summaryLimit').textContent = active * perDay; } function createCampaign() { const useAiPersonalization = document.getElementById('useAiPersonalization').checked; const data = { name: document.getElementById('campaignName').value || 'Campagne 1', channel: document.getElementById('telegramChannel').value, keywords, ai_prompt: analysisMode === 'ai' ? document.getElementById('aiPrompt').value : '', use_ai_personalization: useAiPersonalization, messages, accounts: sendAccounts.filter(a => a.active), usernames: scrapedUsers, user_data: scrapedUsersData, // Données pour personnalisation delay_min: parseInt(document.getElementById('delayMin').value), delay_max: parseInt(document.getElementById('delayMax').value), messages_per_day: parseInt(document.getElementById('messagesPerDay').value) }; fetch('/api/campaigns', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }).then(() => { alert('✅ Créée!'); closeCampaign(); loadCampaigns(); }); } // Init window.addEventListener('resize', drawChart); loadAccounts(); loadCampaigns(); setTimeout(drawChart, 100);