![Page 1: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/1.jpg)
POROZMAWIAJZE SWOJĄ APLIKACJĄ
Kamil Kujawiński, Marcin Najtkowski
PyCo
n PL
201
5, 1
6-18
.10.
2015
![Page 2: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/2.jpg)
WPROWADZENIECo to jest twilio?O konkurencyjnych rozwiązaniach, przeciętnym Kowalskim,klientach i dlaczego twilio jest fajne.
![Page 3: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/3.jpg)
CO TO JEST TWILIO?
“Enabling phones, VoIP, and messaging to be embedded into web, desktop, and mobile software.”
![Page 4: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/4.jpg)
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
![Page 5: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/5.jpg)
przeciętny KOWALSKI
numer telefonu 1 $minuta połączenia 0,065 $
sms 0,034 $
Czy
może?
![Page 6: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/6.jpg)
przeciętny KOWALSKI
Z obliczeń wynika,że owszem.
Czy
może?
![Page 7: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/7.jpg)
NAJWIĘKSI KLIENCI
![Page 8: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/8.jpg)
Coca-Cola
![Page 9: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/9.jpg)
UBER
![Page 10: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/10.jpg)
i inni
![Page 11: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/11.jpg)
DLACZEGO twiliojest FAJNE
dostępne
przystępne
przyjazne
![Page 12: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/12.jpg)
numerekczyli nowy numer telefonu w kilku krokach
![Page 13: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/13.jpg)
![Page 14: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/14.jpg)
![Page 15: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/15.jpg)
APLIKACJA W
MINUT (+30 na drobiazgi)
![Page 16: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/16.jpg)
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 ;)
![Page 17: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/17.jpg)
implementacjaw pięciu krokach
![Page 18: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/18.jpg)
REJESTRACJAUCZESTNIKAodbieranie wiadomości sms
![Page 19: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/19.jpg)
<?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)
![Page 20: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/20.jpg)
<?xml version="1.0" encoding="UTF-8"?><Response> <Message> <Body> Zarejestrowano Twój numer telefonu w konkursie pod nazwą JANUSZ. </Body> </Message></Response>
![Page 21: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/21.jpg)
+48 123 456 789
wyślij
na numer
w treści podaj swoje imię
![Page 22: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/22.jpg)
INICJOWANIEPOŁĄCZENIAtelefon do uczestnika
![Page 23: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/23.jpg)
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)
![Page 24: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/24.jpg)
PROWADZENIEROZMOWYobsługa dzwoniącego
![Page 25: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/25.jpg)
<?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)
![Page 26: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/26.jpg)
<?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>
![Page 27: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/27.jpg)
ZADAWANIEPYTAŃ
![Page 28: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/28.jpg)
<?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)
![Page 29: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/29.jpg)
<?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>
![Page 30: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/30.jpg)
jeszcze trochę cierpliwości...
![Page 31: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/31.jpg)
ZBIERANIEODPOWIEDZI
![Page 32: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/32.jpg)
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)
![Page 33: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/33.jpg)
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.
![Page 34: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/34.jpg)
BEZPIECZEŃSTWO
![Page 35: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/35.jpg)
BEZPIECZEŃSTWO
HTTPS
weryfikacja requestów z Twilio
przechowywanie auth token
weryfikacja użytkownika po numerze telefonu
![Page 36: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/36.jpg)
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
![Page 37: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/37.jpg)
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
![Page 38: Porozmawiaj ze swoją aplikacją, PyCon PL 2015](https://reader031.vdocuments.mx/reader031/viewer/2022022414/588512f51a28abd05e8b5dc3/html5/thumbnails/38.jpg)
Dziękujemy za uwagę.Szerokiej drogi!