Многие пользователи Linux используют системный монитор Conky для отображения различной информации непосредственно на рабочем столе своего компьютера. Обычно отображают свободное место на диске, загрузку процессора, занятую память и прочие системные параметры. Однако Conky позволяет показывать вообще любые данные и далее будет показано как можно добавить информацию о балансе своего мобильного телефона.
Для начала немного теории: информацию о балансе мобильного телефона можно получить либо USSD-запросом с телефона, либо посмотреть в личном кабинете у своего оператора связи. Понятно что первый способ не годится так как телефон не может быть постоянно подключен к компьютеру, в этом плане второй способ чуть проще, однако он требует навыков программирования, так как фактически требуется написать парсер, который будет авторизовываться в личном кабинете и извлекать оттуда данные о балансе.
В распоряжении автора этих строк оказались в общей сложности три SIM-карты разных операторов: Казанского Билайна, НСС-Волга (филиал в републике Татарстан) и Татарстанского филиала МТС. Для всех трёх операторов успешно были написаны скрипты, которые позволили получать баланс из личных кабинетов для последующего отображения в Conky.
Прежде чем приступим к описанию скриптов отметим один важный момент: Conky обновляет данные раз в несколько секунд и если с такой частотой выполнять обращение к личному кабинету оператора - легко можно получить блокировку по IP, чтобы этого не случилось баланс мы будем запрашивать раз в час и сохранять в файле (кэшировать), а в Conky показывать баланс, считанный из локального файла-кэша.
Первый скрипт предназначен для работы с мобильным оператором Билайн и получает данные из его личного кабинета по адресу uslugi.beeline.ru:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use LWP::UserAgent;
# Базовые настройки кскрипта
my $server_user = '9600111111';
my $server_pass = 'y0us3cr3tp4ssw0rd';
my $rv = 'Unknown';
# Если что-то пойдёт не так мы сможем сами обработать ошибку
eval {
# Создаём объект, с которым будем работать дальше
my $ua = LWP::UserAgent->new(
agent => 'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.237 Safari/534.10',
);
# Инициализируем куки
$ua->cookie_jar( {} );
# Выполняем первый запрос (страница авторизации)
my $response = $ua->get('https://uslugi.beeline.ru/');
# Сохраняем полученные куки
$ua->cookie_jar->extract_cookies($response);
# Запоминаем реферер
$ua->default_header(Referer => 'https://uslugi.beeline.ru/');
# Второй запрос - авторизация
$response = $ua->post(
'https://uslugi.beeline.ru/loginPage.do',
{
userName => $server_user,
password => $server_pass,
ecareAction => 'login',
}
);
# Снова сохраняем куки
$ua->cookie_jar->extract_cookies($response);
# Запоминаем реферер
$ua->default_header(Referer => 'https://uslugi.beeline.ru/loginPage.do');
# Получаем индексную страницу личного кабинета
$response = $ua->get('https://uslugi.beeline.ru/navigateMenu.do');
# И опять сохраняем куки
$ua->cookie_jar->extract_cookies($response);
# Переопределяем реферер
$ua->default_header(Referer => 'https://uslugi.beeline.ru/navigateMenu.do');
# Получаем содержимое фрейма с информацией о балансе
$response = $ua->get('https://uslugi.beeline.ru/vip/prepaid/refreshedPrepaidBalance.jsp');
# Извлекаем данные о балансе
if ($response->content =~ m{<td class="tabred">\s+(\d+?(?:,\d+?)?) }ism) {
$rv = $1;
$rv =~ s/,/./;
}
};
# Если что-то пошло не так
if (my $error = $@) {
# Желающие могут дописать обработку ошибок
}
print "$rv\n";
Сохраним скрипт как ~/scripts/balance_beeline.pl. После запуска этот скрипт напечатает на stdout баланс нашего телефона или UNKNOWN в случае какого-то сбоя.
Второй скрипт для получения информации из iSERVE НСС:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use LWP::UserAgent;
# Базовые настройки кскрипта
my $iserve_user = '9503123456';
my $iserve_pass = 'y0us3cr3tp4ssw0rd';
my $rv = 'Unknown';
# Если что-то пойдёт не так мы сможем сами обработать ошибку
eval {
# Создаём объект, с которым будем работать дальше
my $ua = LWP::UserAgent->new(
agent => 'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.237 Safari/534.10',
);
# Инициализируем куки
$ua->cookie_jar( {} );
# Выполняем первый запрос (страница авторизации)
my $response = $ua->get('https://iserve.ncc-volga.ru/?path=logon');
# Сохраняем полученные куки
$ua->cookie_jar->extract_cookies($response);
# Запоминаем реферер
$ua->default_header(Referer => 'https://iserve.ncc-volga.ru/?path=logon');
# Второй запрос - авторизация
$response = $ua->post(
'https://iserve.ncc-volga.ru/?path=iserv',
{
userv => $iserve_user,
passv => $iserve_pass,
}
);
# Снова сохраняем куки
$ua->cookie_jar->extract_cookies($response);
# Запоминаем реферер
$ua->default_header(Referer => 'https://iserve.ncc-volga.ru/?path=iserv');
# Третий запрос - собственно страница с информацией
$response = $ua->get('https://iserve.ncc-volga.ru/?path=sms');
# Извлекаем данные о балансе
if ($response->content =~ m{<input type="hidden" name="balance" id="balance" value="(\d+?(?:\.\d+?)?)">}) {
$rv = $1;
}
};
# Если что-то пошло не так
if (my $error = $@) {
# Желающие могут дописать обработку ошибок
}
print "$rv\n";
Сохраним его как ~/scripts/balance_ncc-volga.pl. Работает он аналогично скрипту для Билайн.
При написании скрипта для парсинга Интернет-помошника МТС возникли некоторые трудности, связанные с достаточно хитрой защитой от парсинга, но оказалось что Мобильная версия Интернет-Помощника такой защиты не содержит и было решено парсить её. Вот готовый скрипт:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use LWP::UserAgent;
# Базовые настройки кскрипта
my $server_user = '9172345678';
my $server_pass = 'y0us3cr3tp4ssw0rd';
my $rv = 'Unknown';
# Если что-то пойдёт не так мы сможем сами обработать ошибку
eval {
# Создаём объект, с которым будем работать дальше
my $ua = LWP::UserAgent->new(
agent => 'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.237 Safari/534.10',
);
# Инициализируем куки
$ua->cookie_jar( {} );
# Выполняем первый запрос (страница авторизации)
my $response = $ua->get('https://ihelper.nnov.mts.ru/SelfCarePda/Security.mvc/LogOn?returnLink=https://ihelper.nnov.mts.ru/SelfCarePda/Home.mvc');
# Сохраняем полученные куки
$ua->cookie_jar->extract_cookies($response);
# Запоминаем реферер
$ua->default_header(Referer => 'https://ihelper.nnov.mts.ru/SelfCarePda/Security.mvc/LogOn?returnLink=https://ihelper.nnov.mts.ru/SelfCarePda/Home.mvc');
# Второй запрос - авторизация
$response = $ua->post(
'https://ihelper.nnov.mts.ru/SelfCarePda/Security.mvc/LogOn?returnLink=https%3A%2F%2Fihelper.nnov.mts.ru%2FSelfCarePda%2FHome.mvc',
{
username => $server_user,
password => $server_pass,
}
);
# Снова сохраняем куки
$ua->cookie_jar->extract_cookies($response);
# Запоминаем реферер
$ua->default_header(Referer => 'https://ihelper.nnov.mts.ru/SelfCarePda/Security.mvc/LogOn?returnLink=https%3A%2F%2Fihelper.nnov.mts.ru%2FSelfCarePda%2FHome.mvc');
# Третий запрос - собственно страница с информацией
$response = $ua->get('https://ihelper.nnov.mts.ru/SelfCarePda/Home.mvc');
# Извлекаем данные о балансе
if ($response->content =~ m{<strong><strong>(\d+?(?:\.\d+?)?)</strong>}) {
$rv = $1;
}
};
# Если что-то пошло не так
if (my $error = $@) {
# Желающие могут дописать обработку ошибок
}
print "$rv\n";
Сохраним скрипт как ~/scripts/balance_mts.pl. Работает он аналогично предыдущим двум.
Теперь надо организовать взаимодействие этих скриптов и Conky. Для этого нужно выполнить команду:
crontab -e
И добавить в свой crontab примерно вот такие строки:
# Получение баланса НСС и сохранение его в кэше 15 * * * * /home/moose/scripts/balance_ncc-volga.pl > /home/moose/.balance_ncc-volga # Получение баланса Билайн и сохранение его в кэше 17 * * * * /home/moose/scripts/balance_beeline.pl > /home/moose/.balance_beeline # Получение баланса МТС и сохранение его в кэше 19 * * * * /home/moose/scripts/balance_mts.pl > /home/moose/.balance_mts
Пути к скриптам и файлам кэша, разумеется, надо вписать свои. После этого каждый час будут обновляться три локальных файла кэша, из которых можно считывать текущий баланс наших телефонов.
Для использования этих данных в Conky нужно добавить в конце файла ~/.conkyrc примерно вот такие строки (тут можно дать волю фантазии, чтобы все эти данные как можно лучше вписались именно в ваш конфиг):
$hr
Balance NCC-Volga: ${exec /bin/cat /home/moose/.balance_ncc-volga}
Balance Beeline: ${exec /bin/cat /home/moose/.balance_beeline}
Balance MTS: ${exec /bin/cat /home/moose/.balance_mts}
У автора этих строк результат выглядит примерно вот так:

Если у вас другой оператор и/или другой регион - скрипты придётся править под ваши условия. Здесь показана только основная идея.
На этом всё. Приятной вам работы!

Anonymous 2011-01-29 19:24:39 (#)