Porozmawiaj ze swoją aplikacją, PyCon PL 2015

38
POROZMAWIAJ ZE SWOJĄ APLIKACJĄ Kamil Kujawiński, Marcin Najtkowski PyCon PL 2015, 16-18.10.2015

Transcript of Porozmawiaj ze swoją aplikacją, PyCon PL 2015

Page 1: 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

Page 2: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

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

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

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

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

przeciętny KOWALSKI

Z obliczeń wynika,że owszem.

Czy

może?

Page 7: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

NAJWIĘKSI KLIENCI

Page 8: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

Coca-Cola

Page 9: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

UBER

Page 10: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

i inni

Page 11: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

DLACZEGO twiliojest FAJNE

dostępne

przystępne

przyjazne

Page 12: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

numerekczyli nowy numer telefonu w kilku krokach

Page 13: Porozmawiaj ze swoją aplikacją, PyCon PL 2015
Page 14: Porozmawiaj ze swoją aplikacją, PyCon PL 2015
Page 15: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

APLIKACJA W

MINUT (+30 na drobiazgi)

Page 16: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

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

implementacjaw pięciu krokach

Page 18: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

REJESTRACJAUCZESTNIKAodbieranie wiadomości sms

Page 19: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

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

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

+48 123 456 789

wyślij

na numer

w treści podaj swoje imię

Page 22: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

INICJOWANIEPOŁĄCZENIAtelefon do uczestnika

Page 23: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

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

PROWADZENIEROZMOWYobsługa dzwoniącego

Page 25: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

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

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

ZADAWANIEPYTAŃ

Page 28: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

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

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

jeszcze trochę cierpliwości...

Page 31: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

ZBIERANIEODPOWIEDZI

Page 32: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

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

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

BEZPIECZEŃSTWO

Page 35: Porozmawiaj ze swoją aplikacją, PyCon PL 2015

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

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

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

Dziękujemy za uwagę.Szerokiej drogi!