Captcha-reCAPTCHA-V3

 view release on metacpan or  search on metacpan

lib/Captcha/reCAPTCHA/V3.pm  view on Meta::CPAN

package Captcha::reCAPTCHA::V3;
require 5.10.1;
use strict;
use warnings;

our $VERSION = "0.14";

use Carp qw(carp croak);
use JSON::MaybeXS;
use Try::Tiny;

use overload(
    '""'  => sub { $_[0]->name() },
    'cmp' => sub { $_[0]->name() cmp $_[1] },
);

sub new {
    my $class = shift;
    my $self  = bless {}, ref $class || $class;
    my %attr  = @_;

    # Initialize the values for API
    $self->{sitekey}    = $attr{sitekey}    || '';    # No need to set sitekey in server-side
    $self->{secret}     = $attr{secret}     || croak "missing param 'secret'";
    $self->{query_name} = $attr{query_name} || 'g-recaptcha-response';

    $self->{widget_api} = 'https://www.google.com/recaptcha/api.js';
    $self->{verify_api} = 'https://www.google.com/recaptcha/api/siteverify';
    return $self;
}

sub name {
    my $self = shift;
    return $self->{query_name} unless my $value = shift;
    $self->{query_name} = $value;
}

sub sitekey {
    my $self = shift;
    return $self->{sitekey} unless my $value = shift;
    $self->{sitekey} = $value;
}

# verifiers =======================================================================
sub get_json_with_curl {
    my $self     = shift;
    my $response = shift;
    croak "Extra arguments have been set." if @_;

    my $cmd = sprintf(
        q{curl -sS -X POST %s -d secret=%s -d response=%s},
        $self->{verify_api},
        _shell_escape($self->{secret}),
        _shell_escape($response),
    );

    my $json = try { qx{$cmd} } catch { carp "Failed to execute curl" and return {} };
    return decode_json($json) || {};
}

sub get_json_with_http_tiny {
    my $self     = shift;
    my $response = shift;
    croak "Extra arguments have been set." if @_;

    return {} unless eval { require HTTP::Tiny };
    my $ua  = HTTP::Tiny->new;
    return {} unless $ua->can_ssl();

    my $res = try { $ua->post_form(



( run in 1.043 second using v1.01-cache-2.11-cpan-5fbc6bb55f2 )