Многие пользователи 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 (#)