OpenCNAM for Asterisk cidnam lookup
Posted . ~2min read.
Long ago, in a world much different from today, one could check 411.com, anywho, and even google for Caller ID names. Those days are gone my friends. It’s slowly becoming a pay to play world…
I just played with a solution from OpenCNAM that was pretty freaking simple. There’s a negative — it ain’t free. The cost is nominal… $0.004/lookup. That means that $10 will get you 2500 lookups.
Before you get all crazy on me — yes, there is a free “hobbyist” version. I think it’s worthless, since all the cellphones I tried returned the cidnam value of “currently unavailable for Hobbyist Tier users.”
I digress.
I chose Perl to integrate opencnam into my Asterisk dialplan. Why? Because I like Perl. Yes, I’ve heard of Python, and Lua, and Ruby, and when it comes down to it… I like Perl.
Here’s how I chose to integrate the lookup:
Asterisk Dialplan
exten => _X.,1,Verbose(3,Look an incoming call. Yay.) exten => _X.,n,AGI(get-opencnam.pl,${CALLERID(num):-10}) exten => _X.,n,Verbose(3,result: ${OPENCNAM})
get-opencnam.pl
#!/usr/bin/perl -w use strict; $|=1; my ($phone, $url, $apikey, $authkey, $result); while(<STDIN>) { chomp; last unless length($_); } if ($ARGV[0]) { $phone = &URLEncode($ARGV[0]); } else { &setvar("OPENCNAM", "No Phone"); &setvar("CALLERID(name)", "Unknown"); &printverbose("OPENCNAM: No CALLFROM received.",2); exit(0); } #Get the cid $apikey = "APIKEY"; $authkey = "AUTHKEY"; $url = "api.opencnam.com/v2/phone/"; $result = qx(curl -m 2 -s https://$apikey:$authkey@$url+1$phone?format=text); #or free version would be... #$result = qx(curl -m 2 -s https://api.opencnam.com/v2/phone/+1$phone); if ($result) { &setvar("OPENCNAM", "$result"); &setvar("CALLERID(name)", "$result"); &printverbose("OPENCNAM: $result.",2); } else { &setvar("OPENCNAM", "FAIL"); &setvar("CALLERID(name)", "Unknown"); &printverbose("OPENCNAM: Timeout or error",2); } sub URLEncode { my $theURL = $_[0]; $theURL =~ s/([W])/"%" . uc(sprintf("%2.2x",ord($1)))/eg; return $theURL; } sub setvar { my ($var, $val) = @_; print STDOUT "SET VARIABLE $var "$val" n"; while(<STDIN>) { m/200 result=1/ && last; } return; } sub printverbose { my ($var, $val) = @_; print STDOUT "VERBOSE "$var" $valn"; while(<STDIN>) { m/200 result=1/ && last; } return; }
The beauty is you can choose when to run this… considerations (for you to save money) would be:
- If cnam already exists, skip the check.
- Run a local check first… for example, using a local phonebook or db lookup
- Only running calls from the PSTN
- etc.
Happy coding.