Собственно для Нетбайнета (Netbynet, WIFIRE):
Код: Выделить всё
#!/usr/bin/perl
###########################################################
# Простой скрипт для опроса баланса из личного кабинета
# интернет-провайдера Netbybet (нынче WIFIRE).
# Написан Павлом Алиевым (aliech@aliech.ru).
# Powered by perl!
###########################################################
use strict;
use warnings;
use utf8;
use HTTP::Request;
use HTTP::Cookies;
use LWP::UserAgent;
use JSON::PP;
use DateTime::Format::RFC3339;
use DateTime::TimeZone;
# Данные для аутентфиикации, нужно подправить под себя!
my %auth_data = (
'accountNumber' => "", # номер счёта
'password' => "", # пароль
'captchaCode' => "" # они хотели капчу прикрутить?!
);
# Ну мы будем что-то выводить в utf8 же
binmode(STDOUT, ":utf8");
# Создаём объекты и общие структуры данных
my $cookies = HTTP::Cookies->new();
my $lwp = LWP::UserAgent->new();
$lwp->cookie_jar($cookies);
my $request;
my $response;
# Запрос аутентифкации
$request = HTTP::Request->new('POST', "https://my.netbynet.ru/api/v2/login");
$request->header('Content-Type' => "application/json");
$request->content(encode_json(\%auth_data));
$response = $lwp->request($request);
die("Ошибка запроса аутентификации: " . $response->status_line() . "\n") unless($response->is_success());
# Запрашиваем текущий баланс
$request = HTTP::Request->new('GET', "https://my.netbynet.ru/api/v1/get-balance");
$response = $lwp->request($request);
die("Ошибка запроса текущего баланса: " . $response->status_line() . "\n") unless($response->is_success());
my $current_balance = decode_json($response->content());
# Запрашиваем детали по балансу
$request = HTTP::Request->new('GET', "https://my.netbynet.ru/api/v1/get-balance-details");
$response = $lwp->request($request);
die("Ошибка запроса деталей по балансу: " . $response->status_line() . "\n") unless($response->is_success());
my $balance_details = decode_json($response->content());
# Так как время нам отдали в чём-то типа RFC 3339, в какой-то там временной зоне (UTC?),
# его, время то есть, надо перевести в что-то человекопонятное.
my $rfc3339 = DateTime::Format::RFC3339->new();
my $tz_obj = DateTime::TimeZone->new(name => 'local');
my $time_obj = $rfc3339->parse_datetime($balance_details->{'nextPaymentDate'});
$time_obj->set_time_zone($tz_obj->name()); # меняем пояс
# Вывод информации
printf(
"Состояние: %s, %sр / %sр (до %s %s)\n",
$current_balance->{'statusName'},
$current_balance->{'accountBalance'},
$balance_details->{'subscriptionFee'},
$time_obj->dmy('.'),
$time_obj->hms()
);
exit(0);
Код: Выделить всё
aliech@arcturus:~$ ./netbynet_accounts.pl
Состояние: Активен, 66.2р / 399р (до 23.03.2018 03:00:00)
aliech@arcturus:~$
Код: Выделить всё
#!/usr/bin/perl
###########################################################
# Простой скрипт для опроса баланса из личного кабинета
# интернет-провайдера Onlime.
# Написан Павлом Алиевым (aliech@aliech.ru).
# Powered by perl!
###########################################################
use strict;
use warnings;
use utf8;
use HTTP::Request;
use HTTP::Request::Common;
use HTTP::Cookies;
use LWP::UserAgent;
use JSON::PP;
# Данные для аутентфиикации, нужно подправить под себя!
my %auth_data = (
'login_credentials[login]' => "", # номер счёта
'login_credentials[password]' => "", # пароль
);
# Ну мы будем что-то выводить в utf8 же
binmode(STDOUT, ":utf8");
# Создаём объекты и общие структуры данных
my $cookies = HTTP::Cookies->new();
my $lwp = LWP::UserAgent->new();
push(@{$lwp->requests_redirectable}, 'POST'); # после отправки POST'а, они нас перенаправляют! ЗАЧЕМ?!
$lwp->cookie_jar($cookies);
my $request;
my $response;
# Запрос аутентифкации
$request = HTTP::Request::Common::POST("https://my.onlime.ru/session/login", \%auth_data);
$request->header('Referer' => "https://my.onlime.ru/");
$response = $lwp->request($request);
die("Ошибка запроса аутентификации: " . $response->status_line() . "\n") unless($response->is_success());
# Так, короче, чтобы ниже ходить в JSON, нужны значения, присвоенные во время авторизации.
# Но отдали они нам не в куках, а в теле страницы, которая прилетела после перенаправления.
# И нам эту хрень надо регулярным выражением забрать из тела ответа. Бред.
# Кстати, его потом придётся в заголовки подставлять. Как там в анекдоте? "П#$расы, сэр!"
my $json_secret;
if($response->decoded_content() =~ /var\swtf\s=\s'([0-9a-z]+)',/) {
$json_secret = $1;
}
else {
die("Не удалось вычленить важную информацию из тела ответа на запрос аутентификации!\n");
}
# Запрос /json/cabinet/ (ну я хз, как это назвать)
$request = HTTP::Request->new('GET', "https://my.onlime.ru/json/cabinet/");
$request->header('X-Requested-With' => "XMLHttpRequest");
$request->header('X-Wtf' => $json_secret);
$request->header('X-Request' => "JSON");
$request->header('Referer' => "https://my.onlime.ru/");
$response = $lwp->request($request);
die("Ошибка запроса /json/cabinet/: " . $response->status_line() . "\n") unless($response->is_success());
my $cabinet = decode_json($response->content());
# Запрос /json/getcontract/ - страшный список всех тарифов и того, что сейчас используется.
$request = HTTP::Request->new('GET', "https://my.onlime.ru/json/getcontract/");
$request->header('X-Requested-With' => "XMLHttpRequest");
$request->header('X-Wtf' => $json_secret);
$request->header('X-Request' => "JSON");
$request->header('Referer' => "https://my.onlime.ru/services/");
$response = $lwp->request($request);
die("Ошибка запроса /json/getcontract/: " . $response->status_line() . "\n") unless($response->is_success());
my $contract = decode_json($response->content());
# Так как они не отдают стоимость услуг за месяц, выдавая полный список доступных,
# придётся всё это обойти и посчитать. Я использую только "Домашний интернет",
# так что обход всего остального сами допишите, если что. Я всё объяснил)
my $month_paid = 0;
my $current_plan = $contract->{'configuration'}->{'internet'}->{'rateplan'}->{'code'};
die("Не удалось получить имя используемого тарифного плана!\n") unless(defined($current_plan));
foreach my $plan (@{$contract->{'catalogue'}->{'rateplans'}->{'INET'}}) {
if($plan->{'code'} eq $current_plan) {
$month_paid = $plan->{'price'};
}
}
# Вывод информации
printf(
"Состояние: %s, %sр / %sр (дней до блокировки: %s)\n",
$cabinet->{'bstatus'},
$cabinet->{'balance'},
$month_paid,
$cabinet->{'lock'}
);
exit(0);
Код: Выделить всё
aliech@arcturus:~$ ./onlime_accounts.pl
Состояние: Active, 52.54р / 520р (дней до блокировки: 4)
aliech@arcturus:~$
Очень было бы не плохо, если тему пополнили бы наработками для других провайдеров. Коньки и прочие виджеты, используемые для мониторинга, должны радовать пользователей полезной информацией, доступной им в любой момент времени!