Porozmawiaj ze swoją aplikacją, PyCon PL 2015
-
Upload
marcin-najtkowski -
Category
Software
-
view
272 -
download
0
Transcript of Porozmawiaj ze swoją aplikacją, PyCon PL 2015
POROZMAWIAJZE SWOJĄ APLIKACJĄ
Kamil Kujawiński, Marcin Najtkowski
PyCo
n PL
201
5, 1
6-18
.10.
2015
WPROWADZENIECo to jest twilio?O konkurencyjnych rozwiązaniach, przeciętnym Kowalskim,klientach i dlaczego twilio jest fajne.
CO TO JEST TWILIO?
“Enabling phones, VoIP, and messaging to be embedded into web, desktop, and mobile software.”
ALTERNATYWY 4ALBO 2
Plivo Tropo Twilio
Serwery dedykowane Voxeo AWS
On premises tak tak nie
Zasięg 55 krajów 28 krajów 44 kraje
Obsługiwane języki 16 25 26
przeciętny KOWALSKI
numer telefonu 1 $minuta połączenia 0,065 $
sms 0,034 $
Czy
może?
przeciętny KOWALSKI
Z obliczeń wynika,że owszem.
Czy
może?
NAJWIĘKSI KLIENCI
Coca-Cola
UBER
i inni
DLACZEGO twiliojest FAJNE
dostępne
przystępne
przyjazne
numerekczyli nowy numer telefonu w kilku krokach
APLIKACJA W
MINUT (+30 na drobiazgi)
CO BĘDZIEMY ROBIĆ?
zarejestrujeuczestników
zada mnóstwogłupich pytań
wyłonizwycięzców
aplikacja do przeprowadzenia prostego konkursu, która
słowo
kluc
z ;)
implementacjaw pięciu krokach
REJESTRACJAUCZESTNIKAodbieranie wiadomości sms
<?xml version="1.0" encoding="UTF-8"?><Response> <Message> <Body> Zarejestrowano Twój numer telefonu w konkursie pod nazwą JANUSZ. </Body> </Message></Response>
def register(request): data = request.POST try: phone_number = data['From'] name = data['Body'] except KeyError: return HttpResponseBadRequest()
Participant(phone_number, name).save()
msg = "Zarejestrowano Twój numer telefonu " +\ "w konkursie pod nazwą %s." % name resp = twilio.twiml.Response() resp.message(msg) return HttpResponse(resp)
<?xml version="1.0" encoding="UTF-8"?><Response> <Message> <Body> Zarejestrowano Twój numer telefonu w konkursie pod nazwą JANUSZ. </Body> </Message></Response>
+48 123 456 789
wyślij
na numer
w treści podaj swoje imię
INICJOWANIEPOŁĄCZENIAtelefon do uczestnika
client = TwilioRestClient( settings.TWILIO_ACCOUNT_SID, settings.TWILIO_AUTH_TOKEN)
url = 'https://xyz.ngrok.io/welcome/%s' \ % participant.idstatus_url = 'https://xyz.ngrok.io/call_ended'
client.calls.create( url=url, status_callback=status_url, to=participant.phone_number, from_=settings.TWILIO_CALLING_NUMBER)
PROWADZENIEROZMOWYobsługa dzwoniącego
<?xml version="1.0" encoding="UTF-8"?><Response> <Pause length="2"/> <Say language="pl-PL" voice="alice"> Witaj JANUSZ. Czas na pytania! </Say> <Redirect>/question/42/</Redirect></Response>
def welcome(request, participant_id): participant = Participant.objects.get( id=participant_id)
resp = twiml.Response() resp.pause(length=2) resp.say( 'Witaj %s. Czas na pytania!' % participant.name, voice='alice', language='pl-PL') resp.redirect( '/question/%s/' % participant.id)
return HttpResponse(resp)
<?xml version="1.0" encoding="UTF-8"?><Response> <Pause length="2"/> <Say language="pl-PL" voice="alice"> Witaj JANUSZ. Czas na pytania! </Say> <Redirect>/question/42/</Redirect></Response>
ZADAWANIEPYTAŃ
<?xml version="1.0" encoding="UTF-8"?><Response> <Gather action="/answer/42/" method="POST" numDigits="2" timeout="30"> <Say language="pl-PL" loop="5" voice="alice"> Ile bramek strzelił Robert w 9 minut? 1) 5. 2) 7. 3) 13. </Say> </Gather> <Say language="pl-PL" voice="alice"> Za wolno... </Say> <Redirect>/fail/42/</Redirect></Response>
VOICE = {'voice': 'alice', 'language': 'pl-PL'}
def question(request, participant_id): participant = Participant.objects.get(id=participant_id) resp = twiml.Response() q = participant.next_question() txt = q.prepare_question_and_answers()
answer_url = '/answer/%s/%s/' % ( participant.id, q.id) ask = resp.gather( numDigits=1, action=answer_url, method='POST', timeout=30, ) ask.say(txt, loop=5, **VOICE )
resp.say('Za wolno...', **VOICE ) resp.redirect('/fail/%s/' % participant.id ) return HttpResponse(resp)
<?xml version="1.0" encoding="UTF-8"?><Response> <Gather action="/answer/42/" method="POST" numDigits="2" timeout="30"> <Say language="pl-PL" loop="5" voice="alice"> Ile bramek strzelił Robert w 9 minut? 1) 5. 2) 7. 3) 13. </Say> </Gather> <Say language="pl-PL" voice="alice"> Za wolno... </Say> <Redirect>/fail/42/</Redirect></Response>
jeszcze trochę cierpliwości...
ZBIERANIEODPOWIEDZI
def answer(request, participant_id, question_id): participant = Participant.objects.get( id=participant_id) question = Question.objects.get( id=question_id)
choice = request.POST.get('Digits') if choice: choice = int(choice) answer = question.answers()[choice - 1] participant.save_answer(answer)
resp = twiml.Response() resp.redirect( '/question/%s/' % participant.id) return HttpResponse(resp)
Czego nie pokazaliśmy, a na co jeszcze
WARTO ZWRÓCIĆ UWAGĘ
Dane o rozmowachMożliwy wgląd w informacje o połączeniu (trwającym lub zakończonym).
Zestawianie połączeńOpcja przekierowania połączenia na inny numer.
NagrywanieArchiwizowanie przeprowadzonych rozmów.
Własne komunikatyMożliwość nagrania własnego głosu i odtworzenia go podczas połączeń - alternatywa dla syntezatora.
KolejkiOpcja kolejkowania dzwoniących.
Twilio ClientTelefon w przeglądarce.
BEZPIECZEŃSTWO
BEZPIECZEŃSTWO
HTTPS
weryfikacja requestów z Twilio
przechowywanie auth token
weryfikacja użytkownika po numerze telefonu
copyrightsW prezentacji wykorzystano:
API docs - http://twilio.comZdjęcia:
dziecko https://www.flickr.com/photos/makelessnoise/195088755/CocaCola https://www.flickr.com/photos/28481088@N00/2889066721/Uber https://www.flickr.com/photos/aaronpk/15655460313/kawa https://www.flickr.com/photos/kplanz/6855919503/ droga https://www.flickr.com/photos/chartno3/8164881237/Kowalski, Pingwiny z Madagaskaru - bez wiedzy i zgody DreamWorks Pictures
Szablon prezentacji: http://www.slidescarnival.com
KONTAKTSkargi, zażalenia, wnioskiFeedback dotyczący prezentacji i omawianych zagadnień mile widziany. :)
Kamil KUJAWIŃ[email protected]
Marcin [email protected]
http://talktoyourapp.herokuapp.com
https://github.com/kkujawinski/talktoyourapp
Dziękujemy za uwagę.Szerokiej drogi!