Recuperar detalles de la conversación

Puedes recuperar los detalles de un objeto «Conversación» correspondiente a una llamada de voz mediante la Conversation API.

Si bien este tutorial se centra específicamente en la recuperación de los detalles de una llamada de voz, existen muchos otros casos de uso posibles con otras capacidades, como una videollamada o una sesión de chat de texto. El propósito de este tutorial es brindar información sobre la estructura de una conversación, ya que la conversación es un objeto importante que subyace a gran parte de la tecnología de Vonage. Es una estructura de datos fundamental para las actividades de comunicación, ya que toda la comunicación se realiza a través de una conversación.

La configuración que tendrá en este tutorial se ilustra en el siguiente diagrama:

Conversation

En este tutorial

Requisitos previos

  1. Crear un Account de Vonage - Sin esto no llegarás muy lejos.
  2. Alquilar un número de Vonage - Deberías tener un par de euros de saldo disponible. Es más que suficiente.
  3. Instala las herramientas de línea de comandos de Vonage - necesitará Nodo instalado, pero usar Vonage CLI es rápido y cómodo.
  4. Deberías tener Python 3 y Frasco instalados. Estos son necesarios para su servidor webhook.

Este tutorial presupone que se ejecutará Ngrok para poder ejecutar tu webhook servidor de forma local.

Si no está familiarizado con Ngrok, consulte nuestro Tutorial Ngrok antes de proceder.

¡Además, necesitarás tener acceso a dos teléfonos para este tutorial!

Así que, si estás listo para continuar...

Crear una aplicación de Vonage

En primer lugar, tendrás que crear una cuenta en la aplicación de Vonage, si aún no lo has hecho:

vonage apps:create "Conversation App" --voice_answer_url=http://demo.ngrok.io/webhooks/answer --voice_event_url=http://demo.ngrok.io/webhooks/event

En este comando anterior tendrá que sustituir demo por lo que se aplica a su configuración.

Anota el ID de aplicación generado (APP_ID), lo necesitará cuando genere un JWT.

Vincula un número de Vonage a tu aplicación

Suponiendo que ya hayas alquilado un número de Vonage (VONAGE_NUMBER), puedes vincular tu número de Vonage con tu aplicación en el panel o a través de la línea de comandos:

vonage apps:link:app APP_ID --number=VONAGE_NUMBER

Crear un JWT

La Conversation API se autentica mediante JWT. Puedes generar un JWT con el siguiente comando:

JWT="$(vonage jwt --private_key=private.key --app_id=APP_ID)"

Debe sustituir APP_ID junto con el ID de tu aplicación. Además, private.key es la clave asociada a esta misma aplicación.

NOTA: Este JWT tendrá una validez de un día.

A continuación, puede ver el JWT con:

echo $JWT

CONSEJO: Puede Verify su JWT en jwt.io.

Ejecute su servidor webhook

Tienes que ejecutar un servidor de webhooks para poder obtener el ID de conversación de la llamada en curso. El siguiente código en Python será suficiente:

from flask import Flask, request, jsonify
from pprint import pprint

app = Flask(__name__)

ncco = [{
        "action": "connect",
        "endpoint": [{
            "type": 'phone',
            "number": 'TO_NUMBER'
        }]
}]

@app.route("/webhooks/answer")
def answer_call():
    params = request.args
    pprint(params)
    return jsonify(ncco)

if __name__ == '__main__':
    app.run(port=3000)

IMPORTANTE: Debe sustituir TO_NUMBER con el número de tu segundo teléfono, el teléfono 2 (Bob).

Ejecutar este servidor webhook localmente con:

python3 app.py

Llama a tu número de Vonage

Marca tu número de Vonage con el teléfono 1 (Alice). La llamada entrante se desvía a tu segundo teléfono, el teléfono 2 (Bob). Responde la llamada en el teléfono 2 (Bob). No canceles la llamada en este momento.

Ahora comprueba el registro producido por tu servidor webhook. Usted debe ver algo similar a:

...
{
   'conversation_uuid': 'CON-bc643220-2542-499a-892e-c982c4150c06',
   'from': '447700000001',
   'to': '447700000002',
   'uuid': '797168e24c19a3c45e74e05b10fef2b5'
}
...

Sólo te interesa el ID de la conversación, que tiene la forma CON-<uuid>. Copia y pega ese ID en algún sitio donde te resulte cómodo.

Consulta los detalles de la conversación

Puede recuperar los detalles del objeto Conversación para la llamada actual ejecutando el siguiente comando en otra pestaña del terminal.

NOTA: Tendrás que asegurarte de sustituir $CONVERSATION_ID por el ID que obtuvo anteriormente y $JWT por el JWT que creó anteriormente.

Obtén los detalles de la conversación de la llamada de voz con lo siguiente:

Escriba el código

Añada lo siguiente a get-conversation.sh:

curl "https://api.nexmo.com/v1/conversations/$CONV_ID" \
     -H 'Authorization: Bearer '$JWT\
     -H 'Content-Type: application/json'

Ver fuente completa

Ejecute su código

Guarde este archivo en su máquina y ejecútelo:

bash get-conversation.sh

Requisitos previos

npm install @vonage/server-sdk

Crea un archivo llamado get-conversation.js y añade el siguiente código:

const { Vonage } = require('@vonage/server-sdk');

const vonage = new Vonage({
  applicationId: VONAGE_APPLICATION_ID,
  privateKey: VONAGE_PRIVATE_KEY,
});

Ver fuente completa

Escriba el código

Añada lo siguiente a get-conversation.js:

vonage.conversations.getConversation(CONV_ID)
  .then((conversation) => console.log(conversation))
  .catch((error) => console.error(error));

Ver fuente completa

Ejecute su código

Guarde este archivo en su máquina y ejecútelo:

node get-conversation.js

Requisitos previos

Añada lo siguiente a build.gradle:

implementation 'com.vonage:server-sdk:9.3.1'

Crea un archivo llamado GetConversation y añade el siguiente código al método main:

VonageClient client = VonageClient.builder()
        .applicationId(VONAGE_APPLICATION_ID)
        .privateKeyPath(VONAGE_PRIVATE_KEY_PATH)
        .build();

Ver fuente completa

Escriba el código

Añada lo siguiente al método main del archivo GetConversation:

var conversation = client.getConversationsClient().getConversation(CONV_ID);
System.out.println(conversation);

Ver fuente completa

Ejecute su código

Podemos utilizar el plugin aplicación para Gradle para simplificar la ejecución de nuestra aplicación. Actualiza tu build.gradle con lo siguiente:

apply plugin: 'application'
mainClassName = project.hasProperty('main') ? project.getProperty('main') : ''

Ejecute el siguiente comando gradle para ejecutar su aplicación, sustituyendo com.vonage.quickstart.conversation por el paquete que contiene GetConversation:

gradle run -Pmain=com.vonage.quickstart.conversation.GetConversation

Requisitos previos

Install-Package Vonage

Crea un archivo llamado GetConversation.cs y añade el siguiente código:

using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Vonage;
using Vonage.Conversations.GetConversation;
using Vonage.Request;

Ver fuente completa

Añada lo siguiente a GetConversation.cs:

var credentials = Credentials.FromAppIdAndPrivateKeyPath(VONAGE_APPLICATION_ID, VONAGE_PRIVATE_KEY_PATH);
var client = new VonageClient(credentials);

Ver fuente completa

Escriba el código

Añada lo siguiente a GetConversation.cs:

var response = await client.ConversationsClient.GetConversationAsync(GetConversationRequest.Parse(CONV_ID));

Ver fuente completa

Requisitos previos

composer require vonage/client

Crea un archivo llamado get-conversation.php y añade el siguiente código:

use Vonage\Conversation\ConversationObjects\CreateConversationRequest;

require_once __DIR__ . '../../config.php';
require_once __DIR__ . '../../vendor/autoload.php';

$keypair = new \Vonage\Client\Credentials\Keypair(
    file_get_contents(VONAGE_APPLICATION_PRIVATE_KEY_PATH),
    VONAGE_APPLICATION_ID
);

$client = new \Vonage\Client($keypair);

Ver fuente completa

Escriba el código

Añada lo siguiente a get-conversation.php:

$conversation = $client->conversation()->getConversationById(CONVERSATION_ID);

Ver fuente completa

Ejecute su código

Guarde este archivo en su máquina y ejecútelo:

php get-conversation.php

Esta llamada a la API te dará una respuesta similar a la siguiente:

{
    "id": "CON-bc643220-2542-499a-892e-c982c4150c06",
    "name": "NAM-1b2c4274-e3f2-494e-89c4-46856ee84a8b",
    "timestamp": {
        "created": "2018-10-25T09:26:18.999Z"
    },
    "sequence_number": 8,
    "numbers": {},
    "properties": {
        "ttl": 172800,
        "video": false
    },
    "members": [
        {
            "member_id": "MEM-f44c872e-cba9-444f-88ae-0bfa630865a6",
            "user_id": "USR-33a51f4d-d06b-42f6-a525-90d2859ab9f6",
            "name": "USR-33a51f4d-d06b-42f6-a525-90d2859ab9f6",
            "state": "JOINED",
            "timestamp": {
                "joined": "2018-10-25T09:26:30.334Z"
            },
            "channel": {
                "type": "phone",
                "id": "797168e24c19a3c45e74e05b10fef2b5",
                "from": {
                    "type": "phone",
                    "number": "447700000001"
                },
                "to": {
                    "type": "phone",
                    "number": "447700000002"
                },
                "leg_ids": [
                    "797168e24c19a3c45e74e05b10fef2b5"
                ]
            },
            "initiator": {
                "joined": {
                    "isSystem": true
                }
            }
        },
        {
            "member_id": "MEM-25ccda92-839d-4ac6-a7b2-de310224878b",
            "user_id": "USR-b9948493-be4a-4b36-bb4d-c96bcc2af85b",
            "name": "vapi-user-f59c1ff26c0543fdb6c02fd30617a1c0",
            "state": "JOINED",
            "timestamp": {
                "invited": "2018-10-25T09:26:19.385Z",
                "joined": "2018-10-25T09:26:30.270Z"
            },
            "invited_by": "USR-b9948493-be4a-4b36-bb4d-c96bcc2af85b",
            "channel": {
                "type": "phone",
                "id": "30cecc87-7ac9-4d03-910a-e9d69558263c",
                "from": {
                    "number": "Unknown",
                    "type": "phone"
                },
                "leg_ids": [
                    "30cecc87-7ac9-4d03-910a-e9d69558263c"
                ],
                "to": {
                    "number": "447700000001",
                    "type": "phone"
                },
                "cpa": false,
                "preanswer": false,
                "ring_timeout": 60000,
                "cpa_time": 5000,
                "max_length": 7200000
            },
            "initiator": {
                "invited": {
                    "isSystem": true
                }
            }
        }
    ],
    "_links": {
        "self": {
            "href": "https://api.nexmo.com/v0.3/conversations/CON-bc643220-2542-499a-892e-c982c4150c06"
        }
    }
}

Esta respuesta se explica con más detalle en el Conversación tema.

Ahora puedes colgar el teléfono 1 (Alice) y el teléfono 2 (Bob) para finalizar la llamada.

Conclusión

Ya has visto cómo utilizar la Conversation API para obtener el objeto Conversation de una llamada de voz.

Recursos