Acme-Free-API-Geodata-GeoIP
view release on metacpan or search on metacpan
lib/Acme/Free/API/Geodata/GeoIP.pm view on Meta::CPAN
package Acme::Free::API::Geodata::GeoIP;
use v5.38;
use strict;
use warnings;
use utf8;
our $VERSION = '1.0';
use Data::Dumper;
use WWW::Mechanize;
use JSON::XS qw(decode_json);
sub new($proto, %config) {
my $class = ref($proto) || $proto;
my $self = bless \%config, $class;
my $agent = WWW::Mechanize->new(cookie_jar => {});
$agent->agent('PerlMonks contest/1 (https://perlmonks.org/?node_id=11161472)');
$agent->stack_depth(1);
$self->{agent} = $agent;
if(!defined($self->{debug})) {
$self->{debug} = 0;
}
return $self;
}
sub lookup($self, $ip) {
my $url = "http://ip-api.com/json/" . $ip;
my $content = $self->_fetchURL($url);
my $ok = 0;
my $decoded;
eval {
$decoded = decode_json($content);
$ok = 1;
};
if(!$ok || !defined($decoded)) {
$self->_debuglog("Failed to decode response. Not a JSON document?");
$self->_debuglog(Dumper($decoded));
return;
}
#$self->_debuglog(Dumper($decoded));
return $decoded;
}
# internal helpers
# these are copied from CAVACs vast framework. But we don't want hundreds of dependencies in this example code, only a couple of functions
sub _fetchURL($self, $url) {
$self->{agent}->get($url);
if(!$self->{agent}->success()) {
$self->_debuglog("Network error while fetching URL $url");
return;
}
my $response = $self->{agent}->response();
( run in 1.785 second using v1.01-cache-2.11-cpan-39bf76dae61 )