07 октября 2011

PeopleNet. Дубль 3

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

С 1.10.2011 г в Системе самообслуживания PeopleNet снова стала доступна детализация трафика. Поэтому сегодня мы напишем новый скрипт для проверки остатков, лишенный недостатков предыдущего…

На удивление, новая система получилась даже удобнее предыдущей. Правда, теперь трафик считается не в байтах, а сразу в мегабайтах; до них же (в бóльшую сторону) и округляется. Зато, теперь доступна статистика как в целом за день, так и по отдельным сессиям.

Так как статистика теперь хранится централизованно, то мы можем теперь получить ее из любой операционной системы, из любого браузера, хоть даже с мобилки. Теперь не нужно хранить у себя какие-то промежуточные данные.

 

Стоит также отметить особенности работы системы. Информация на странице обновляется асинхронно, спустя некоторое время по завершении сессии. Время это может достигать 10–20 минут. Это значит, во-первых, что, для того, чтобы получить текущее состояние, вам нужно подождать неопределенное время после завершения сессии. Во-вторых, в течении самой сессии информация не обновляется — если система говорит, что осталось, к примеру, 100 МБ, а ваш системный счетчик говорит, что за эту, текущую, сессию вы потратили уже 80 МБ, то фактически осталось, конечно же, всего 20 МБ.

Деньги за новый день списываются со счета не сразу после полуночи, и даже не спустя 10–20 минут, а поздно ночью. Этот момент мне никогда не удавалось зафиксировать, но это происходит примерно в 3 часа ночи. То есть, имея даже недостаточное количество денег на счету (но не долг), можно несколько часов еще пользоваться интернетом. А информация, через сколько дней нужно пополняться, является недостоверной примерно с полуночи и до трех часов ночи.

И еще, не удивляйтесь, что вы «только зашли проверить трафик и вышли», а с вас списался 1 МБ трафика — теперь система округляет трафик сессии до 1 МБ в бóльшую сторону. Поэтому, чем меньше раз вы разъединяетесь и соединяетесь, тем меньше лишних трат, но тем больше вы будете находиться в неведении относительно текущего состояния.

 

Итак, приступим к разработке скрипта, уже имея предыдущий опыт.

Зайдя самостоятельно через браузер в Систему, узнаём, что детализация находится по адресу http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO/?sid=details. Сначала загрузим страничку, чтобы убедиться, что наши методы продолжают работать:

curl -d "X_Username=380921234567&X_Password=11223344" \
  --url "http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO/?sid=details" \
  -o "take1.html"

Не забудьте подставить свой номер телефона и пароль. Теперь исследуем содержимое загруженной странички в файле take1.html. Нас интересует вот что:

Нам нужен трафик, сгруппированный по дням. Строим запрос по методу GET:

http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO/?sid=details&rp=118&grp=on

Откуда взялось число 118, мы уже знаем. Подставляем этот адрес и загружаем следующую страничку:

curl -d "X_Username=380921234567&X_Password=11223344" \
  --url "http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO/?sid=details&rp=118&grp=on" \
  -o "take2.html"

Открываем страницу. Там есть интересующая нас таблица:

Ищем текущую дату (в формате ДД.ММ.ГГГГ), из второй (за найденной) строки берём число. Заодно, позаботимся об обработке ошибок:

Теперь научимся получать трафик за текущую сессию из системного счетчика. Информация по всем сетевым интерфейсам меняется в режиме реального времени в системном «файле» /proc/net/dev. Вот моментальный снимок моего файла:

cat /proc/net/dev

Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
    lo:  203724    2586    0    0    0     0          0         0   203724    2586    0    0    0     0       0          0
  eth0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
  ppp0: 68446969   50198   49    0    0     0          0         0  2898400   35608    0    0    0     0       0          0
 wlan0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0

Я предполагаю, что вы тоже используете интерфейс ppp0. Это верно в том случае, если у вас одновременно НЕ подключен еще один какой-нибудь беспроводный модем (например, мобилка), иначе, может быть как ppp0, так и ppp1 (в зависимости от того, в какой последовательности включались эти модемы). А, если ваш модем вдруг втыкается не в разъем USB, а в разъем Ethernet (сетевая карта), интерфейс будет не ppp0, а eth0.

Итак, читаем моментальное состояние; выбираем строку с ppp0; складываем вместе первое (количество принятых байт) и девятое (отправленных) числа; дважды делим на 1024 и прибавляем 1 (как бы округляем вверх).

Как получать и обрабатывать количество денег на счету, мы научились в прошлый раз.

 

Раз не осталось больше никаких белых пятен, я приведу полную версию скрипта. Она подойдет и для тех, кто внимательно прочитал статью до этого места и для тех, кто бегло ее пробежал в поисках готового решения. ☺

Необходимо отметить, что при первом подключении к интернету за сутки, в Системе самообслуживания еще не будет информации за эти сутки и, поэтому, вы получите сообщение, похожее на это:

При последующих сессиях вы можете получить полную информацию:

Напоследок хочу отметить, что исходники этого поста находятся на pastebin.com и теперь вы можете не только видеть красиво раскрашенный код, но и загрузить себе эти исходники, щелкнув по ссылке «Download Raw» вверху листинга. Код самого поста рассчитан на работу как со включенными у вас скриптами, так и без них. Но, всё же, пост выглядит лучше при включенных скриптах.

P.S.

В ходе опробования новинки на моем блоге — движка pastebin.com, выяснилась неприятная неожиданность. Скрипты хостятся и раскрашиваются нормально, но после скачивания не работают. Консолька ругается следующим образом:

bash: ./PeopleNet3.sh: /bin/bash^M: плохой интерпретатор: Нет такого файла или каталога

Всё дело в том, что в загруженном скрипте используются окончания строк, как в Windows (CR+LF), а для работы в среде Linux нужны окончания строк, как в Unix (LF). Именно на «лишний» символ CR и ругается терминал, этот символ отображается как ^M. Этот символ «прилип» к определению интерпретатора в «ша-банге». Можно открыть загруженный скрипт в текстовом редакторе, изменить окончание строк и пересохранить, но…

Я предлагаю вам просто скачать финальный скрипт с моего хранилища на MediaFire. После скачивания установите разрешение на запуск, отредактируйте в скрипте номер телефона и пароль и — вперед…

0 коммент.:

Отправить комментарий