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.

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.

March 20, 2011

Scrub against temporary email addresses

Validating a user’s email addresses is a must, but most developers just pop in the first premade validation function they find without actually evaluating how effective it is.

Most canned functions simply:

  • Check for the @ symbol
  • Check if the domain has a “dot something” at the end

More advanced ones:

  • Check if the domain is actually registered via cURL or PHP functions like dns_get_record and checkdnsrr
  • Check if the TLD exists (against a list of all known ICANN TLDs)
  • Check for existing accounts with the same email, minus periods and pluses (for services like Gmail where bbqsauce@gmail.com, b.b.q.sauce@gmail.com, and bbq.sauce+tastesgood@gmail.com go to the same inbox)

Still, I have never seen a script to filter against disposable email services. Disposable email services allow users to generate a temporary email addresses in a single click. I’ve used mailinator.com over a dozen times to register for a site that I only want to use once. I never have seen a site filter against it.

So here comes Brian to the rescue, giving all you validation junkies a huge list I complied of 119 disposable email domains to check against. If you prefer, you can download this list as a PHP array.

Disposable Email Domains

mailinator.com
thisisnotmyrealemail.com
mailmetrash.com
mytrashmail.com Continue Reading →

January 17, 2011

Crack Masterlock Combinations

Master Lock

This past weekend I created a site that makes it easy to retrieve your forgotten Masterlock combination. If you were to manually attempt every combination, you would have to go through 64,000 combinations. This site uses a known masterlock algorithm to bring the possibilities down to just 80. Not bad?

Check it out:

FindCombination.com

So why did you REALLY do this Brian?

I wanted to learn jQuery. I’ve found that it’s easiest to learn something new when you have an end goal in mind. Your brain figures out how to fill in the cracks and actually apply the information you’re taking in. I highly suggest this method of learning. It’s worked well for me with PHP, MySQL, HTML & CSS, SEO, and Affiliate Marketing.