0
August 2, 2013

Record phone calls, from any device

Record Phone Calls

There have been many times that I wish I had been able to record a phone call. Negotiations, complex customer service requests, the last conversation with my grandpa before he died – all things I wish I could have saved. I’ve searched for iPhone apps to do this, but Apple doesn’t let developers touch and tweak the Phone application.

So I created SecureSpeak.com. It’s a way to record phone calls by doing a 3-way call – you, the person you want to call, and the recording phone line. After you hang up, an mp3 of the recording is emailed to you. Super. Simple.

There are similar apps out there, but all of them require you to know ahead of time that you want to record the call. The way SecureSpeak is designed, you can conference in the recording line at any time during a call, and not have to record 10 minutes of pleasantries before getting to the core of the conversation.

The ones for iOS are mostly VOIP, and depending on your data signal, can lead to some pretty low quality recordings. This system purely uses the phone waves, and leads to higher quality and more reliable calls.

So check out the site and look at how to record phone calls. Starting plans are just $14.99/month, and is worth every penny when you can present concrete evidence in a sticky situation.

4
June 30, 2012

Using Twilio to extend the functionality of Siri

Siri is great for playing music from your iPhone. But if you don’t have the song on your library, Siri can’t go and play it on Spotify, Pandora, Grooveshark, or any of the other players (for now). But if Siri can send a text message to a Twilio number (which I called “Siri Tunes” in my address book), that number can reply with a message linking to an mp3 that can be opened in QuickTime. Watch the demo of the application:

I love building Twilio applications. Contact me if you’re interested having a Twilio application created.

1
June 20, 2011

Mobile Time Tracking using Twilio and Freshbooks

I use Freshbooks to manage all of my invoicing. I manage projects, log hours, and it allows me to keep a careful track of my business. I’m lucky enough to be connect to the internet when I’m working, but for some companies working out in the field, keeping track of hours has been mostly done on pencil and paper.

I built an application integrating Twilio and Freshbooks to solve this problem. Watch the video below to see my Twilio and Freshbooks time tracking system.

How it works

Since you can only submit a completed time log to FreshBooks, the initial clock in call is stored in a database on a separate server. When the user calls back to clock out, it compares the clock out time with the saved clock in time, and then totals up the hours worked. After we know how many hours were worked, the full time log gets submitted to FreshBooks.

Altogether, I mashed up a few different technologies, including:

  • Twilio Voice API
  • Twilio Transcription API
  • FreshBooks API
  • PHP
  • MySQL

If you’re interested in using this for your company, shoot me a message and I’d be happy to set it up for you, or let you license out the code.

4
May 20, 2011

Twilio Syntax Auto-Complete Mode for Coda

I love Twilio‘s markup language, TwiML. It’s intuitive and easy to understand. Still, whenever I’m developing I have to keep the Twilio documentation page open to know all the verbs and attributes of the language. To save time, I created my very own mode plugin for Coda so that as I’m typing, it automatically completes the Twilio commands and shows me all the available attributes. So, without further adue, download Twilio.mode and install it in Coda.

Install instructions:

  1. Download Twilio.mode.zip
  2. Unzip it
  3. Copy the new Twilio.mode folder to: ~/Library/Application Support/Coda/Modes
  4. Reboot Coda, and under Text > Syntax Mode you’ll see Twilio

If you liked this plugin, you should probably follow me on Twitter. I’m always giving away little scripts like this. Note: It’s also available on github.

2
April 4, 2011

Mobile Mad Libs

The team over at Twilio was running a contest to create a game using their amazing voice and SMS developer platform this week, and I just submitted my entry. The game? Mobile Mad Libs. It’s a word game for those long road trips where you can’t (safely) play Angry Birds on your iPhone, but still want to keep your mind active.

Try it for free! Dial 718-569-7938.

1
April 2, 2011

Twilio + WhitePages API = Win

I’m currently working on a Twilio application that requires a complete caller ID lookup system. The caller ID that comes on most phones is very basic, and uses something called CNAM (Caller NAMe). Twilio has a simple CNAM function built in that costs $0.01 per query, but CNAM gives pretty skimpy data. These queries only give one line of info and if the person is using a cellphone, it’s likely only going to give you something like “Wireless Caller” or “Cingular Wireless Customer.”

Thank god for the WhitePages API.

It took me quite awhile to find the API, but when I did I let off a big fist pump. Currently their API is in beta, and only allows you to make 200 calls a day (Pro Tip: build up your own database with all the calls you make to save on repete queries). After a quick whois on whitepages.com, I got their office number in Seattle and next thing I know I’m speaking with Jim Nuccitelli, the director in charge of their API. Jim helped push my application along and told me about some upcoming advances in their API (Spoiler: awesomeness to come).

So, I’ve ripped apart their API and am using it to look up info on incoming numbers through Twilio. Below is a PHP function that does a WhitePages lookup for a ten digit phone number and returns an array with the following:

  • First Name
  • Middle Name
  • Last Name
  • Street Address
  • City
  • State
  • Zip
  • Business Name
  • Phone Type (Cell, home, business, etc)
  • Carrier
function phoneNumberLookup($number){
	// $number should be 10 digits, eg] 4565551337
	$apiKey = "XXXXXXXXXXXXXXX";
	$url = "http://api.whitepages.com/reverse_phone/1.0/?phone=$number;api_key=$apiKey";

	global $whitePages;
	$whitePages = array(
	"wpFirstName" => "",
	"wpMiddleName" => "",
	"wpLastName" => "",
	"wpAddressFullStreet" => "",
	"wpAddressCity" => "",
	"wpAddressState" => "",
	"wpAddressZip" => "",
	"wpBusinessName" => "",
	"wpPhoneType" => "",
	"wpCarrier" => ""
	);

	function contents($parser, $data){
		global $nextVar, $whitePages;
		if( ($nextVar != '') && (trim($data) != '') && ($whitePages[$nextVar] == '') ){
			$whitePages[$nextVar] = $data;
		}
	}

	function startTag($parser, $data){
		global $nextVar;
		switch ($data) {
			case "WP:FIRSTNAME":
				$nextVar = 'wpFirstName';
				break;
			case "WP:MIDDLENAME":
				$nextVar = 'wpMiddleName';
				break;
			case "WP:LASTNAME":
				$nextVar = 'wpLastName';
				break;
			case "WP:FULLSTREET":
				$nextVar = 'wpAddressFullStreet';
				break;
			case "WP:CITY":
				$nextVar = 'wpAddressCity';
				break;
			case "WP:STATE":
				$nextVar = 'wpAddressState';
				break;
			case "WP:ZIP":
				$nextVar = 'wpAddressZip';
				break;
			case "WP:BUSINESSNAME":
				$nextVar = 'wpBusinessName';
				break;
			case "WP:TYPE":
				$nextVar = 'wpPhoneType';
				break;
			case "WP:CARRIER":
				$nextVar = 'wpCarrier';
				break;
		}
	}

	function endTag($parser, $data){
	}

	$xml_parser = xml_parser_create();
	xml_set_element_handler($xml_parser, "startTag", "endTag");
	xml_set_character_data_handler($xml_parser, "contents");

	$fp = fopen($url, "r");
	$data = fread($fp, 80000);

	if(!(xml_parse($xml_parser, $data, feof($fp)))){
		die("Error on line " . xml_get_current_line_number($xml_parser));
	}

	xml_parser_free($xml_parser);
	fclose($fp);

	return $whitePages;

}

Since the WhitePages API requires numbers to be in 10 digit format, I’ve also got a tiny function to sanitize a number for this format.

function phoneFormatTenDigits($number){
	// takes numbers like +14565551337, or (456) 555-1337 and turns them to 4565551337
	$number = preg_replace('[D]', '', $number); // gets rid of all non-digits
	if( substr($number, 0, 1) == '1' ){
		$number = substr($number, 1); // gets rid of the first digit if it's a 1
	}
	return $number;
}

If you used this, say thanks by tweeting out this page.