Скрипты опроса баланса для интернет-провайдеров Onlime и Netbynet

Настройка графического интерфейса, Иксов, десктопов, оконных менеджеров и иксовых терминалов

Модератор: Модераторы разделов

Ответить
Aliech
Сообщения: 952
Статус: дилетант широкого профиля
ОС: Gentoo arm64 musl hardened
Контактная информация:

Скрипты опроса баланса для интернет-провайдеров Onlime и Netbynet

Сообщение Aliech »

Всё это нужно для того, чтобы научить Conky показывать текущий баланс на рабочем столе.

Собственно для Нетбайнета (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:~$ 
Для Онлайма (Onlime, Ростелеком):

Код: Выделить всё

#!/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:~$ 
Всё написано на perl'е, для работы нужны модули, из исходников вполне понятно, какие именно. Если кому интересно, как и зачем это всё делалось: https://aliech.ru/2018/03/%d1%81%d0%ba% ... d1%8f-net/

Очень было бы не плохо, если тему пополнили бы наработками для других провайдеров. Коньки и прочие виджеты, используемые для мониторинга, должны радовать пользователей полезной информацией, доступной им в любой момент времени!
С уважением,
Павел Алиев
Спасибо сказали:
Ответить