Mailru-Cloud

 view release on metacpan or  search on metacpan

lib/Mailru/Cloud/Auth.pm  view on Meta::CPAN

    $self->{ua} = $ua;
    $self->{ua}->max_redirect($max_redirect);
    return bless $self, $class;
}

sub login {
    my ($self, %opt)   = @_;
    $self->{login}     = $opt{-login}       || $self->{login}       || croak "You must specify -login opt for 'login' method";
    $self->{password}  = $opt{-password}    || $self->{password}    || croak "You must specify -password opt for 'login' method";
    my $res;

    #Get login token
    $res = $self->{ua}->get('https://mail.ru');
    if ($res->code ne '200') {
        croak "Can't get start mail.ru page. Code: " . $res->code;
    }

    my $login_token;

    # В бровзере ловится вот этой регулярочкой
    if ($res->decoded_content =~ /CSRF\s*=\s*\"([a-f|A-F|0-9]+)\"/) {
        $login_token = $1;
    # В этом скрипте - почему-то вот этой
    } elsif ($res->decoded_content =~ /CSRF:\s+\"([a-f|A-F|0-9]+)\"/) {
        $login_token = $1;
    } else {
        croak "Can't found login token";
    }

    #Login
    my $param = {
            'login'         => $self->{login},
            'password'      => $self->{password},
            'saveauth'      => 1,
            'project'       => 'e.mail.ru',
            'token'         => $login_token,
    };

    my %headers = (
        'Referer'           => 'https://mail.ru/?from=logout',
        'Origin'            => 'https://mail.ru',
    );

    $res = $self->{ua}->post('https://auth.mail.ru/jsapi/auth', $param, %headers);
    if ($res->code ne '200') {
        croak "Wrong response code from login form: " . $res->code;
    }

    my $json = decode_json($res->decoded_content);
    if ($json->{status} eq 'fail') {
        croak "Fail login: $json->{code}";
    }

    $self->__getToken() or return;
    return $self->{authToken};
}

sub __getToken {
    my $self = shift;

    my $res = $self->{ua}->get('https://auth.mail.ru/sdc?from=' . uri_escape('https://cloud.mail.ru/?from=promo&from=authpopup') );

    if ($res->is_success) {
        my $content = $res->decoded_content;
        if ($content =~ /\"csrf\"\s*\:\s*\"([0-9|a-z|A-Z|_]+)\"/) {
            $self->{authToken} = $1;
            carp "Found authToken: $self->{authToken}" if $self->{debug};

            if ($content =~ /\"email\"\s*:\s*\"(.+?)\"/) {
                $self->{email} = $1;
                carp "Found email: $self->{email}" if $self->{debug};

                #Get BUILD
                $self->{build} = 'hotfix_CLOUDWEB-7726_50-0-3.201710311503';
                if ($content =~ /\"BUILD\"\s*:\s*\"(.+?)\"/) {
                    $self->{build} = $1;
                    carp "Found and use new build $self->{build}" if $self->{debug};
                }

                #Get x-page-id
                $self->{'x-page-id'} = 'f9jfLFeHA5';
                if ($content =~ /\"x\-page\-id\"\s*:\s*\"(.+?)\"/) {
                    $self->{'x-page-id'} = $1;
                    carp "Found and use new x-page_id $self->{build}" if $self->{debug};
                }

                #Parse free space info
                $self->{info} = __parseInfo(\$content);
                return 1;
            }

        }
    }
    return;
}

sub info {
    my $self = shift;
    if ($self->{info}) {
        my %info = map {$_, $self->{info}->{$_}} keys %{$self->{info}};
        return \%info;
    }
    return;
}

sub __parseInfo {
    my $content = shift;
    my %info = (
                'used_space'        => '',
                'total_space'       => '',
                'file_size_limit'   => '',
            );

    if (my ($size_block) = $$content =~ /"space":\s*{([^}]*)}/s) {
        while ($size_block =~ /"([^"]+)":\s*(\w+?)\b/gm) {
            if ($1 eq 'bytes_total') {
                $info{total_space} = $2;
            }
            elsif ($1 eq 'bytes_used') {
                $info{used_space} = $2;
            }



( run in 2.667 seconds using v1.01-cache-2.11-cpan-364913b4093 )