2015-12-08 17 views
8

Ich würde gerne ein paar Tipps auf meinem Twilio-Setup für ein Problem, das ich versuche zu lösen.Umleiten von Twilio Anruf an Voicemail, wenn unbeantwortet

Übersicht:

Jeder Benutzer in unserem System eine Twilio Telefonnummer bereitgestellt ist, dass sie jedem die Hand aus kann sie zu kontaktieren.

Wenn personA einen Benutzer in unserem System (userB) über die bereitgestellte Twilio-Telefonnummer kontaktiert, möchten wir sie mit userB verbinden, wenn sie verfügbar sind. Wenn BenutzerB nicht verfügbar ist, möchten wir PersonA auf Voicemail verweisen. Mit anderen Worten, wir möchten sicherstellen, dass wir die Voicemail-Funktion und die Voicemail selbst steuern können, damit wir sie in unserem System speichern können, anstatt die Voicemail auf dem Gerät von UserB zu lassen.

Aktuelle Lösung:

  • Persona eingehender Anruf wird an eine Warteschlange hinzugefügt. Zur gleichen Zeit wählt das System BenutzerB aus.
  • UserB wird aufgefordert, 1 zu drücken, um den Anruf anzunehmen. Der Grund für die explizite Eingabe von UserB besteht darin, zu erkennen, ob UserB verfügbar ist, um den Anruf zu beantworten. (Wenn zum Beispiel der Anruf an UserB zu ihrer persönlichen Voicemail geht, wird die explizite Zifferneingabe nicht stattfinden und sie können nicht antworten.)
  • Wenn UserB in einer bestimmten Zeit nicht 1 eingibt, ist PersonA auf Voicemail gerichtet.
  • Wenn BenutzerB 1 drückt, wird der Aufruf von BenutzerB geändert (über Twilio Rest API), um die Warteschlange zu wählen, in der sich PersonA befindet, um BenutzerB und PersonA zu verbinden.

Problem mit aktueller Lösung:

Bei dieser Lösung wird die Kontrolle über, wenn personA Ruf an der Voicemail wird gesteuert durch das Ergebnis des Aufrufs zu UserB, die suboptimal scheinen abzulenken. Zum Beispiel können wir möglicherweise BenutzerB überhaupt nicht aufrufen. In diesem Fall würde personA unbegrenzt in der Warteschlange bleiben. In diesem Fall möchte ich die Warteschlange personAA abfragen, um die Zeit in der Warteschlange zu überprüfen und den Anruf an Voicemail umzuleiten, wenn die Zeit in der Warteschlange einen Schwellenwert überschreitet. Allerdings scheint es nicht, wie es möglich ist, genau zu wissen, wie lange ein Anruf in einer Warteschlange unbeaufsichtigt ist, weil:

  • Der Status eines Anrufs in einer Warteschlange ist in-progress auch wenn der Anrufer Musik zu warten, hört . Dies ist derselbe Status, als ob der Anruf von PersonA beantwortet wurde.

  • Wenn sich BenutzerB in die Warteschlange einwählt, wird der Anruf nur dann getrennt, wenn die überbrückten Teilnehmer getrennt werden. Der Anrufstatus von PersonA wird nicht geändert, um anzuzeigen, dass sie mit BenutzerB verbunden sind.

Fragen

  • Ist mein Verständnis, warum ich den Anruf Warteschlange nicht abfragen können Anrufe umleiten korrekt an die Voicemail?
  • Soll ich stattdessen PersonA zu einer Konferenz aufrufen und, wenn BenutzerB verfügbar ist, ihn mit der Konferenz verbinden, in der sich PersonA befindet?
  • Wenn ich eine Konferenzkonfiguration verwende, was wäre der einfachste Weg zu erkennen, wie lange PersonA in der Konferenz gewartet hat, um den Anruf von PersonA an Voicemail umzuleiten, wenn UserB der Konferenz nicht beitritt?

Antwort

11

Twilio Entwickler Evangelist hier.

Ich denke, Sie haben die Dinge ein wenig hier mit der Warteschlange zu kompliziert. Sie können die Nachricht tatsächlich bereitstellen und innerhalb des ursprünglichen Anrufs sammeln, ohne sich selbst anrufen zu müssen und eventuell die beiden Anrufe zu verbinden.

Hier ist, wie:

<Response> 
    <Dial action="/call_complete" timeout="30"> 
    <Number url="/whisper"> 
     ONWARD DIAL NUMBER 
    </Number> 
    </Dial> 
</Response> 

Erteilen des <Number> Substantiv eine URL, bevor die beiden Anrufe spielen sind, um die TwiML Inhalt dieser URL:

Ihre eingehenden Anruf TwiML sollte wie folgt aussehen. Sie können <Gather> hier machen verwenden, dass der Benutzer den Anruf beantwortet hat und nicht ihr eigenes Voicemail-System:

/whisper 

<Response> 
    <Gather numDigits="1" timeout="10" action="/gather_result"> 
    <Say voice="alice">You are receiving a call, press any key to accept</Say> 
    </Gather> 
    <Hangup/> 
</Response> 

Die /gather_result Bedürfnisse herauszufinden, ob eine Taste gedrückt wurde oder nicht. Wenn es gedrückt wurde, gehen wir zum Anruf über, was wir mit einer leeren Antwort tun können, da dies die Kontrolle zurück zum ursprünglichen <Dial> gibt. Wenn keine Nummer gedrückt wurde, legen wir dieses Ende auf, was bewirkt, dass das ursprüngliche <Dial> vervollständigt wird und auf sein action Attribut verweist. (Ich bin nicht sicher, welche Sprache Sie arbeiten mit, aber hier einige Rubyish Pseudo-Code)

/gather_result 

<Response> 
    if params["Digits"] and params["Digits"].empty? 
    <Hangup/> 
    end 
</Response> 

/call_complete wird dann aufgerufen, wenn die <Dial> Aktion vorbei ist. Wenn der Status des Anrufs an diesem Punkt "abgeschlossen" oder "beantwortet" ist, hat der Benutzer den Anruf angenommen und richtig auf das Flüstern reagiert und wir können auflegen. Wenn es etwas anderes ist, leiten wir unseren Anruf auf unseren Voicemail-Recorder um.

/call_complete 

<Response> 
    if params["DialCallStatus"] == "completed" or params["DialCallStatus"] == "answered" 
    <Hangup/> 
    else 
    <Say voice="alice">The call could not be answered this time, please leave a message</Say> 
    <Record action="/record_complete" /> 
    end 
</Response> 

Dann endlich Ihre /record_complete Aktion kann mit der Aufnahme URL, was Sie tun wollen, und den Anruf auflegen.

/record_complete 

<Response> 
    <Hangup/> 
</Response> 

Dies alles kann mit Twimlets erreicht werden, wie in this blog post beschrieben. Lassen Sie mich wissen, ob das überhaupt hilft.

+1

Vielen Dank für die detaillierte Antwort hier. Das macht sehr viel Sinn. Jetzt mein Setup verbessern! – kajham

+0

Kein Problem, geben Sie mir einen Anruf auf [email protected], wenn Sie irgendwelche Probleme haben. – philnash

+0

Ich könnte etwas falsch machen, aber ich musste eine Hangup-Direktive nach dem Gather-Verb setzen, um die Situation zu erfassen, in der die Gather-Zeit ohne Eingabe abgelaufen ist. Twilio hat die Aktions-URL nicht aufgerufen, wenn vor dem Timeout keine Benutzereingabe eingegeben wurde, also war mein '/ flüstern': ' Sie haben einen eingehenden Anruf. Drücken Sie 1, um zu antworten. ' – kajham

Verwandte Themen