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 )