Génération en cours...
AdGenius Pro
IA Marketing

Générateur de Visuels

Créez des visuels publicitaires percutants grâce à l'IA. Décrivez votre idée et laissez l'intelligence artificielle donner vie à votre créativité.

Aperçu

Votre visuel apparaîtra ici

Remplissez le formulaire et lancez la génération

Copywriting IA

Générez des textes publicitaires percutants, des slogans, des descriptions produits et bien plus grâce à l'intelligence artificielle.

Résultat

Votre texte apparaîtra ici

Remplissez le formulaire et lancez la génération

Campagne Emailing

Composez votre email, chargez une liste de prospects et envoyez votre campagne en masse. Les variables {{prenom}}, {{nom}}, {{entreprise}} sont automatiquement remplacees pour chaque destinataire.

Composer l'email
Liste de destinataires
0 contact(s)
Historique des campagnes

Aucune campagne envoyee

Les campagnes envoyees apparaitront ici

Generation de Prospects

Trouvez des emails professionnels en recherchant par localisation et secteur d'activite. Sauvegardez vos resultats en listes nommees pour les utiliser dans vos campagnes emailing.

Recherche de prospects
Resultats

Aucun prospect trouve

Entrez une localisation et un secteur d'activite pour lancer la recherche
Mes listes sauvegardees function switchTab(tab, btn) { document.querySelectorAll('.nav-btn').forEach(function(b) { b.classList.remove('active'); }); document.querySelectorAll('.module-panel').forEach(function(p) { p.classList.remove('active'); }); btn.classList.add('active'); document.getElementById('panel-' + tab).classList.add('active'); } function showLoading(text) { document.getElementById('loadingText').textContent = text || 'Génération en cours...'; document.getElementById('loadingOverlay').classList.add('active'); } function hideLoading() { document.getElementById('loadingOverlay').classList.remove('active'); } async function generateVisual() { var desc = document.getElementById('visualDesc').value.trim(); if (!desc) { alert('Veuillez décrire votre visuel.'); return; } var style = document.getElementById('visualStyle').value; var format = document.getElementById('visualFormat').value; var parts = format.split('x'); var prompt = desc + '. Style: ' + style + '. Format: professionnel, haute qualité.'; showLoading('Création du visuel en cours...'); try { var res = await fetch('/api/index.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'generate-visual', prompt: prompt, width: parseInt(parts[0]), height: parseInt(parts[1]) }) }); var data = await res.json(); if (data.error) { alert('Erreur: ' + data.error); hideLoading(); return; } var b64 = data.data[0].b64_json || data.data[0].url; var imgSrc = b64.startsWith('http') ? b64 : 'data:image/png;base64,' + b64; document.getElementById('visualPreview').innerHTML = 'Visuel généré'; document.getElementById('visualDownloadLink').href = imgSrc; document.getElementById('visualDownload').style.display = 'block'; } catch (e) { alert('Erreur: ' + e.message); } hideLoading(); } async function generateCopy() { var type = document.getElementById('copyType').value; var product = document.getElementById('copyProduct').value.trim(); var desc = document.getElementById('copyDesc').value.trim(); var tone = document.getElementById('copyTone').value; var lang = document.getElementById('copyLang').value; if (!product && !desc) { alert('Veuillez remplir au moins le produit ou la description.'); return; } var prompt = 'Tu es un expert en copywriting et marketing digital. Génère un contenu de type "' + type + '" pour ' + (product || 'ce produit') + '.\n\nDescription/Contexte: ' + (desc || 'Non précisé') + '\n\nTon souhaité: ' + tone + '\nLangue: ' + lang + '\n\nFournis un texte professionnel, percutant et prêt à l\'emploi.'; showLoading('Rédaction en cours...'); try { var res = await fetch('/api/index.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'generate-copy', prompt: prompt }) }); var data = await res.json(); if (data.error) { alert('Erreur: ' + data.error); hideLoading(); return; } document.getElementById('copyOutput').innerText = data.choices[0].message.content; } catch (e) { alert('Erreur: ' + e.message); } hideLoading(); } async // ===================================================================== // MODULE 3: CAMPAGNE EMAILING // ===================================================================== // Insert variable into email body function insertVar(varName) { var ta = document.getElementById('campBody'); var start = ta.selectionStart; var end = ta.selectionEnd; var text = ta.value; ta.value = text.substring(0, start) + varName + text.substring(end); ta.selectionStart = ta.selectionEnd = start + varName.length; ta.focus(); } // Generate campaign email with AI async function generateCampaignEmail() { var fromName = document.getElementById('campFromName').value.trim(); var context = fromName || 'mon entreprise'; var prompt = 'Tu es un expert en email marketing B2B. Redige un email de prospection professionnel en HTML simple.\n'; prompt += 'Contexte: ' + context + '\n'; prompt += 'L\'email doit:\n'; prompt += '- Etre concis et percutant (3-4 paragraphes max)\n'; prompt += '- Avoir un objet accrocheur (sur la premiere ligne, prefixe par "OBJET: ")\n'; prompt += '- Inclure un call-to-action clair\n'; prompt += '- Utiliser les variables {{prenom}}, {{nom}}, {{entreprise}} pour la personnalisation\n'; prompt += '- Etre en format HTML simple (balises

, ,
, )\n'; prompt += 'Ne mets PAS de balises , ou . Juste le contenu.\n'; prompt += 'Commence directement par OBJET: puis le texte HTML de l\'email.'; document.getElementById('campBody').value = 'Generation en cours...'; try { var res = await fetch('/api/index.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'generate-email', prompt: prompt }) }); var data = await res.json(); if (data.error) { document.getElementById('campBody').value = ''; alert('Erreur: ' + data.error); return; } var content = data.choices[0].message.content; // Extract subject if present if (content.indexOf('OBJET:') === 0) { var lines = content.split('\n'); document.getElementById('campSubject').value = lines[0].replace('OBJET:', '').trim(); document.getElementById('campBody').value = lines.slice(1).join('\n').trim(); } else { document.getElementById('campBody').value = content.trim(); } } catch (e) { document.getElementById('campBody').value = ''; alert('Erreur: ' + e.message); } } // Preview email function previewCampaignEmail() { var body = document.getElementById('campBody').value; var subject = document.getElementById('campSubject').value; if (!body) { alert('Redigez d\'abord le contenu de l\'email.'); return; } // Replace variables with sample data var preview = body .replace(/\{\{prenom\}\}/g, 'Jean') .replace(/\{\{nom\}\}/g, 'Dupont') .replace(/\{\{prenom_nom\}\}/g, 'Jean Dupont') .replace(/\{\{nom_prenom\}\}/g, 'Dupont Jean') .replace(/\{\{entreprise\}\}/g, 'ACME Solutions') .replace(/\{\{email\}\}/g, 'jean.dupont@acme.fr') .replace(/\{\{ville\}\}/g, 'Paris') .replace(/\{\{domaine\}\}/g, 'acme.fr') .replace(/\{\{source\}\}/g, 'Recherche web'); var html = '

'; // Show in modal-like overlay var overlay = document.createElement('div'); overlay.id = 'emailPreviewOverlay'; overlay.style.cssText = 'position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.7);z-index:10000;display:flex;align-items:center;justify-content:center;padding:20px;'; overlay.innerHTML = '
' + '
' + '

Apercu de l\'email

' + '' + '
' + '
' + html + '
' + '
' + '
'; document.body.appendChild(overlay); overlay.addEventListener('click', function(e) { if (e.target === overlay) overlay.remove(); }); } // Load campaign list async function loadCampaignLists() { try { var res = await fetch('/api/index.php?action=lists'); var data = await res.json(); var select = document.getElementById('campListSelect'); select.innerHTML = ''; if (data.success && data.lists) { data.lists.forEach(function(lst) { var opt = document.createElement('option'); opt.value = lst.id; opt.textContent = lst.name + ' (' + lst.count + ' contacts) — ' + lst.created_at; select.appendChild(opt); }); } } catch (e) { console.error('Error loading lists:', e); } } function onCampaignListSelect(listId) { if (!listId) { document.getElementById('campListCount').textContent = '0 contact(s)'; document.getElementById('campListPreview').style.display = 'none'; return; } fetch('/api/index.php?action=lists&sub=load&id=' + listId) .then(r => r.json()) .then(data => { if (data.success && data.list) { var emails = data.list.emails || []; document.getElementById('campListCount').textContent = emails.length + ' contact(s)'; document.getElementById('campListPreview').style.display = 'block'; var html = ''; var show = emails.slice(0, 20); show.forEach(function(item) { var status = item.status || ''; var statusBadge = status === 'valid' ? ' ' : status === 'invalid' ? ' ' : ''; html += '
'; html += '' + (item.email || '') + statusBadge + ''; html += '' + (item.source || '') + '
'; }); if (emails.length > 20) html += '
... et ' + (emails.length - 20) + ' autres
'; document.getElementById('campListDetails').innerHTML = html; } }); } // Send campaign async function sendCampaign(testMode) { var listId = document.getElementById('campListSelect').value; var fromName = document.getElementById('campFromName').value.trim(); var fromEmail = document.getElementById('campFromEmail').value.trim(); var subject = document.getElementById('campSubject').value.trim(); var body = document.getElementById('campBody').value.trim(); if (!listId) { alert('Selectionnez une liste de destinataires.'); return; } if (!fromEmail) { alert('Renseignez l\'email expediteur.'); return; } if (!subject) { alert('Renseignez l\'objet de l\'email.'); return; } if (!body) { alert('Redigez le contenu de l\'email.'); return; } var confirmMsg = testMode ? 'Envoyer un email de test a ' + fromEmail + ' ?' : 'ATTENTION: Vous allez envoyer un email a TOUS les destinataires de la liste.\n\nEtes-vous sur de vouloir continuer ?'; if (!confirm(confirmMsg)) return; var payload = { action: 'send-campaign', list_id: listId, from_name: fromName, from_email: fromEmail, subject: subject, body_html: body, test_mode: testMode }; if (testMode) payload.test_emails = [fromEmail]; // Show sending progress document.getElementById('btnSendCampaign').disabled = true; document.getElementById('campaignResult').style.display = 'block'; document.getElementById('campaignResultContent').innerHTML = '

' + (testMode ? 'Envoi du test en cours...' : 'Envoi de la campagne en cours...') + '
Cette operation peut prendre plusieurs minutes

'; try { var res = await fetch('/api/index.php?action=send-campaign', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); var data = await res.json(); if (data.error) { document.getElementById('campaignResultContent').innerHTML = '
Erreur: ' + data.error + '
'; } else if (data.success) { var stats = data.stats || {}; var html = '
'; html += '
'; html += '

' + (testMode ? 'Test envoye !' : 'Campagne envoyee !') + '

'; html += '

' + (data.message || '') + '

'; html += '
'; html += '
' + (stats.total || 0) + '
Total
'; html += '
' + (stats.sent || 0) + '
Envoyes
'; html += '
' + (stats.failed || 0) + '
Echoues
'; html += '
'; if (!testMode && stats.start_time && stats.end_time) { html += '

Duree: ' + (stats.duration || '-') + ' | Debut: ' + stats.start_time + ' | Fin: ' + stats.end_time + '

'; } html += '

ID Campagne: ' + (data.campaign_id || '') + '

'; html += '
'; document.getElementById('campaignResultContent').innerHTML = html; loadCampaignHistory(); } } catch (e) { document.getElementById('campaignResultContent').innerHTML = '
Erreur: ' + e.message + '
'; } document.getElementById('btnSendCampaign').disabled = false; } // Load campaign history async function loadCampaignHistory() { try { var res = await fetch('/api/index.php?action=campaigns'); var data = await res.json(); var container = document.getElementById('campaignHistory'); if (!data.success || !data.campaigns || data.campaigns.length === 0) { container.innerHTML = '

Aucune campagne envoyee

Les campagnes envoyees apparaitront ici
'; return; } var html = '
'; html += ''; html += ''; data.campaigns.forEach(function(c) { var statusBadge = c.test_mode ? 'Test' : 'Envoyee'; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; }); html += '
DateListeObjetTotalEnvoyesEchouesStatut
' + c.created_at + '' + (c.list_name || '-') + '' + (c.subject || '-') + '' + c.total + '' + c.sent + '' + c.failed + '' + statusBadge + '
'; container.innerHTML = html; } catch (e) { console.error('Error loading campaigns:', e); } } // ===================================================================== // MODULE 4: GENERATION DE PROSPECTS // ===================================================================== // Current prospects data var currentProspects = []; // Search prospects async function searchProspects() { var location = document.getElementById('prospectLocation').value.trim(); var activity = document.getElementById('prospectActivity').value.trim(); var country = document.getElementById('prospectCountry').value; if (!location && !activity) { alert('Renseignez au moins une localisation ou un secteur.'); return; } var html = '

Recherche multi-sources en cours...

Base SIRENE + Moteurs de recherche + Scraping web

'; document.getElementById('prospectOutput').innerHTML = html; document.getElementById('prospectCount').style.display = 'none'; document.getElementById('resultActions').style.display = 'none'; try { var res = await fetch('/api/index.php?action=search-prospects', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:location,activity:activity,country:country})}); var data = await res.json(); if (data.error) { document.getElementById('prospectOutput').innerHTML='
Erreur: '+data.error+'
'; return; } var prospects=(data.prospects||[]).map(function(item){item._selected=false;item._status='';return item;}); currentProspects=prospects; var st=data.stats||{}; document.getElementById('prospectCount').style.display='inline-block'; document.getElementById('prospectCount').textContent=prospects.length+' resultat(s)'; document.getElementById('resultActions').style.display='flex'; if(!prospects.length){document.getElementById('prospectOutput').innerHTML='

Aucun prospect

';return;} var sh='
'; sh+='
'+prospects.length+' etablissements
'; var wE=prospects.filter(function(p){return p.email;}).length; var wR=prospects.filter(function(p){return p.responsable;}).length; if(st.sirene)sh+='
'+st.sirene+' SIRENE
'; if(wR)sh+='
'+wR+' responsables
'; if(wE)sh+='
'+wE+' emails
'; sh+='
'; document.getElementById('prospectOutput').innerHTML=sh; renderProspectTable(); } catch(e){document.getElementById('prospectOutput').innerHTML='
'+e.message+'
';} } function renderProspectTable(){ if(!currentProspects||!currentProspects.length){document.getElementById('prospectOutput').innerHTML='

Aucun prospect

';return;} var sc=currentProspects.filter(function(p){return p._selected;}).length; document.getElementById('prospectCount').textContent=currentProspects.length+' resultat(s)'+(sc>0?' - '+sc+' selectionne(s)':''); var h='
'; h+=''; h+=''; currentProspects.forEach(function(p,i){ var sb=p._status==='valid'?'Valide':p._status==='invalid'?'Invalide':''; var rs=p._status==='invalid'?'opacity:0.5;':''; var nm=(p.nom||'?');if(nm.length>40)nm=nm.substring(0,37)+'...'; var em=p.email?p.email:'-'; var ph=p.telephone?p.telephone:'-'; var rp=(p.responsable||'-');if(rp.length>25)rp=rp.substring(0,22)+'...'; h+=''; h+=''; h+=''; h+=''; h+=''; h+=''; h+=''; }); h+='
NomVilleTelEmailResponsableStatut
'+nm+''+(p.ville||'-')+''+ph+''+em+''+rp+''+sb+'
'; document.getElementById('prospectOutput').innerHTML+=h; } function toggleProspect(i,c){currentProspects[i]._selected=c;renderProspectTable();} function toggleAllProspects(c){currentProspects.forEach(function(p){p._selected=c;});renderProspectTable();} function selectAllProspects(){currentProspects.forEach(function(p){p._selected=true;});renderProspectTable();} function deselectAllProspects(){currentProspects.forEach(function(p){p._selected=false;});renderProspectTable();} function removeSelected(){var s=currentProspects.filter(function(p){return p._selected;});if(!s.length){alert('Selectionnez au moins un prospect.');return;}if(!confirm('Supprimer '+s.length+' prospect(s) ?'))return;currentProspects=currentProspects.filter(function(p){return!p._selected;});document.getElementById('prospectCount').textContent=currentProspects.length;renderProspectTable();} async function bulkVerifySelected(){var s=currentProspects.filter(function(p){return p._selected&&p.email;});if(!s.length){alert('Selectionnez au moins un prospect avec email.');return;}currentProspects.forEach(function(p){if(p._selected&&p.email)p._status='verifying';});renderProspectTable();try{var r=await fetch('/api/index.php?action=bulk-verify',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({emails:s.map(function(p){return p.email;})})});var d=await r.json();if(d.success&&d.results){d.results.forEach(function(r2){currentProspects.forEach(function(p){if(p.email===r2.email)p._status=r2.status;});});renderProspectTable();alert('Verification: '+(d.stats.valid||0)+' valide(s)');}}catch(e){currentProspects.forEach(function(p){if(p._status==='verifying')p._status='';});renderProspectTable();}} function saveSelectedAsList(){var s=currentProspects.filter(function(p){return p._selected;});if(!s.length){alert('Selectionnez au moins un prospect.');return;}var name=prompt('Nom de la liste:','Prospects '+document.getElementById('prospectActivity').value+' '+document.getElementById('prospectLocation').value+' '+new Date().toLocaleDateString('fr-FR'));if(!name)return;var items=s.map(function(p){return{email:p.email||'',first_name:'',last_name:p.responsable||'',company:p.nom||'',domain:'',source:p.source||'',city:p.ville||'',type:p._status||''};});fetch('/api/index.php?action=lists',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({action:'save',name:name,description:'Recherche',emails:items})}).then(function(r){return r.json();}).then(function(d){if(d.success){alert(d.message);loadSavedLists();loadCampaignLists();}}).catch(function(e){alert(e.message);});} function exportSelectedCSV(){var s=currentProspects.filter(function(p){return p._selected;});if(!s.length){alert('Selectionnez au moins un prospect.');return;}var csv='Nom,Adresse,CP,Ville,Tel,Email,Site Web,Responsable,Activite,Source,Statut ';s.forEach(function(p){csv+='"'+(p.nom||'').replace(/"/g,'""')+'","'+(p.adresse||'').replace(/"/g,'""')+'","'+(p.code_postal||'')+'","'+(p.ville||'')+'","'+(p.telephone||'')+'","'+(p.email||'')+'","'+(p.site_web||'')+'","'+(p.responsable||'').replace(/"/g,'""')+'","'+(p.activite||'')+'","'+(p.source||'')+'","'+(p._status||'')+'" ';});var blob=new Blob([''+csv],{type:'text/csv;charset=utf-8;'});var link=document.createElement('a');link.href=URL.createObjectURL(blob);link.download='prospects_'+new Date().toISOString().slice(0,10)+'.csv';link.click();} async function loadSavedLists() { try { var res = await fetch('/api/index.php?action=lists'); var data = await res.json(); var container = document.getElementById('savedListsContainer'); if (!data.success || !data.lists || data.lists.length === 0) { container.innerHTML = '

Aucune liste sauvegardee

Effectuez une recherche et sauvegardez vos resultats
'; return; } var html = '
'; data.lists.forEach(function(lst) { html += '
'; html += '
'; html += '
' + lst.name + '
'; html += '
' + lst.count + ' contacts — creee le ' + lst.created_at; if (lst.description) html += ' — ' + lst.description; html += '
'; html += '
'; html += ''; html += ''; html += ''; html += ''; html += '
'; }); html += '
'; container.innerHTML = html; } catch (e) { console.error('Error loading lists:', e); } } // Load list back to table async function loadListToTable(listId) { try { var res = await fetch('/api/index.php?action=lists&sub=load&id=' + listId); var data = await res.json(); if (data.success && data.list) { var emails = (data.list.emails || []).map(function(item) { item._selected = false; item._status = item.status || ''; return item; }); currentProspects = emails; document.getElementById('prospectCount').style.display = 'inline-block'; document.getElementById('prospectCount').textContent = emails.length + ' resultat(s)'; document.getElementById('resultActions').style.display = 'flex'; renderProspectTable(); // Scroll to results document.getElementById('prospectOutput').scrollIntoView({ behavior: 'smooth', block: 'start' }); } } catch (e) { alert('Erreur: ' + e.message); } } // Export list as CSV function exportListCSV(listId) { window.open('/api/index.php?action=lists&sub=export&id=' + listId, '_blank'); } // Rename list function renameList(listId, oldName) { var newName = prompt('Nouveau nom pour "' + oldName + '":', oldName); if (!newName || newName === oldName) return; fetch('/api/index.php?action=lists', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'update', id: listId, name: newName }) }).then(r => r.json()).then(data => { if (data.success) { loadSavedLists(); loadCampaignLists(); } else { alert(data.error); } }); } // Delete list function deleteList(listId, name) { if (!confirm('Supprimer la liste "' + name + '" ? Cette action est irreversible.')) return; fetch('/api/index.php?action=lists', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'delete', id: listId }) }).then(r => r.json()).then(data => { if (data.success) { loadSavedLists(); loadCampaignLists(); } else { alert(data.error); } }); } // ===================================================================== // INIT: Load data when tabs are shown // ===================================================================== var _origSwitchTab = window.switchTab; window.switchTab = function(tabName, btn) { if (_origSwitchTab) _origSwitchTab(tabName, btn); if (tabName === 'email') { loadCampaignLists(); loadCampaignHistory(); } if (tabName === 'finder') { loadSavedLists(); } }; nter;justify-content:space-between;">'; html += '' + em + ''; if (typeof e === 'object') html += '' + (e.first_name || '') + ' ' + (e.last_name || '') + ''; html += '
'; }); html += '
'; } else { html += '

Aucun email généré.

'; } el.innerHTML = html; } catch (e) { el.innerHTML = '

' + e.message + '

'; } }