Pcore-API-Moz

 view release on metacpan or  search on metacpan

lib/Pcore/API/Moz.pm  view on Meta::CPAN

use Pcore::API::Moz::Account;

has proxy_pool => ( is => 'ro', isa => Maybe [ InstanceOf ['Pcore::API::ProxyPool'] ] );
has api_expires => ( is => 'ro', isa => PositiveInt, default => 172_800 );    # in seconds, 2 days

has has_valid_accounts => ( is => 'ro', isa => PositiveOrZeroInt, default  => 0, init_arg => undef );
has valid_accounts     => ( is => 'ro', isa => ArrayRef,          init_arg => undef );
has invalid_accounts   => ( is => 'ro', isa => ArrayRef,          init_arg => undef );

has _accs_ids => ( is => 'ro', isa => HashRef, init_arg => undef );

# free API limitations:
# https://moz.com/help/guides/moz-api/mozscape/overview/free-vs-paid-access
# - regular members: 1 call per 10 seconds;
# - 10 URLs per batch;

sub BUILD ( $self, $args ) {
    $self->add_accounts( $args->{accounts} ) if $args->{accounts};

    return;
}

sub add_accounts ( $self, $accounts ) {
    for my $id ( keys $accounts->%* ) {
        my $acc_id = "$id-$accounts->{$id}";

        next if exists $self->{_accs_ids}->{$acc_id};

        $self->{_accs_ids}->{$acc_id} = undef;

        unshift $self->{valid_accounts}->@*, Pcore::API::Moz::Account->new( { moz => $self, id => $id, key => $accounts->{$id} } );

        $self->{has_valid_accounts}++;
    }

    return;
}

sub is_ready ($self) {
    if ( !$self->{valid_accounts}->@* || !$self->{valid_accounts}->[0]->is_ready ) {
        return 0;
    }

    return 1;
}

sub get_url_metrics ( $self, $domains, $metric, $cb ) {
    if ( $domains->@* > 10 ) {
        $cb->( res [ 400, q[Max. 10 domains are allowed per search request] ] );

        return;
    }

    if ( !$self->{has_valid_accounts} ) {
        $cb->( res [ 600, q[No moz accounts] ] );

        return;
    }

    if ( !$self->{valid_accounts}->@* || !$self->{valid_accounts}->[0]->is_ready ) {
        $cb->( res [ 601, q[API is busy] ] );

        return;
    }

    my $acc = shift $self->{valid_accounts}->@*;

    $acc->get_url_metrics(
        $domains, $metric,
        sub($res) {
            if ( !$res ) {

                # account is banned:
                # 401 - invalid credentials
                # 403 - account banned
                # 429 - too many requests
                if ( $res->{status} == 401 || $res->{status} == 403 || $res->{status} == 429 ) {
                    $self->{has_valid_accounts}--;

                    push $self->{invalid_accounts}->@*, $acc;
                }

                # not fatal error
                else {
                    push $self->{valid_accounts}->@*, $acc;
                }
            }

            # ok
            else {
                push $self->{valid_accounts}->@*, $acc;
            }

            $cb->($res);

            return;
        }
    );

    return;
}

1;
__END__
=pod

=encoding utf8

=head1 NAME

Pcore::API::Moz

=head1 SYNOPSIS

=head1 DESCRIPTION

=head1 ATTRIBUTES

=head1 METHODS

=head1 SEE ALSO



( run in 0.803 second using v1.01-cache-2.11-cpan-39bf76dae61 )