tropo ecomm 2009 tutorial
DESCRIPTION
Slides from RJ Auburn's eComm tutorial session on Tropo - a new service from Voxeo that allows people to create phone applications using common web programing languages. Developers can create applications using ruby, javascript, groovy, php or python.TRANSCRIPT
![Page 1: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/1.jpg)
Introducing TropoPowered by Voxeo
RJ Auburn CTO
![Page 2: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/2.jpg)
Tropo
Once upon a time…
![Page 3: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/3.jpg)
Tropo
Now XML is in the enterprise…
![Page 4: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/4.jpg)
Tropo
Write apps directly in leading languages
Tropo.com
Ruby
![Page 5: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/5.jpg)
Tropo
Simple to Learn
• answer• redirect• reject
• call• transfer• hangup
• ask• say• record
• log• wait• default
![Page 6: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/6.jpg)
Tropo
Simple to Deploy
• Hosted offering • Accessible via
– PSTN numbers
– SIP URI
– Direct Skype
– iNum – Gizmo5, etc
• Inbound calling• Outbound calling• 70,000 port capacity
![Page 7: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/7.jpg)
Tropo
Simple Business Model
• No contracts• No setup costs• No commitment• Costs as low as 3 cents per minute• Credit card or PayPal charge in $50 blocks• Five minutes from sign-up to live deployment
+ = GO
![Page 8: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/8.jpg)
Tropo
Powerful Capabilities
• Robust call control• Play audio, record audio• Touch-tone entry• High quality speech recognition (ASR)• High quality speech synthesis (TTS)• Mashups with web services• Access to most language libraries• Soon: Conferencing, call recording,
web services, remote API
![Page 9: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/9.jpg)
Tropo
Developing with Voxeo
XML-based Telephony
Voxeo CallXMLThe easiest telephony markup ever devised
Tool-based Telephony
Voxeo DesignerEasy web-based, Visio- like rapid app dev tool
VoiceObjects
Sophisticated service creation environment, personalization, analytics
VoiceXMLThe only 100% compliant browser
CCXMLThe world’s most proven CCXML engine
A Voxeo Company
API-based Telephony
TropoMash-up style APIin multiple language
Java Media ControlJSR 309
Java SIP ServletsJSR 116/289
A Voxeo Company
Sim
pler
app
s,al
l ski
ll le
vels
Sop
hist
icat
ed a
pps
![Page 10: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/10.jpg)
Tropo
So lets get to the code already…
![Page 11: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/11.jpg)
Tropo
T.1: Hello World
JavaScript and PHP
answer();say("Hello, world!");hangup();
Ruby
answersay "Hello, world!”hangup
Groovy
answer()say 'Hello, world!'hangup()
Python
answer()say("Hello, world !")hangup()
![Page 12: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/12.jpg)
Tropo
T.2: Asking for Input - JavaScript// -----------// asking for input// -----------
answer();
result=ask( "Hi. For sales, press 1. For support, press 2.", {choices:"1, 2"} );
if (result.name=='choice'){
if (result.value=="1") { say( "sales is not available right now.") }if (result.value=="2") { say( "support is currently on the other line." ) }
}
hangup();
![Page 13: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/13.jpg)
Tropo
T.3: Repeating the Question - Ruby# -----------# repeating the question# -----------
answer
options = { :choices => '1, 2', :repeat => 3 } result = ask 'For sales, press 1. For support, press 2.', options
if result.name == 'choice' case result.value when '1' say 'sales is not available right now.' when '2' say 'support is currently on the other line.' endend
hangup
![Page 14: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/14.jpg)
Tropo
T.4: Changing Timeouts - Groovy// -----------// changing the default timeout// -----------
answer();
result=ask( "For sales, press 1. For support, press 2.", [choices:"1, 2",repeat:3, timeout:10] );
if (result.name=='choice'){
if (result.value=="1") { say( "sales is not available right now.") }if (result.value=="2") { say( "support is currently on the other line." ) }
}
hangup();
![Page 15: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/15.jpg)
Tropo
T.5: Speech - Python# Using speech input instead of touch-tone
answer()
result = ask("Hi. For sales, say sales. For support, say support",{'choices':"sales, support", 'repeat':3})
if (result.name == 'choice'): if (result.value == "sales"): say("Sales is not available right now") if (result.value == "support"): say("Support is currently on the other line.")
hangup()
![Page 16: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/16.jpg)
Tropo
T.6: Speech & DTMF - PHP<?php// -----------// using both speech and touch-tone input// -----------
answer();
$result = ask( "For sales, just say sales or press 1. For support, say support or press 2.", array( "choices" => "sales( 1, sales), support( 2, support)", "repeat" => 3 ) );
if ($result->name=="choice"){ if ($result->value=="sales") say( "sales is not available right now." ) ; if ($result->value=="support") say( "support is currently on the other line." ) ; }
hangup();
?>
![Page 17: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/17.jpg)
Tropo
T.7: Transfer Time - Ruby# -----------# connecting the call to another number ()# -----------
answer
options = { :choices => 'sales( 1, sales), support( 2, support)', :repeat => 3 } result = ask 'For sales, say sales or press 1. For support, say support or press 2.', options
if result.name == 'choice' case result.value when 'sales' say 'Ok, let me transfer you to sales.'
transfer '14075551212' when 'support' say 'Sure, let me get support. Please hold.'
transfer '14085551212' endend
hangup
![Page 18: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/18.jpg)
Tropo
T.8: Wrong Choices - Groovyanswer();
result=ask( "For sales, say sales or press 1. For support, say support or press 2.", [choices:"sales( 1, sales), support( 2, support)", repeat:3] );
if (result.name=='choice'){
if (result.value=="sales") {
say( "Ok, let me transfer you to sales.");transfer( "14075551212");
}if (result.value=="support") {
say( "Sure, let me get support. Please hold." );transfer( "14085551212");
}}
if( result.name=='badChoice'){
say( "I'm not sure what you wanted. Goodbye.")}
![Page 19: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/19.jpg)
Tropo
T.9: Event Handlers - JavaScriptanswer();
result=ask( "For sales, just say sales or press 1. For support, say support or press 2.", { choices:"sales( 1, sales), support( 2, support)", repeat:3, onBadChoice: function() { say("I'm sorry, I didn't understand what you said.") } } );
if (result.name=='choice'){
if (result.value=="sales") {
say( "Ok, let me transfer you to sales." );transfer( "14075551111");
}if (result.value=="support") {
say( "Sure, let me get support. Please hold." );transfer( "14085552222");
}}
![Page 20: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/20.jpg)
Tropo
T.10: Bad Choices - Rubyanswer
options = { :choices => 'sales( 1, sales), support( 2, support)', :repeat => 3, :onBadChoice => lambda { say ‘I did not understand what you said.' }, :onTimeout => lambda { say 'Hm. I did not hear anything.' } }
result = ask 'For sales, just say sales or press 1. For support, say support or press 2.', options
if result.name == 'choice' case result.value when 'sales' say 'Ok, let me transfer you to sales.' transfer '14075551212' when 'support' say 'Sure, let me get support. Please hold.' transfer '14085551212' endend
hangup
![Page 21: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/21.jpg)
Tropo
T.11: Right choices - Groovy// -----------// handling good choices with event handlers too// -----------
answer();
ask( "Hi. For sales, just say sales or press 1. For support, say support or press 2.", [ choices:"sales( 1, sales), support( 2, support)", repeat:3, onBadChoice: { say("I'm sorry, I didn't understand what you said.") }, onTimeout: { say("Hm. I didn't hear anything.") }, onChoice: {event-> if (event.value=='sales') { say( "Ok, let me transfer you to sales." ); transfer( "14075551212"); } if (event.value=='support') { say( "Sure, let me get support. Please hold." ); transfer( "14085551212"); } } ] );
![Page 22: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/22.jpg)
Tropo
T.12: onEvent - JavaScriptanswer();
ask( "Hi. For sales, just say sales or press 1. For support, say support or press 2.", { choices:"sales( 1, sales), support( 2, support)", repeat:3, onEvent: function( event ) { if (event.name=='badChoice') { say( ”I didn't understand what you said.") } if (event.name=='timeout') { say( "Hm. I didn't hear anything.") } if (event.name=='choice') { if (event.value=='sales') { say( "Ok, let me transfer you to sales." ); transfer( "14075551111"); } if (event.value=='support') { say( "Sure, let me get support. Please hold." ); transfer( "14085551111"); } } transfer( "14075552222"); } } );
![Page 23: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/23.jpg)
Tropo
T.13: conditional accept - Ruby# -----------# reject based on callerid# -----------
answer
log "*"*100 + currentCall.inspect
if currentCall.callerID == ’4078675309'answersay 'Hello there and goodbye'hangup
else rejectend
![Page 24: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/24.jpg)
Tropo
T.14: Bounce the Call - JavaScript// -----------// redirect// -----------
answer();
if (currentCall.callerID == '4075551111') answer() else redirect( "14075552222");
![Page 25: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/25.jpg)
Tropo
T.15: Branching - Groovy// -----------// Changing behavior based on number called// -----------
answer();
if (currentCall.calledID == '4075551111') say( "Hello Andrew.");if (currentCall.calledID == '4075552222') say( "Hello Brian. ");
hangup();
![Page 26: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/26.jpg)
Tropo
T.16 Recording - JavaScript
answer();
event=record("Leave your message at the beep. Thanks!", { beep:true, silenceTimeout: 5, maxTime:60, timeout:10, onRecord:function(event ) { say("you said " + event.recordURI ) } } );
log( "event.recordURI = " + event.recordURI );
hangup();
![Page 27: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/27.jpg)
Tropo
Using Language Libraries• Tropo programs can use language libraries• Most libraries supported – Except…
– No local file access– No threads. – No exec()– Etc…
from random import *
number = randint(1,1000)
answer()say("Hello. Your magic number today is %s. Goodbye." % number)hangup()
![Page 28: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/28.jpg)
Tropo
Mashing Up With Web Services
# python app to retrieve and say a text fileimport urllibnumber= urllib.urlopen("http://blog-files.voxeo.com/media/test.txt").read()
answer()say("Welcome to Tropo. Your magic number is %s. Goodbye." % number)hangup()
// Groovy app to retrieve and say top ten hits from Yahoo musicdef musicbase = "http://us.music.yahooapis.com/track/v1"def appid = "KgtDvNrV34Eavq_dUF81vBlVLKAOq7o1tj7Tzvu_kYbKsCtBW190VmrvVHK_0w--”
say( ", Top 10 Chart Toppers!" )def toptracksxml = new XmlSlurper().parseText( "${musicbase}/list/published/popular?count=10&appid=${appid}".toURL().text )toptracksxml.Track.each { track -> say( ", Number " + track.ItemInfo.ChartPosition["@this"] + ", " + track["@title"] + ", by " + track.Artist[0]["@name"] )}say( ", Goodbye!" )hangup()
![Page 29: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/29.jpg)
Tropo
Getting Started with Tropo
• www.tropo.com• Login with your Voxeo Evolution ID• Or - Create a new Account for Free
• Account -> Your Applications• Create New Application• Option to create a hosted file (or use a URL)
• Account -> Your Hosted Files to edit files
![Page 30: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/30.jpg)
Tropo
So How about some Cash?
![Page 31: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/31.jpg)
Tropo
Write a mashup with Tropo
Get $100
![Page 32: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/32.jpg)
Tropo
Examples• Existing examples are posted at
http://tropo.com/examples and also hosted at http://github.com/tropo
• Examples so far include: – Auto Attendant– RPG – RSS reader– Yahoo traffic via phone– Sports scores – Monty Python quote generator – Location Data– Phone Simon – Etc…
![Page 33: Tropo eComm 2009 Tutorial](https://reader033.vdocuments.net/reader033/viewer/2022061205/54810951b4af9f0a2c8b46fe/html5/thumbnails/33.jpg)
Tropo
So start writing some code!