Skip to content

Instantly share code, notes, and snippets.

@samwize
Created October 22, 2012 09:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save samwize/3930666 to your computer and use it in GitHub Desktop.
Save samwize/3930666 to your computer and use it in GitHub Desktop.
Hoiio Example: Weather by Phone
<?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