Created
October 22, 2012 09:43
-
-
Save samwize/3930666 to your computer and use it in GitHub Desktop.
Hoiio Example: Weather by Phone
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Check weather by phone | |
APIs used | |
- ivr/middle/gather | |
- ivr/middle/play | |
API Flow | |
1. <-- Incoming call to Hoiio number | |
2. --> IVR Gather API: gets ZIP code from caller | |
3. <-- ZIP code from from caller | |
4. --> IVR Play API: Read out the forecast. | |
5. <-- Done notification after reading. Repeat from step 2. | |
In this example, we are going to describe how to build an application that reads out the | |
weather forecast. The caller calls into a number, enters a zip code, and hears the | |
forecast. The application loops until the user hangs up the phone. | |
This example uses Yahoo weather API (http://developer.yahoo.com/weather/) | |
*/ | |
// Developer information: appId, accessToken | |
$appId = "YOUR_APP_ID_HERE"; | |
$accessToken = "YOUR_ACCESS_TOKEN_HERE"; | |
$server = "https://secure.hoiio.com/open"; | |
$myUrl = "http://".$_SERVER['SERVER_NAME'].":".$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF']; | |
if ($_POST == null) { | |
return; | |
} | |
// New incoming calls | |
if ($_POST['call_state'] == "ringing") { | |
askZip(); | |
return; | |
} | |
else if ($_POST['call_state'] == "ongoing") { | |
switch ($_POST['tag']) { | |
case "askZip": | |
checkDigitPressed(); | |
break; | |
case "playMessage": | |
askZip(); | |
break; | |
} | |
} | |
else if ($_POST['call_state'] == "ended") { | |
// Call has ended | |
} | |
return; | |
function askZip() { | |
// Send a Gather API to confirm the subscription | |
$data = http_build_query( | |
array( "app_id" => $GLOBALS['appId'], | |
"access_token" => $GLOBALS['accessToken'], | |
"tag" => "askZip", | |
"session" => $_POST['session'], | |
"msg" => "Please enter your W-O-E-I-D code.", | |
"max_digits" => "9", | |
"notify_url" => $GLOBALS['myUrl'])); | |
$response = do_post_request($GLOBALS['server']."/ivr/middle/gather", $data); | |
$result = json_decode($response); // can do the checking here with the result | |
} | |
function checkDigitPressed() { | |
// Retrieve the digits pressed by the user. | |
$zip = $_POST['digits']; | |
// Checks the zip code | |
if (strpos($zip, '*') !== false) { | |
playMessage("You have entered an invalid W-O-E-I-D code"); | |
} | |
else { | |
// Get the forecast | |
$forecastStr = do_get_request("http://weather.yahooapis.com/forecastrss?w=" . $zip . "&u=c"); | |
echo "http://weather.yahooapis.com/forecastrss?w=" . $zip . "&u=c"; | |
print_r($forecastStr); | |
if (strpos($forecastStr, "City not found")) { | |
playMessage("You have entered an invalid W-O-E-I-D code"); | |
} else { | |
// Extract the temperature info | |
$rss = new SimpleXMLElement($forecastStr); | |
$temp = $rss->channel->item->children('yweather', true)->condition->attributes()->temp; | |
$condition = $rss->channel->item->children('yweather', true)->condition->attributes()->text; | |
$location = $rss->channel->children('yweather', true)->location->attributes()->city; | |
playMessage("It is currently ". $temp ." degrees celsius and ". $condition ." in ". $location ."."); | |
} | |
} | |
} | |
function playMessage($msg) { | |
// Play a message | |
$data = http_build_query( | |
array( "app_id" => $GLOBALS['appId'], | |
"access_token" => $GLOBALS['accessToken'], | |
"tag" => "playMessage", | |
"session" => $_POST['session'], | |
"msg" => $msg, | |
"notify_url" => $GLOBALS['myUrl'])); | |
$response = do_post_request($GLOBALS['server']."/ivr/middle/play", $data); | |
$result = json_decode($response); | |
} | |
// Source adapted from http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl | |
// This function will do the http post to the server, feel free to use different function of your desire | |
function do_post_request($url, $data) { | |
$params = array('http' => array( | |
'method' => 'POST', | |
'content' => $data | |
)); | |
$ctx = stream_context_create($params); | |
$fp = @fopen($url, 'rb', false, $ctx); | |
if (!$fp) { | |
throw new Exception("Problem with $url, $php_errormsg"); | |
} | |
$response = @stream_get_contents($fp); | |
if ($response === false) { | |
throw new Exception("Problem reading data from $url, $php_errormsg"); | |
} | |
return $response; | |
} | |
function do_get_request($url) { | |
$params = array('http' => array( | |
'method' => 'GET' | |
)); | |
$ctx = stream_context_create($params); | |
$fp = @fopen($url, 'rb', false, $ctx); | |
if (!$fp) { | |
throw new Exception("Problem with $url, $php_errormsg"); | |
} | |
$response = @stream_get_contents($fp); | |
if ($response === false) { | |
throw new Exception("Problem reading data from $url, $php_errormsg"); | |
} | |
return $response; | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment