Captcha-NocaptchaMailru

 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 distribution
 view release on metacpan -  search on metacpan

( run in 0.435 second using v1.00-cache-2.02-grep-82fe00e-cpan-b63e86051f13 )