2015-12-08 31 views
8

Chciałbym uzyskać poradę dotyczącą konfiguracji Twilio w przypadku problemu, który próbuję rozwiązać.Przekierowywanie połączenia twilio na pocztę głosową, jeśli nie ma odpowiedzi

Przegląd:

Każdy użytkownik w naszym systemie jest zabezpieczony numer telefonu Twilio że mogą rozdać każdemu z nimi skontaktować.

Jeśli personA skontaktuje się z użytkownikiem w naszym systemie (userB) za pośrednictwem udostępnionego twilio numer telefonu, chcielibyśmy połączyć je z użytkownikiem B, jeśli są one dostępne. Jeśli userB nie jest dostępny, chcielibyśmy skierować personA na pocztę głosową. Innymi słowy, chcemy mieć pewność, że mamy kontrolę nad pocztą głosową i samą pocztą głosową, abyśmy mogli przechowywać je w naszym systemie, zamiast pozostawić pocztę głosową na urządzeniu użytkownikaB.

Aktualny rozwiązanie: połączenie przychodzące

  • Persona dostaje dodany do kolejki. W tym samym czasie system wybiera numer użytkownika.
  • Użytkownik UserB zostanie poproszony o naciśnięcie 1, aby odebrać połączenie. Powodem jawnego wpisu z UserB jest wykrycie, czy UserB jest dostępny do odebrania połączenia. (Na przykład, jeśli połączenie z UserB trafi na osobistą pocztę głosową, wpis w postaci jawnej cyfry nie nastąpi, informując nas, że nie jest dostępny do odpowiedzi.)
  • Jeśli UserB nie wprowadzi 1 w określonym czasie, PersonA jest skierowane na pocztę głosową.
  • Jeśli UserB naciśnie 1, wywołanie UserB zostanie zmodyfikowane (za pomocą twilio rest api), aby wybrać kolejkę, w której znajduje się PersonA, aby połączyć UserB i PersonA.

problem z bieżącym rozwiązanie:

W tym rozwiązaniu, sterowanie kiedy odwrócić rozmowę Persona do poczty głosowej jest kontrolowana przez wyniku wywołania UserB, co wydaje panującymi. Na przykład możemy nie być w stanie w ogóle wywołać UserB. W tym przypadku osoba A pozostanie w kolejce przez czas nieokreślony.

W tym przypadku chciałbym odpytać osobę z kolejkiA, aby sprawdzić czas w kolejce i przekierować połączenie na pocztę głosową, jeśli czas w kolejce jest większy niż próg. Jednak nie wydaje się, jak to jest możliwe, aby dokładnie wiedzieć, jak długo połączenie jest bez opieki w kolejce, ponieważ:

  • Status połączenia w kolejce jest in-progress nawet jeśli rozmówca jest słuchanie czekać muzyki . Jest to ten sam status, jak gdyby odpowiedź PersonA została odebrana.

  • Jeśli UserB wybierze się w kolejce, to połączenie zostanie wycofane dopiero, gdy strony zmostkowane rozłączą się, bez zmiany statusu połączenia w wywołaniu PersonA, aby wskazać, że są one podłączone do UserB.

Pytania

  • Czy mój zrozumienie, dlaczego nie mogę sondować kolejki połączeń przekierowywanie połączeń na pocztę głosową prawidłowe?
  • Czy zamiast tego powinienem wywołać PersonA w konferencji, a jeśli dostępny jest UserB, podłączyć go do konferencji, w której znajduje się PersonA?
  • Jeśli używam konfiguracji konferencji, jaki byłby najłatwiejszy sposób wykrycia, jak długo PersonA czekała na konferencji, aby przekierować połączenie PersonA na pocztę głosową w przypadku, gdy użytkownik UserB nigdy nie przystąpi do konferencji?

Odpowiedz

11

Twilio developer evangelist here.

Myślę, że możesz mieć zbyt skomplikowane rzeczy w tym miejscu z kolejką. Możesz rzeczywiście przekazać wiadomość i zebrać ją w ramach pierwotnego połączenia bez konieczności wybierania się i połączenia dwóch połączeń.

Oto jak:

przychodzące połączenia TwiML powinna wyglądać następująco:

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

Nadanie <Number> rzeczownik URL zagra zawartość TwiML tego adresu URL, zanim oba połączenia są podłączone. Można użyć <Gather> się, aby upewnić się, że użytkownik nie odpowiedział na wezwanie i nie własny system poczty głosowej:

/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> 

The /gather_result musi wypracować czy klawisz został naciśnięty, czy nie. Jeśli został naciśnięty, przechodzimy do połączenia, co możemy zrobić z pustą odpowiedzią, ponieważ daje to kontrolę nad oryginalnym <Dial>. Jeśli żaden numer nie został naciśnięty, zamykamy ten koniec, co powoduje, że oryginalny <Dial> wypełnia i kieruje na swój atrybut action. (Nie jestem pewien, co język pracujesz z, ale tutaj jest kilka Rubyish pseudokod)

/gather_result 

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

/call_complete następnie sprawdzony raz akcja <Dial> jest skończona. Jeśli status połączenia w tym miejscu jest "zakończony" lub "odebrany", wówczas użytkownik odebrał połączenie i odpowiedział poprawnie na szept i możemy się rozłączyć. Jeśli jest coś innego, przekierowujemy nasze połączenie do naszego rejestratora poczty głosowej.

/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> 

wreszcie swoją działanie /record_complete może robić, co chcesz z adresem URL nagrywania i rozłączyć połączenie.

/record_complete 

<Response> 
    <Hangup/> 
</Response> 

Wszystko to można osiągnąć za pomocą Twimlets, zgodnie z opisem in this blog post. Daj mi znać, jeśli to w ogóle pomoże.

+1

Dziękuję bardzo za szczegółową odpowiedź tutaj. To ma wiele sensu. Ulepszam teraz moją konfigurację! – kajham

+0

Nie ma problemu, daj mi znać na [email protected], jeśli masz jakiekolwiek problemy. – philnash

+0

Być może robię coś złego, ale musiałem wprowadzić dyrektywę "Zawieszenie" po czasopiśmie "Zbierz", aby uchwycić sytuację, w której Gromadzenie danych przekracza limit czasu. Twilio nie wywoływał adresu URL akcji, jeśli przed upływem limitu czasu nie wprowadzono żadnych danych wejściowych użytkownika, więc moje '/ szeptanie' było: ' Masz połączenie przychodzące. Naciśnij 1, aby odebrać. ' – kajham