In questo post, esploreremo un’implementazione pratica di ai4call, un potente sistema di gestione delle chiamate basato su AI. Vedremo come creare un server Node.js che gestisce un flusso di chiamate interattivo, includendo funzionalità come prenotazioni e messaggi in segreteria. Questo tutorial è pensato per sviluppatori e tecnici che desiderano integrare ai4call nei loro sistemi esistenti.
Panoramica del Progetto
Il nostro progetto dimostrerà come:
- Gestire l’inizio di una chiamata con ai4call
- Offrire opzioni all’utente tramite input vocale o DTMF
- Inviare un link di prenotazione via WhatsApp
- Registrare un messaggio in segreteria
- Inviare il messaggio registrato via email
Prerequisiti
- Node.js installato sul vostro sistema
- Conoscenza base di JavaScript e Express.js
- Un account ai4call (potete registrarvi su ai4call.com)
Configurazione del Progetto
Iniziamo creando un nuovo progetto Node.js e installando le dipendenze necessarie:
mkdir ai4call-demo cd ai4call-demo npm init -y npm install express body-parser nodemailer
Il Codice
Ecco il codice completo del nostro server. Dopo il codice, spiegheremo ogni sezione in dettaglio.
const express = require('express'); const bodyParser = require('body-parser'); const nodemailer = require('nodemailer'); const app = express(); const port = 3000; app.use(bodyParser.json()); // Funzione simulata per l'invio di un messaggio WhatsApp async function sendWhatsAppMessage(phoneNumber, link) { console.log(`Invio messaggio WhatsApp al numero ${phoneNumber} con il link: ${link}`); // TODO: Implementare la logica reale per l'invio del messaggio WhatsApp return true; } // Configurazione del trasportatore email const transporter = nodemailer.createTransport({ host: "smtp.example.com", port: 587, secure: false, // Use TLS auth: { user: "your_email@example.com", pass: "your_password" } }); // Endpoint iniziale chiamato da ai4call all'inizio della chiamata app.post('/first-url', (req, res) => { const { callerNumber, recipientNumber } = req.body; console.log(`Chiamata ricevuta da ${callerNumber} al numero ${recipientNumber}`); const response = { text: "Benvenuto. Digita o pronuncia 1 per prenotazione, 2 per lasciare un messaggio in segreteria.", action: "ASR_DTMF", // Accetta input vocale o digitale key: "scelta_utente", next_url: "https://your-server.com/handle-choice", min_length: 1, max_length: 1, accept_timeout: 5000, // 5 secondi di timeout max_repeat: 3, repeat_delay: 5000 // 5 secondi tra le ripetizioni }; res.json(response); }); // Gestisce la scelta dell'utente app.post('/handle-choice', (req, res) => { const { scelta_utente, callerNumber, __tries = 0 } = req.body; const tries = parseInt(__tries); if (scelta_utente === "1") { // Opzione prenotazione const bookingLink = `https://prenotazioni.example.com/prenota?caller=${callerNumber}`; sendWhatsAppMessage(callerNumber, bookingLink); const response = { text: "Abbiamo inviato un messaggio WhatsApp con il link per la prenotazione. Grazie per averci contattato. Arrivederci!", action: "hangup" // Termina la chiamata }; res.json(response); } else if (scelta_utente === "2") { // Opzione messaggio in segreteria const response = { text: "Per favore, pronuncia il tuo nominativo.", action: "ASR_string", key: "nominativo", next_url: "https://your-server.com/record-message", max_repeat: 2 }; res.json(response); } else if (tries < 2) { // Gestione input non valido (max 3 tentativi totali) const response = { text: "Scelta non valida. Per favore, digita 1 per prenotazione o 2 per lasciare un messaggio.", action: "ASR_DTMF", key: "scelta_utente", next_url: "https://your-server.com/handle-choice", min_length: 1, max_length: 1, accept_timeout: 5000, max_repeat: 1, repeat_delay: 5000 }; response.__tries = tries + 1; res.json(response); } else { // Termina la chiamata dopo 3 tentativi falliti const response = { text: "Ci dispiace, ma non abbiamo ricevuto una scelta valida. La chiamata verrà terminata. Arrivederci.", action: "hangup" }; res.json(response); } }); // Gestisce la registrazione del messaggio app.post('/record-message', (req, res) => { const { nominativo, __tries = 0 } = req.body; const tries = parseInt(__tries); if (nominativo) { // Nominativo ricevuto, procedi con la registrazione del messaggio const response = { text: "Grazie. Ora puoi lasciare il tuo messaggio. Al termine, resta in silenzio per qualche secondo.", action: "ASR_string", key: "messaggio", next_url: "https://your-server.com/end-call", max_repeat: 1 }; res.json(response); } else if (tries < 2) { // Richiedi nuovamente il nominativo (max 3 tentativi totali) const response = { text: "Non abbiamo capito il tuo nominativo. Per favore, ripronuncia il tuo nome.", action: "ASR_string", key: "nominativo", next_url: "https://your-server.com/record-message", max_repeat: 1 }; response.__tries = tries + 1; res.json(response); } else { // Termina la chiamata dopo 3 tentativi falliti const response = { text: "Ci dispiace, ma non siamo riusciti a capire il tuo nominativo. La chiamata verrà terminata. Arrivederci.", action: "hangup" }; res.json(response); } }); // Gestisce la fine della chiamata e l'invio dell'email app.post('/end-call', (req, res) => { const { nominativo, messaggio, callerNumber } = req.body; if (messaggio) { // Prepara e invia l'email con il messaggio registrato const mailOptions = { from: 'your_email@example.com', to: 'gaspare@pippo.com', subject: `Nuovo messaggio in segreteria da ${nominativo}`, text: `Chiamante: ${callerNumber}\nNominativo: ${nominativo}\nMessaggio: ${messaggio}` }; transporter.sendMail(mailOptions, (error, info) => { if (error) { console.log("Errore nell'invio dell'email:", error); } else { console.log('Email inviata: ' + info.response); } }); const response = { text: "Grazie per il tuo messaggio. Arrivederci!", action: "hangup" }; res.json(response); } else { // Gestisce il caso in cui non sia stato registrato alcun messaggio const response = { text: "Non abbiamo ricevuto alcun messaggio. La chiamata verrà terminata. Arrivederci.", action: "hangup" }; res.json(response); } }); // Avvia il server app.listen(port, () => { console.log(`Server in ascolto sulla porta ${port}`); });
Spiegazione del Codice
Configurazione Iniziale
const express = require('express'); const bodyParser = require('body-parser'); const nodemailer = require('nodemailer'); const app = express(); const port = 3000; app.use(bodyParser.json());
Qui importiamo le dipendenze necessarie e configuriamo Express per gestire le richieste JSON.
Funzioni di Utilità
async function sendWhatsAppMessage(phoneNumber, link) { console.log(`Invio messaggio WhatsApp al numero ${phoneNumber} con il link: ${link}`); // TODO: Implementare la logica reale per l'invio del messaggio WhatsApp return true; } const transporter = nodemailer.createTransport({ // ... configurazione email });
Queste funzioni gestiscono l’invio di messaggi WhatsApp (simulato) e la configurazione per l’invio di email.
Gestione della Chiamata
Inizio Chiamata
app.post('/first-url', (req, res) => { // ... codice dell'endpoint });
Questo endpoint viene chiamato da ai4call all’inizio di ogni chiamata. Fornisce le opzioni iniziali all’utente.
Gestione della Scelta
app.post('/handle-choice', (req, res) => { // ... codice dell'endpoint });
Gestisce la scelta dell’utente, inviando un link WhatsApp per le prenotazioni o procedendo con la registrazione del messaggio.
Registrazione del Messaggio
app.post('/record-message', (req, res) => { // ... codice dell'endpoint });
Gestisce la registrazione del nominativo e del messaggio dell’utente.
Fine Chiamata
app.post('/end-call', (req, res) => { // ... codice dell'endpoint });
Gestisce la fine della chiamata, inviando un’email con il messaggio registrato se presente.
Punti Chiave dell’Implementazione
- Gestione degli Errori: Il codice include una logica per gestire input non validi, con un massimo di 3 tentativi per ogni interazione.
- Flessibilità: Il sistema accetta sia input vocali che DTMF, adattandosi alle preferenze dell’utente.
- Integrazione Multi-canale: Oltre alle chiamate vocali, il sistema può inviare messaggi WhatsApp e email.
- Personalizzazione: Ogni risposta può essere facilmente personalizzata modificando il testo e le opzioni.
Conclusione
Questo esempio dimostra quanto sia semplice implementare un sistema di gestione delle chiamate avanzato utilizzando ai4call. Con poche centinaia di righe di codice, abbiamo creato un sistema che può gestire prenotazioni, registrare messaggi e integrarsi con altri canali di comunicazione.
Per implementare questo sistema nel vostro ambiente:
- Sostituite “https://your-server.com” con l’URL effettivo del vostro server.
- Implementate la logica reale per l’invio di messaggi WhatsApp.
- Configurate correttamente il trasportatore email con le vostre credenziali SMTP.