Captcha-NocaptchaMailru
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Captcha/NocaptchaMailru.pm view on Meta::CPAN
package Captcha::NocaptchaMailru;
use strict;
use warnings;
use LWP::UserAgent;
use JSON;
use URI::Escape;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(
nocaptcha_generate_captcha_url
nocaptcha_generate_captcha_tag
nocaptcha_check
nocaptcha_check_detailed
);
use version 0.77; our $VERSION = version->declare('v1.0.0');
use constant API_SERVER => 'https://api-nocaptcha.mail.ru';
sub _is_check_response_correct {
my ($resp) = @_;
return 0 unless exists($resp->{status});
if ($resp->{status} eq 'ok') {
return 0 unless exists($resp->{is_correct});
return 1;
}
return unless exists($resp->{desc}) and exists($resp->{code});
return 1;
}
sub _get_json_by_url {
my $agent = LWP::UserAgent->new();
my $resp = $agent->get($_[0]);
return 'request failed' unless $resp->is_success;
my $json = eval {
decode_json($resp->decoded_content);
};
return 'JSON parsing failed' if $@;
return $json;
}
sub _pack_params {
my ($hash) = @_;
my @pairs;
for my $key (keys %$hash) {
push @pairs, join('=', map { uri_escape($_) } $key, $hash->{$key});
}
return join('&', @pairs);
}
sub _generate_check_url {
my ($key, $id, $val) = @_;
return API_SERVER . '/check?' . _pack_params({'private_key' => $key,
'captcha_id' => $id,
'captcha_value' => $val});
}
sub check_detailed {
my ($key, $id, $val) = @_;
my $url = _generate_check_url($key, $id, $val);
my $resp = _get_json_by_url($url);
return {is_ok => 0, error => $resp} unless ref($resp) eq 'HASH';
return {is_ok => 0, error => 'invalid response'} unless _is_check_response_correct($resp);
return {is_ok => 0, error => "$resp->{status}: $resp->{desc}"} unless $resp->{status} eq 'ok';
return {is_ok => 1, is_correct => ($resp->{is_correct} ? 1 : 0)};
}
sub check {
my $res = check_detailed(@_);
return 1 if $res->{is_ok} and $res->{is_correct};
return 0;
}
sub generate_captcha_url {
return API_SERVER . '/captcha?' . _pack_params({'public_key' => $_[0]});
}
sub generate_captcha_tag {
return '<script type="text/javascript" src="' .
generate_captcha_url($_[0]) . '"></script>';
}
sub nocaptcha_generate_captcha_url {
return generate_captcha_url(@_);
}
sub nocaptcha_generate_captcha_tag {
return generate_captcha_tag(@_);
}
sub nocaptcha_check {
return check(@_);
}
sub nocaptcha_check_detailed {
return check_detailed(@_);
}
1;
__END__
=head1 NAME
Captcha::NocaptchaMailru - Module for working with Nocaptcha Mail.Ru service
=head1 SYNOPSIS
use Captcha::NocaptchaMailru;
use constant PUBLIC_KEY => 'e5238532bf56e4c24bd5489d463ac2a0';
use constant PRIVATE_KEY => '3cf11185476394b85bcec3fbf16c69a4';
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.435 second using v1.00-cache-2.02-grep-82fe00e-cpan-b63e86051f13 )