Akado-Account
view release on metacpan or search on metacpan
lib/Akado/Account.pm view on Meta::CPAN
use XML::XPath;
sub new {
my ($class, $self) = @_;
croak 'No login specified, stopped' unless $self->{login};
croak 'No password specified, stopped' unless $self->{password};
$self->{site} ||= 'https://office.akado.ru/';
bless($self, $class);
return $self;
}
sub get_balance {
my ($self) = @_;
my $data = $self->_get_cached_parsed_data();
return $data->{balance};
}
sub get_next_month_payment {
my ($self) = @_;
my $data = $self->_get_cached_parsed_data();
return $data->{next_month_payment};
}
sub _get_cached_parsed_data {
my ($self) = @_;
if (not defined $self->{_parsed_data}) {
my $xml = $self->_get_full_account_info_xml();
$self->{_parsed_data} = $self->_parse_xml($xml);
}
return $self->{_parsed_data};
}
sub _get_full_account_info_xml {
my ($self) = @_;
my $browser = LWP::UserAgent->new;
$browser->agent("Akado::Account/$Akado::Account::VERSION");
$browser->cookie_jar( {} );
# At first we need to login to the site.
# Here we POST login/password and recieve session cookies that are stored
# in the UserAgent cookie_jar.
my $auth_response = $self->_get_auth_response($browser);
# Here we get account data using session cookies that we got at the
# previous step
my $data_response = $self->_get_data_response($browser);
my $xml = $data_response->decoded_content;
return $xml;
}
sub _parse_xml {
my ($self, $xml) = @_;
my $xp = XML::XPath->new( xml => $xml );
my $balance = $xp->findnodes('//bill[contains(@description, "ÐÑÑаÑок на ÑÑеÑе на")]/@amount')->[0]->getNodeValue();
my $next_month_payment = $xp->findnodes('//bill[@description="СÑоимоÑÑÑ ÑÑлÑг в ÑледÑÑÑем календаÑном меÑÑÑе"]/@amount')->[0]->getNodeValue();
my $parsed_account_info = {
balance => $balance,
next_month_payment => $next_month_payment,
};
return $parsed_account_info;
}
sub _get_auth_response {
my ($self, $browser) = @_;
my $url = $self->{site} . "/user/login.xml";
my $request = POST($url,
Content => [
login => $self->{login},
password => $self->{password},
]
);
my $response = $browser->request($request);
$self->_check_response($response);
return $response;
}
sub _get_data_response {
my ($self, $browser) = @_;
# To get from Akado site data in xml format we need to add cookie render
# with the value 'xml'
$browser->{cookie_jar}->set_cookie(
0, # version
'render', # key
'xml', # value
'/', # $path
$self->_get_domain_from_cookies($browser->{cookie_jar}), # domain
);
my $url = $self->{site} . "/finance/display.xml";
my $request = HTTP::Request->new(
'GET',
$url,
);
( run in 3.615 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )