
Teilen Sie:
Ehemaliger Developer Advocate bei Vonage, wo seine Aufgabe darin bestand, die lokale Tech-Community in London zu unterstützen. Er ist ein erfahrener Veranstaltungsorganisator, Brettspieler und Vater eines süßen kleinen Hundes namens Moo. Er ist auch der Hauptorganisator von You Got This - einem Netzwerk von Veranstaltungen zu den Kernkompetenzen, die für ein glückliches, gesundes Arbeitsleben erforderlich sind.
Erstellen einer Verhaltenskodex-Incident-Line mit Node.js
Lesedauer: 5 Minuten
Ein Verhaltenskodex für Community-Organisatoren ist nur ein Teil der Geschichte - es ist auch wichtig, gut durchdachte Wege zu haben, um schlechtes Verhalten zu melden und darauf zu reagieren. Bei Veranstaltungen, die ich in der Vergangenheit geleitet habe, wurde den Teilnehmern eine Telefonnummer zur Verfügung gestellt - sie können die Nummer entweder anrufen oder eine SMS schicken, die dann an mehrere Organisatoren weitergeleitet wird, die die Verantwortung haben, bei Problemen zur Verfügung zu stehen.
Heute zeige ich Ihnen, wie Sie Ihr eigenes Programm mit der Vonage Voice und Nachrichten APIs erstellen können, komplett mit einem einfachen Dashboard zum Herunterladen von Anrufaufzeichnungen und zum Protokollieren eingehender Nachrichten.
Den endgültigen Projektcode finden Sie unter https://github.com/nexmo-community/node-code-of-conduct-conference-call
Voraussetzungen
Node.js auf Ihrem Rechner installiert
node-cli, das Sie installieren können, indem Sienpm install nexmo-cli@beta -g
Erstellen Sie ein neues Verzeichnis und öffnen Sie es in einem Terminal. Führen Sie npm init -y zum Erstellen einer package.json Datei und installieren Sie die Abhängigkeiten mit npm install express body-parser nunjucks uuid nedb-promises nexmo@beta.
Vonage API-Konto
Um dieses Tutorial durchzuführen, benötigen Sie ein Vonage API-Konto. Wenn Sie noch keines haben, können Sie sich noch heute anmelden und mit einem kostenlosen Guthaben beginnen. Sobald Sie ein Konto haben, finden Sie Ihren API-Schlüssel und Ihr API-Geheimnis oben auf dem Vonage-API-Dashboard.
In diesem Lernprogramm wird auch eine virtuelle Telefonnummer verwendet. Um eine zu erwerben, gehen Sie zu Rufnummern > Rufnummern kaufen und suchen Sie nach einer Nummer, die Ihren Anforderungen entspricht.
Abhängigkeiten einrichten
Erstellen Sie eine index.js Datei und richten Sie die Abhängigkeiten ein:
index.js
const uuid = require('uuid')
const app = require('express')()
const bodyParser = require('body-parser')
const nedb = require('nedb-promises')
const Nexmo = require('nexmo')
const nunjucks = require('nunjucks')
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
// Future code goes here
app.listen(3000)Sobald Sie dies getan haben, führen Sie npx ngrok http 3000 in einem neuen Terminal aus, und notieren Sie sich die temporäre ngrok-URL. Diese wird verwendet, um die localhost:3000 für das öffentliche Web verfügbar zu machen.
Virtuelle Nummer kaufen & Nexmo-Client einrichten
Öffnen Sie ein weiteres Terminal in Ihrem Projektverzeichnis und erstellen Sie eine neue Anwendung mit der Befehlszeilenschnittstelle (CLI):
nexmo app:create
-> Select Capabilities: voice, messages
-> Use the default HTTP methods? Y
-> Voice Answer URL: https://NGROK_URL/answer
-> Voice Event URL: https://NGROK_URL/event
-> Messages Inbound URL: https://NGROK_URL/inbound
-> Messages Status URL: https://NGROK_URL/event
-> Private Key path: private.key
Notieren Sie sich die in Ihrem Terminal angezeigte Anwendungs-ID und suchen Sie dann nach einer Nummer (Sie können GB durch Ihre Landesvorwahl ersetzen):
nexmo number:search GB --sms --voiceKopieren Sie eine der Numbers in Ihre Zwischenablage, kaufen Sie sie und verknüpfen Sie sie mit Ihrer Anwendung:
nexmo number:buy NUMBER
nexmo link:app NUMBER APP_ID
nexmo numbers:update NUMBER --mo_http_url https://NGROK_URL/smsUnter index.jsinitialisieren Sie den Nexmo-Client:
const nexmo = new Nexmo({
apiKey: 'API_KEY',
apiSecret: 'API_SECRET',
applicationId: 'APPLICATION_ID',
privateKey: './private.key'
}) Auf einen eingehenden Anruf mit Sprache antworten
Erstellen Sie den GET /answer Endpunkt und geben ein Nexmo-Aufrufsteuerungsobjekt (NCCO) mit einer einzigen talk Aktion zurück:
app.get('/answer', async (req, res) => {
res.json([
{ action: 'talk', voiceName: 'Amy', text: 'This is the Code of Conduct Incident Response Line' }
])
})
app.post('/event', (req, res) => {
res.status(200).end()
})
Der POST /event Endpunkt wird später Anrufdaten erhalten und sollte im Moment nur mit einem HTTP 200 OK Status antworten.
Kontrollpunkt: Starten Sie Ihren Server, indem Sie node index.js und rufen Sie dann die Nummer an, die Sie mit der CLI gekauft haben - Sie sollten die Nachricht vorgelesen bekommen, und dann sollte der Anrufer auflegen. Wenn es Probleme gibt, können Sie jederzeit die Einstellungen der Nummer und der Anwendung im Dashboard.
Reagieren Sie auf einen eingehenden Anruf, indem Sie die Organisatoren anwählen
Anstatt die Nachricht nur vorzulesen, fügen Sie den Anrufer zu einem neuen Gespräch hinzu. Wir können Unterhaltungen mit Code steuern, einschließlich des Hinzufügens mehrerer Teilnehmer zu dem Anruf - Sie müssen dazu nur den Namen der Unterhaltung kennen. Ersetzen Sie den Inhalt des /answer Endpunktes durch:
const conferenceId = uuid.v4()
res.json([
{ action: 'talk', voiceName: 'Amy', text: 'This is the Code of Conduct Incident Response Line' },
{ action: 'conversation', name: conferenceId, record: true }
])Dieser Code generiert eine neue eindeutige ID und fügt den Anrufer dann zu einem Gespräch hinzu, das einen Namen als Identifikator verwendet (Gespräche sind in diesem Zusammenhang Gespräche mit einem oder mehreren Teilnehmern). Ein-Personen-Konferenzgespräche sind jedoch traurig. Vor res.json()rufen Sie jeden Organisator an und fügen ihn der Telefonkonferenz hinzu:
for(let organizerNumber of ['NUMBER ONE', 'NUMBER TWO']) {
nexmo.calls.create({
to: [{ type: 'phone', number: organizerNumber }],
from: { type: 'phone', number: 'NEXMO NUMBER' },
ncco: [
{ action: 'conversation', name: conferenceId }
]
})
}Jede Nummer muss im E.164-Formatsein, und Sie sollten NEXMO NUMBER durch die mit Ihrer Anwendung verknüpfte Nummer ersetzen. Vergewissern Sie sich beim Testen, dass die Numbers im Array nicht mit den Nummern übereinstimmen, die Sie für den Anruf verwenden werden.
Kontrollpunkt: Starten Sie Ihren Server neu und rufen Sie Ihre Nexmo-Nummer an. Die Anwendung sollte alle Numbers einläuten, die im for()-Schleifenarray angegeben sind.
Aufzeichnung des Gesprächs
Beim Hinzufügen des Anrufers zur Telefonkonferenz, record: true als Option übergeben, so dass das gesamte Gespräch aufgezeichnet wird. Sobald das Gespräch beendet ist, wird dem POST /event Endpunkt eine Nutzlast, die die Gesprächs-ID und eine Aufzeichnungs-URL enthält.
Erstellen Sie vor den vorhandenen Endpunkten eine neue nedb-Datenbank:
const recordingsDb = nedb.create({ filename: 'data/recordings.db', autoload: true })Sobald Sie Ihren Server neu starten, wird eine Datei in einem data Verzeichnis erstellt. Aktualisieren Sie den Ereignisendpunkt, so dass er wie folgt aussieht:
app.post('/event', async (req, res) => {
if(req.body.recording_url) {
await recordingsDb.insert(req.body)
}
res.status(200).end()
})
Kontrollpunkt: Starten Sie Ihren Server neu und rufen Sie Ihre Nexmo-Nummer an. Sobald alle Teilnehmer aufgelegt haben, sollten Sie einen neuen Eintrag in der Datei data/aufzeichnungen.db Datei sehen.
Ein Aufnahme-Dashboard erstellen
Jetzt sind die Aufzeichnungsdaten in einer Datenbank gespeichert; es ist an der Zeit, ein Dashboard zu erstellen. Konfigurieren Sie nunjucks vor dem ersten Endpunkt:
nunjucks.configure('views', { express: app })Damit wird nunjucks so eingerichtet, dass es jede Datei im Verzeichnis views und verlinkt auf die Express-Anwendung, die in der Variablen app Variable gespeichert ist. Erstellen Sie ein views Verzeichnis und eine index.html Datei innerhalb dieses Verzeichnisses:
<h1>Recordings</h1>
{% for recording in recordings %}
<p>
<a href="/details/{{recording.conversation_uuid}}">{{recording.start_time}}</a>
</p>
{% endfor %}Erstellen Sie auch eine details.html Datei im Verzeichnis views Verzeichnis:
<ul>
<li>{{caller}}</li>
<li>{{recording.timestamp}}</li>
<li><a href="/details/{{recording.conversation_uuid}}/download">Download</a></li>
</ul>Drei Endpunkte sind erforderlich in index.js um diese Ansichten zum Laufen zu bringen. Der erste lädt alle Aufzeichnungen aus der Datenbank und rendert die Indexseite:
app.get('/', async (req, res) => {
const recordings = await recordingsDb.find().sort({ timestamp: -1 })
res.render('index.html', { recordings })
})
Die Seite sieht nun wie folgt aus, wobei die neuesten Aufnahmen zuerst angezeigt werden:
Web page showing one recording timestamp with a blue underline
Der nächste Endpunkt lädt die Detailseite, nachdem er Details von der Conversations API erhalten hat, einschließlich der Telefonnummer des Anrufers:
app.get('/details/:conversation', (req, res) => {
nexmo.conversations.get(req.params.conversation, async (error, result) => {
const caller = result.members.find(member => member.channel.from != process.env.NEXMO_NUMBER)
const number = caller.channel.from.number
const recording = await recordingsDb.findOne({ conversation_uuid: req.params.conversation })
res.render('detail.html', { caller: number, recording })
})
})
Schließlich ein Endpunkt, der die rohe Audiodatei von der API abruft und sie als herunterladbare MP3-Datei sendet:
app.get('/details/:conversation/download', async (req, res) => {
const recording = await recordingsDb.findOne({ conversation_uuid: req.params.conversation })
nexmo.files.get(recording.recording_url, (error, result) => {
res.writeHead(200, {
'Content-Disposition': 'attachment; filename="recording.mp3"',
'Content-Type': 'audio/mpeg',
})
res.end(Buffer.from(result, 'base64'))
})
})
A page showing a phone number, timestamp, and download link
Kontrollpunkt: Starten Sie Ihren Server neu und rufen Sie Ihre Nexmo-Nummer an. Sobald der Anruf abgeschlossen ist, sollten Sie den neuen Eintrag auf dem Dashboard sehen. Gehen Sie auf die Detailseite und laden Sie ihn herunter.
SMS annehmen und speichern
Da es sich um eine Telefonnummer handelt, können einige Nutzer dieses Dienstes auch eine SMS-Nachricht an diese Nummer senden. Nach einem ähnlichen Muster werden diese Nachrichten gespeichert und auf dem Dashboard angezeigt. Fügen Sie unter der bestehenden Datenbank eine neue für Nachrichten hinzu:
const messagesDb = nedb.create({ filename: 'data/messages.db', autoload: true })Speichern Sie neue Nachrichten, sobald sie eingehen, indem Sie einen Endpunkt erstellen, auf den wir zuvor bei der Einrichtung unserer virtuellen Nummer hingewiesen haben:
app.post('/sms', async (req, res) => {
await messagesDb.insert(req.body)
res.status(200).end()
})
Aktualisieren Sie den Dashboard-Endpunkt, um auch Nachrichten abzurufen und anzuzeigen:
app.get('/', async (req, res) => {
const recordings = await recordingsDb.find().sort({ timestamp: -1 })
const messages = await messagesDb.find().sort({ 'message-timestamp': -1 })
res.render('index.html', { recordings, messages })
})
Fügen Sie diesen Abschnitt am Ende von index.html:
{% for message in messages %}
<p>{{message.msisdn}} ({{message['message-timestamp']}}): {{message.text}}</p>
{% endfor %}
Web page showing both recordings and two example messages
Kontrollpunkt: Starten Sie Ihren Server neu und senden Sie eine SMS an Ihre Nexmo-Nummer. Sie sollten sehen, dass es auf Ihrem Dashboard erscheint, sobald Sie es aktualisieren.
SMS weiterleiten und eine Antwort senden
Aktualisieren Sie schließlich den SMS-Endpunkt, um die Nachricht sowohl an die Organisatoren weiterzuleiten als auch dem Absender zu antworten:
app.post('/sms', async (req, res) => {
await messagesDb.insert(req.body)
for(let organizerNumber of ['NUMBER ONE', 'NUMBER TWO']) {
nexmo.channel.send(
{ type: 'sms', number: organizerNumber },
{ type: 'sms', number: 'NEXMO NUMBER' },
{ content: { type: 'text', text: `From ${req.body.msisdn}\n\n${req.body.text}` } }
)
}
nexmo.channel.send(
{ type: 'sms', number: req.body.msisdn },
{ type: 'sms', number: 'NEXMO NUMBER' },
{ content: { type: 'text', text: 'Thank you for sending us a message. Organizers have been made aware and may be in touch for more information.' } }
)
res.status(200).end()
})
Kontrollpunkt: Starten Sie Ihren Server neu und senden Sie eine SMS an Ihre Nexmo-Nummer. Sie sollten eine Antwort erhalten, und alle aufgeführten Organisatoren sollten die Nachricht ebenfalls erhalten.
Nächste Schritte
Herzlichen Glückwunsch! Sie haben jetzt eine funktionierende Hotline für Vorfälle im Zusammenhang mit dem Verhaltenskodex eingerichtet, die sowohl für Telefonanrufe als auch für SMS-Nachrichten funktioniert. Wenn Sie mehr Zeit haben, sollten Sie sich das ansehen:
Implementierung der Fehlerbehandlung
Mit unserer neuen Spracherkennungsprogramm zur Transkription von Anrufen
Den endgültigen Projektcode finden Sie unter https://github.com/nexmo-community/node-code-of-conduct-conference-call
Wie immer, wenn Sie Unterstützung benötigen, können Sie sich gerne an die Vonage Entwickler-Community Slack. Wir hoffen, Sie dort zu sehen.
Teilen Sie:
Ehemaliger Developer Advocate bei Vonage, wo seine Aufgabe darin bestand, die lokale Tech-Community in London zu unterstützen. Er ist ein erfahrener Veranstaltungsorganisator, Brettspieler und Vater eines süßen kleinen Hundes namens Moo. Er ist auch der Hauptorganisator von You Got This - einem Netzwerk von Veranstaltungen zu den Kernkompetenzen, die für ein glückliches, gesundes Arbeitsleben erforderlich sind.
