
Partager:
Julia s'engage à aider ses collègues développeurs en créant des tutoriels, des guides et des ressources pratiques. Grâce à son expérience en matière de sensibilisation et d'éducation, elle vise à rendre la technologie plus accessible et à améliorer l'expérience globale des développeurs. Vous pouvez souvent la trouver lors d'événements communautaires locaux.
Créer un proxy Voice avec des fonctions en nuage
Temps de lecture : 8 minutes
La Voice Proxy - ou appel masqué - protège les données privées des utilisateurs en fournissant un numéro de téléphone intermédiaire. Ainsi, ni l'appelant ni l'appelé ne voient le véritable numéro de téléphone de l'autre. Cette pratique est courante dans les services de livraison et de covoiturage tels que Deliveroo et Uber, mais elle s'avère également utile dans de nombreux scénarios pour les petites entreprises.
Dans ce tutoriel, nous allons créer l'un de mes cas d'utilisation préférés : un téléphone professionnel virtuel.
Nous couvrirons deux directions d'appel :
Vous appelez un client via votre numéro Vonage : saisissez le numéro de destination par DTMF et connectez-vous.
Quelqu'un d'autre appelle votre numéro Vonage : connectez-le à votre numéro personnel.
Tout ce dont nous avons besoin pour que cela fonctionne, c'est d'un numéro Vonage virtuel et d'une petite fonction serverless gérant les webhooks.
Nous utiliserons Google Cloud FunctionsL'offre Function-as-a-Service (FaaS) de Google permet de construire plus rapidement dans le nuage.
Avec ces fonctions sans serveur pilotées par les événements, vous bénéficiez d'un calcul géré, d'une mise à l'échelle automatique et d'un paiement à l'utilisation mesuré à la centaine de millisecondes près. L'expérience du développeur est simple et intuitive, ce qui vous permet de vous concentrer sur le code tandis que Google Cloud gère l'infrastructure opérationnelle.
Vous pouvez considérer les fonctions cloud comme des blocs de construction qui permettent d'étendre rapidement vos services cloud avec du code. Elles s'exécutent en réponse à des événements transmis via HTTP ou émis par d'autres services de Google Cloud Platform, ce qui les rend parfaitement adaptées aux architectures basées sur les événements, au traitement des données et aux automatismes du cloud.
Dans cet exemple, nous écrivons une fonction HTTP qui est déclenchée par les requêtes HTTP reçues de l'API Voice de Vonage, en tirant parti de l'architecture basée sur les événements de Google Cloud Functions.
Conditions préalables
Compte Google Cloud Platform Compte : inscrivez-vous ou connectez-vous à Google ; vous obtiendrez un crédit d'une valeur de 300 $ pour commencer. Il s'agit d'un montant généreux qui devrait vous permettre de tester et d'apprendre pendant un certain temps.
Vonage API Account
To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.
This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.
Configurer Google Cloud Functions
Créer un nouveau projet Google Cloud
Tout d'abord, créez un nouveau projet si vous ne l'avez pas encore fait. Ces projets constituent la base de la création, de l'activation et de l'utilisation de tous les services Google Cloud.
Accéder à la page Gérer les ressources de la console cloud et cliquez sur Créer un projet. Pour en savoir plus sur la création et la gestion des ressources, consultez le Guide Google Cloud.
Créer une fonction cloud
Sélectionnez ensuite Fonctions du nuage dans le menu Navigation, puis cliquez sur Créer une fonction.
Il y a quelques champs à configurer :
Donnez à votre fonction un nom.
Sélectionnez une Région. J'ai choisi
europe-west-2car je suis proche de Londres. Si vous n'êtes pas sûr de la région qui vous convient le mieux, consultez la liste des régions disponibles.Définir le type de déclencheur à
HTTPcar nous écrivons une fonction HTTP.Cochez "Autoriser les invocations non authentifiées" et "Exiger HTTPS".
Une fois que vous avez terminé, copiez l'URL générée et cliquez sur Enregistrer.
Create function config page
Développez ensuite les paramètres PARAMÈTRES D'EXÉCUTION, DE CONSTRUCTION ET DE CONNEXIONS et descendez jusqu'à la section Variables d'environnement d'exécution. Nous devrons définir deux numéros de téléphone comme variables d'environnement, tous deux au format international E. 164. Par exemple, 447700900123 (Royaume-Uni) ou 14155550101 (États-Unis).
YOUR_VONAGE_NUMBER: l'un de vos numéros virtuels Vonage. Trouvez-en un dans votre tableau de bord Vonage ou achetez-en un.YOUR_PHONE_NUMBER: votre numéro de téléphone personnel que vous utiliserez pour les tests.
Set environment variables
Cliquez sur SuivantLa configuration est terminée ; passons maintenant au code !
Veillez à sélectionner Éditeur en ligne en tant que Code sourcela dernière version de Node.js en tant que Exécutionet activez toutes les API dont la plateforme peut vous avertir.
Cloud Functions Inline Editor warning about installing Cloud Build
L'éditeur de code en ligne montre une fonction standard générée qui utilise les objets de requête et de réponse Express.js. Nous allons la remplacer par notre fonction. Gardez à l'esprit que si vous changez le nom de la fonction, vous devrez mettre à jour le Point d'entrée également.
Créer une application Voice-Enabled de Vonage
A application API de Vonage contient les informations de sécurité et de configuration nécessaires pour se connecter aux points d'extrémité de Vonage et utiliser les API de Vonage. Chaque application Vonage créée peut prendre en charge plusieurs fonctionnalités ; cependant, nous n'avons besoin que de la fonctionnalité Voice pour l'instant.
Créons-en un en utilisant le Tableau de bord Vonage. Naviguez vers Vos applications -> Créer une nouvelle application.
Activez les fonctions Voice, puis indiquez l'URL des fonctions cloud générée dans le champ Answer URL dans le champ La mienne ressemble à ceci : https://europe-west2-my-proxy-calling-project.cloudfunctions.net/proxy-call.
Nous ne mettrons pas en œuvre un webhook d'événement, pour l'instant, alors n'hésitez pas à utiliser http://example.com/event dans ce champ.
Lorsque vous avez terminé, cliquez sur Générer une nouvelle application.
Create Voice-enabled Vonage Application
Sur la page suivante, vous verrez une liste des numéros virtuels disponibles dans votre Account. Cliquez sur l'icône lier en regard de ceux que vous souhaitez associer à cette application. Vous appellerez ce numéro pour tester votre application, alors commencez par un numéro local. Si aucune liste ne s'affiche ou si vous n'en voyez aucune qui vous convienne, vous pouvez également acheter d'autres numéros.
Link virtual Vonage number to Vonage Application
Si vous associez un numéro différent de celui que vous avez défini dans l'environnement d'exécution, veillez à mettre à jour la valeur de YOUR_VONAGE_NUMBER dans l'interface utilisateur de la console cloud.
Contrôle du flux d'appels
Maintenant que vous avez configuré une Application Vonage, Vonage fera une demande GET à votre Answer URL chaque fois que quelqu'un appelle votre numéro virtuel lié. Vonage attend un objet de contrôle d'appel (NCCO), un ensemble d'instructions sur la façon dont le flux d'appels doit être exécuté.
Un NCCO se présente sous la forme d'un tableau JSON valide contenant une ou plusieurs actions. Dans cet exemple, nous en utiliserons plusieurs :
l'action
talkl'action permettant de diffuser des messages vocaux dans l'appell'action
inputl'action de capturer l'entrée de l'utilisateur en détectant les tonalités DTMF (pressions sur les boutons)-Entrée DTMFl'action
connectpour connecter l'appelant et l'appelé.
Construire la fonction "cloud" (nuage)
Comme nous allons avoir trois cas, nous devons également renvoyer trois NCCO différents en conséquence.
Nous devons couvrir trois cas :
Quelqu'un d'autre appelle votre numéro Vonage -> connectez-le à votre numéro de téléphone
Vous appelez votre numéro Vonage :
2.1. Vous n'avez pas encore fourni de charge utile DTMF -> capture de l'entrée DTMF
2.2. La charge utile DTMF est disponible -> connecter l'appel à la charge utile DTMF (numéro de téléphone de destination)
Retournez dans la Google Cloud Console et remplacez le code standard par le code suivant.
// Get environment variables
const YOUR_VONAGE_NUMBER = process.env.YOUR_VONAGE_NUMBER;
const YOUR_PHONE_NUMBER = process.env.YOUR_PHONE_NUMBER;
exports.helloWorld = (req, res) => {
// Check if there's DTMF payload in the request body
if (req.body.dtmf) {
// (2.2) Connect call to the number in the DTMF payload
])
} else {
// Check if you're the caller
if (req.query.from === YOUR_PHONE_NUMBER) {
// (2.1) Capture destination number via DTMF input
} else {
// (1) Connect caller to your phone number
}
}
};
Examinons chacune de ces sections.
1. Recevoir un appel téléphonique : Connecter l'appelant
Tout d'abord, si quelqu'un appelle votre numéro virtuel, vous souhaitez que l'appel soit connecté à votre numéro de téléphone réel. Pour ce faire, il faut utiliser une action connect et, éventuellement, une action talk pour indiquer à l'appelant qu'il est connecté.
Dans ce cas, vous devez renvoyer le BCN suivant :
res.json([{
action: 'talk',
text: 'Please wait while we connect you.'
},
{
action: 'connect',
from: YOUR_VONAGE_NUMBER,
endpoint: [{
type: 'phone',
number: YOUR_PHONE_NUMBER
}]
}
])L'extrait ci-dessus est plus que suffisant pour ce cas d'utilisation, mais vous pouvez configurer davantage ces deux actions si vous le souhaitez. Rendez-vous sur le site de la Référence NCCO pour découvrir toutes les options disponibles.
2. Passer un appel téléphonique
Ensuite, nous devons traiter le cas où vous appelez votre numéro Vonage, indiquez le numéro de destination à l'aide du clavier de votre combiné (saisie DTMF), puis êtes connecté au numéro que vous venez d'indiquer.
Ce scénario se déroule en deux étapes.
2.1 Capture de l'entrée DTMF
Tout d'abord, nous devons renvoyer un NCCO contenant une action input pour capturer les chiffres. Ajoutons une action talk pour inclure des instructions.
L'action talk est identique à celle de l'étape précédente, elle est également facultative.
L'action input doit être de type ['dtmf']. La reconnaissance vocale est également disponible ; vous trouverez plus d'informations sur cette action dans le Référence NCCO.
Nous devons également modifier les paramètres par défaut de l'entrée DTMF. paramètres d'entrée DTMF par défaut pour qu'ils soient adaptés à la saisie d'un numéro de téléphone.
timeOutest le nombre de secondes qui s'écoulent avant que l'activité de l'appelant ne soit envoyée aueventUrlaprès sa dernière action. Il est de trois par défaut, mais prenons le maximum10pour nous donner un peu de marge de manœuvre.maxDigitsest le nombre de chiffres que l'utilisateur peut appuyer, quatre par défaut.15Le nombre de chiffres permet de composer des numéros de téléphone en E. 164 format international, qui est le format utilisé par Vonage pour les numéros de téléphone. Par exemple, un numéro britannique aurait le format 447700900123.submitOnHashpermet d'envoyer l'activité de l'appelant à la centrale téléphonique.eventUrlaprès avoir appuyé sur la touche #. Si l'on n'appuie pas sur la touche #, le résultat est transmis au bout detimeOutsecondes. Faux par défaut, assurez-vous donc de le mettre àtrue.
res.json([{
action: 'talk',
text: 'Please enter a phone number in international format, omitting the leading plus sign. End with the pound key.'
},
{
action: 'input',
type: ['dtmf'],
dtmf: {
timeOut: 10,
maxDigits: 15,
submitOnHash: true
},
eventUrl: ["https://europe-west2-my-proxy-calling-project.cloudfunctions.net/proxy-call"]
}
]) 2.2 Connecter l'appel à l'entrée DTMF
Une fois les chiffres capturés, Vonage émet une autre requête -OST par défaut- à notre point de terminaison avec une charge utile DTMF dans le corps de la requête. Ensuite, un deuxième NCCO avec une action connect doit être renvoyée pour que vous soyez connecté au numéro de destination.
res.json([{
action: 'talk',
text: 'Connecting'
},
{
action: 'connect',
from: YOUR_VONAGE_NUMBER,
endpoint: [{
type: 'phone',
number: req.body.dtmf.digits
}]
}
])Cet objet de contrôle d'appel est similaire au premier, sauf que nous définissons le numéro de destination de manière dynamique. req.body.dtmf.digits contient la charge utile DTMF ; voir l'entrée Référence du Webhook d'entrée pour plus de détails sur les résultats de la capture DTMF.
Le produit fini
Enfin, rassemblons tous les éléments mobiles ! En insérant les trois extraits dont nous avons parlé dans la fonction initiale, nous obtenons le code suivant :
// Get environment variables
const YOUR_VONAGE_NUMBER = process.env.YOUR_VONAGE_NUMBER;
const YOUR_PHONE_NUMBER = process.env.YOUR_PHONE_NUMBER;
exports.helloWorld = (req, res) => {
// Check if there's DTMF payload in the request body
if (req.body.dtmf) {
// (2.2) Connect call to the number in the DTMF payload
res.json([{
action: 'talk',
text: 'Connecting'
},
{
action: 'connect',
from: YOUR_VONAGE_NUMBER,
endpoint: [{
type: 'phone',
number: req.body.dtmf.digits
}]
}
])
} else {
// Check if you're the caller
if (req.query.from === YOUR_PHONE_NUMBER) {
// (2.1) Capture destination number via DTMF input
res.json([{
action: 'talk',
text: 'Please enter a phone number in international format, omitting the leading plus sign. End with the pound key.'
},
{
action: 'input',
type: ['dtmf'],
dtmf: {
timeOut: 10,
maxDigits: 15,
submitOnHash: true
},
eventUrl: ["https://europe-west2-my-proxy-calling-project.cloudfunctions.net/proxy-call"]
}
])
} else {
// (1) Connect caller to your phone number
res.json([{
action: 'talk',
text: 'Please wait while we connect you'
},
{
action: 'connect',
from: YOUR_VONAGE_NUMBER,
endpoint: [{
type: 'phone',
number: YOUR_PHONE_NUMBER
}]
}
])
}
}
};
Lorsque vous êtes prêt, cliquez sur DEPLOYER. Le déploiement peut prendre une minute ou deux, soyez patient :) Une fois qu'une coche verte est apparue à côté de votre fonction, vous êtes prêt à la tester !
Function deployed
Votre service de transfert d'appel est en service, alors appelez-le ! Mieux encore, demandez à un ami d'appeler votre numéro virtuel : vous pourrez ainsi tester les deux sens d'appel.
Quelle est la prochaine étape ?
Félicitations ! Vous venez de construire un service d'appel proxy avec une petite fonction de Google Cloud !
Prêt à aller plus loin ? Avez-vous un cas d'utilisation qui nécessite l'enregistrement des appels ? Permettre à plusieurs Numbers d'utiliser le service ? Accepter les entrées vocales et DTMF ?
Jetez un coup d'œil aux ressources ci-dessous et réfléchissez à la manière dont vous pourriez les développer. Faites-nous part de votre expérience et nous serons ravis d'entendre vos commentaires !
Ressources
À l'avenir, vous souhaiterez peut-être développer et tester vos fonctions localement. Consultez le guide Fonctions cloud Développement local pour savoir comment commencer.
Partager:
Julia s'engage à aider ses collègues développeurs en créant des tutoriels, des guides et des ressources pratiques. Grâce à son expérience en matière de sensibilisation et d'éducation, elle vise à rendre la technologie plus accessible et à améliorer l'expérience globale des développeurs. Vous pouvez souvent la trouver lors d'événements communautaires locaux.
