--- /dev/null
+#!/usr/bin/perl
+#
+# OpenCNAM front end because they only take 10 digits and can't filter 11 on their side.
+#
+
+use Data::Dumper;
+use CGI qw/:standard/;
+use LWP::UserAgent;
+use SDBM_File;
+use Fcntl;
+
+my %params = map { $_ => get_data( $_ ) } param;
+
+$ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
+
+sub get_data {
+ my $name = shift;
+ my @values = param( $name );
+ return @values > 1
+ ? \@values
+ : $values[0];
+}
+
+print "Content-Type: text/plain\n\n";
+
+tie (my %cache, 'SDBM_File', 'cnam.dbm', O_RDWR|O_CREAT, 0640) || die $!;
+
+my $number = $params{number};
+
+
+if($number =~ m/1?\d{10}/) {
+
+
+ if($number =~ m/^1(\d{10})$/) {
+ $number = $1;
+ }
+
+ if($cache{"$number"}) {
+ print $cache{"$number"};
+ untie %cache;
+ exit;
+ }
+
+ my $url = "https://api.opencnam.com/v1/phone/$number?format=text";
+
+
+ my $res = $ua->get( $url );
+
+ if ($res->is_success) {
+ my $content = $res->decoded_content;
+ if ($content =~ m/^Invalid/) {
+ # API shouldn't return this crap.
+ print "UNKNOWN";
+ } else {
+ # Cache the entry.
+ $cache{"$number"} = $content;
+ # print the entry.
+ print $content;
+ }
+ }
+}
+
+untie %cache;