Automatische call forwarding met Twilio

Automatische call forwarding met Twilio

October 16, 2019 - Dave Simons

Veel bedrijven bieden een wachtdienst aan waarmee ze klanten van dienst kunnen zijn buiten de kantooruren. Aangezien we -voorlopig- met mensen te maken hebben, kan het schema af en toe wijzigen door omstandigheden. Denk maar aan verlof, ziekte, uit dienst treden, etc. Al deze zaken zorgen ervoor dat het beheren van het wachtschema een taak op regelmatig basis wordt. Als bijkomend probleem horen de veranderingen duidelijk gecommuniceerd te worden naar de klant, zodat zij weten wie er op welke momenten opgebeld moet worden.

Zelfs in het geval dat alles correct verloopt, is er geen garantie dat de klant bij problemen de juiste acties onderneemt. Dit is te verklaren door een groot aantal oproepen tijdens de nachtdienst, waardoor mensen op dat moment niet scherp genoeg zijn en minder presteren.

Oplossing?

De oplossing voor dit probleem is klaar en duidelijk; te ondernemen acties volledig automatiseren. In dit geval werken we een oplossing uit waarbij we bepalen wie er wanneer van wacht is, zodat dit voor de klant transparant verloopt. Bij FlowFactor gebruiken we hiervoor de externe dienst Twilio.

Wat is Twilio?

Twilio is een externe dienst die telefoonnummers aanlevert en deze koppelt aan zelf te definiëren acties. Verschillende mogelijkheden worden hierbij voorzien, al maken wij gebruik van de methode waarbij we een HTTP URL aanroepen. Deze URL levert een script, waarna Twilio dit interpreteert en op basis daarvan verdere acties uitvoert. In ons geval vertelt een mechanische stem dat de klant correct verbonden is met de firma FlowFactor. Hierna verbindt diezelfde stem de klant door met een engineer van wacht.

Hoe doe je dat dan?

We nemen aan dat je een (virtuele) machine ter beschikking hebt om de webserver te installeren. In dit voorbeeld maken we gebruik van een CentOS 7 machine.

Bij Flowfactor proberen we zoveel mogelijk repetitieve acties te automatiseren; de installatie van deze stack is daar één van. We rollen daarom deze hele set-up uit met ansible, al slaan we deze stap in de blogpost even over. We gaan wel dieper in op alles wat er wordt geïnstalleerd en waarvoor het precies gebruikt wordt.

Dependencies

Allereerst installeren we alle nodige componenten:

yum install davmail python34 ruby rubygems rubygem-tzinfo rubygem-sinatra
gem install icalendar
pip install vdirsyncer

 

Onze contacten en kalenders bevinden zich natuurlijk allemaal in de cloud. Aangezien we bij FlowFactor een grote fan zijn van open source software, willen we deze ook in een open source formaat lokaal opslaan. Daarom kiezen we voor vCard en iCal.

Helaas gebruiken we Microsoft 365 suite, wat enkel de mogelijkheid biedt om te exporteren naar onze gekozen open source formaten. Dit is het geval wanneer je gebruik maakt van hun closed source applicaties, maar zelfs dan is het enkel mogelijk op een Windows operating system. Dat wil zeggen dat we de kalender/contactpersonen telkens opnieuw manueel moeten updaten, wat uiteraard niet de bedoeling is.

De oplossing: Davmail gateway.

Deze java applicatie spreekt tegen de Microsoft 365 suite API en vertaalt de opgehaalde data voor ons naar vCard en iCal formaten. De configuratie daarvan gebeurt in het /etc/davmail/davmail.properties bestand; relevante opties:

davmail.url=https\://outlook.office365.com/owa

davmail.enableEws=true

davmail.defaultDomain=example

Na de configuratie starten we de bijgeleverde system service:

systemctl start davmail

Nu onze davmail gateway functioneel is, hebben we een client nodig die de vCard en iCal protocollen spreekt om onze contacten en kalenders op te halen. Hiervoor gebruiken we de tool vdirsyncer, geschreven in de python programmeertaal. Omdat er voor vdirsyncer geen RPM package beschikbaar is, hebben we deze geinstalleerd via pip: een package manager voor python modules (“python eggs” zoals men ze noemt).

Een simpele vdirsyncer configuratie:

[general]

status_path = “/var/www/twilio/vdirsyncer-status”

[pair calendar]

a = “local_calendar”

b = “remote_calendar”

collections = [“calendar”]

conflict_resolution = “b wins”

[storage local_calendar]

type = “singlefile”

path = “/var/www/twilio/%s.ics”

[storage remote_calendar]

type = “caldav”

url = “http://localhost:1080/users/twilio@flowfactor.be/calendar”

username = “twilio@flowfactor.be”

password = “FlowFactorFTW!”

[pair contacts]

a = “local_contacts”

b = “remote_contacts”

collections = [“contacts”]

conflict_resolution = “b wins”

[storage local_contacts]

type = “singlefile”

path = “/var/www/twilio/%s.vcf”

[storage remote_contacts]

type = “carddav”

url = “http://localhost:1080/”

username = “twilio@flowfactor.be”

password = “FlowFactorFTW!”

Contactpersonen en kalenders durven wel eens te veranderen, waardoor we regelmatig de laatste nieuwe versie willen ophalen. Hiervoor maken we een script en stellen we een cronjob in die elk uur wordt uitgevoerd:

crontab -e

0 * * * * /var/www/twilio/bin/contact-calendar-sync.sh

Inhoud van het /var/www/twilio/bin/contact-calendar-sync.sh script:

#!/bin/bash

# Synchronize contacts and calendars

vdirsyncer -c /var/www/twilio/vdirsync.conf discover

vdirsyncer -c /var/www/twilio/vdirsync.conf sync

Nu we onze contacten en kalenders aan boord hebben, kunnen we beginnen met het gebruiken van deze data.

Hiervoor gebruiken we opssupport.rb, een in-house geschreven ruby applicatie gebaseerd op het sinatra framework, waarmee we de kalender uitlezen om te bepalen wie er van wacht is. Vervolgens halen we uit de lijst met contactpersonen het telefoonnummer op van de persoon in kwestie.

Om dit voorbeeld simpel te houden, bieden we deze code rechtstreeks aan met de in ruby ingebouwde WEBrick webserver. In een productieomgeving doe je dit natuurlijk best met een applicatie server zoals “rack”.

Om makkelijk de webserver te kunnen starten en stoppen maken we de file /etc/systemd/system/opssupport.service aan met volgende inhoud:

[Unit]

Description=OpsSupport scheduler

After=network.target

[Service]

Type=exec

User=twilio

ExecStart=/bin/ruby /var/www/twilio/opssupport.rb

[Install]

WantedBy=multi-user.target

De nieuwe service inladen en starten:

systemctl daemon-reload

systemctl start opssupport.service

Als alles goed is gegaan, hebben we nu een sinatra app draaiende op poort 8080.

Even verifiëren:

  • logfile nakijken: journalctl -afn50 -u opssupport.service
  • poort nakijken: ss -ltnp|grep 8080

Nu zijn we klaar om via een HTTP client de applicatie aan te spreken:

[flowfactor@twilio ~]# curl -v http://localhost:8080

* About to connect() to localhost port 8080 (#0)

* Trying ::1…

* Connected to localhost (::1) port 8080 (#0)

> GET / HTTP/1.1

> User-Agent: curl/7.29.0

> Host: localhost

> Accept: */*

>

< HTTP/1.1 200 OK

< Server: WEBrick/1.3.1 (Ruby/2.0.0/2015–12–16)

< Date: Wed, 09 Oct 2019 00:05:58 GMT

< Content-Length: 187

< Content-Type: text/html; charset=UTF-8

<

<Response>

<Say voice=’woman’>Thank you for calling FlowFactor</Say>

<Say voice=’woman’>Please hold on while we transfer you</Say>

<Dial timeout=’30′>+32123456789</Dial>

* Connection #0 to host localhost left intact

</Response>

De output die gegenereerd is door onze opssupport app kan nu worden geïnterpreteerd door Twilio. De output spreekt voor zich: bedank de beller op een vriendelijke manier, vraag hem/haar om te wachten terwijl er wordt doorgeschakeld en schakel vervolgens door naar de gelukkige die van wacht is </sarcasm>.

Twilio is een externe provider waarbij je telefoonnummers kan aankopen en hieraan acties kan koppelen. De actie die we hierbij gebruiken, is het opvragen van een HTTP url. We gaan er even van uit dat je reeds een telefoonnummer hebt aangekocht via Twilio.

Het koppelen van je telefoon nummer gaat als volgt:

– login op www.twilio.com

– selecteer links in het menu “All products and services”

– selecteer “Programmable voice”

– selecteer “Numbers”

– selecteer “Manage numbers”

– selecteer de gewenste telefoon nummer

– selecteer bij “A call comes in” de optie “Webhook”, specifieer je opssupport url “http://my.opssupport.server:8080″, kies de “HTTP GET” methode

– sla je wijzigingen op

Je kan de setup testen door het telefoonnummer van je wachtdienst op te bellen. Als alles goed is verlopen, hoor je nu de robot-achtige stem van Twilio die de geprogrammeerde output uitspreekt, waarna je uiteraard wordt doorgeschakeld naar de persoon van wacht!

Gelukt? Mocht je vragen hebben in verband met onze blogpost, laat het ons zeker weten! En neem zeker een kijkje naar onze andere posts en cases!

Proud of our technology partners

No Comments

Sorry, the comment form is closed at this time.

Won over by the DevOps approach?

Or is FlowFactor the DevOps service provider that you’re looking for?
Invite us for an informal and non-committal introductory consultation to discover for yourself.

Find your next job

Become a part of the future of DevOps

Cloud technology services we use