Различия
Здесь показаны различия между двумя версиями данной страницы.
Следующая версия | Предыдущая версия | ||
wiki:скрипт_для_проверки_баланса_в_peoplenet [2011/09/27 21:43] создано |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Скрипт для проверки баланса в ====== | ||
- | {{ :wiki:peoplenet.png|PeopleNet}} В данной статье рассматривается процесс создания скрипта для проверки баланса украинского мобильного оператора PeopleNet, который обычно используется для мобильного доступа к 3G интернету. Целью статьи является популяризация написания скриптов для облегчения ежедневных задач. | ||
- | |||
- | Всё началось с вопроса моего друга. «Нельзя ли что-нибудь сделать с теперешним подсчетом трафика в PeopleNet? Ведь что-то же считает!» Я сразу же стал теоретизировать, что таки да, можно… И через пару ночей я засел за работу и родился скрипт, которым я хочу поделиться с вами. | ||
- | Нужно ввести читателя в курс дел. | ||
- | |||
- | В популярном пакете «777» от PeopleNet предоставляется ежедневно трафик размером 232 МБ (как бы 7 ГБ в месяц и как бы за 77 грн). Узнать остаток доступного трафика на текущие сутки можно, отправив с 3G модема SMS на служебный номер и прочитав ответ (при помощи «фирменной» программы для Windows. Отправлять SMS в Linux, с 3G модемов как-то еще не очень получается. | ||
- | Кроме того, существует страничка биллинга, называемая Системой самообслуживания клиентов. Раньше я уже писал скрипт для подобных целей. Но раньше было проще. Можно было получить информацию о потраченном трафике за каждую сессию за каждый день в течение последнего месяца. Теперь же на странице красовалось одно число — количество потраченных МБ с начала месяца. С тех пор сёрфинг в сети велся практически вслепую… | ||
- | |||
- | Я почти полностью переписал скрипт, избавился от множества промежуточных шагов, временных переменных и файлов, и это пошло скрипту только на пользу. Его основу составляет одна «волшебная» строчка кода, которая получает со страницы самообслуживания число потраченных с начала месяца мегабайт: | ||
- | |||
- | <code bash>curl -s -d "X_Username=380921234567&X_Password=11223344" --url "http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO/?sid=bills&rp="$(expr \( $(date +%y) - 2 \) \* 12 + $(date +%m)) | grep -A 3 EVDO | tail -n 1 | grep -o '[0-9]*'</code> | ||
- | или в с переносом строки | ||
- | <code bash>curl -s -d "X_Username=380921234567&X_Password=11223344" \ | ||
- | --url "http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO/?sid=bills&rp="$(expr \( $(date +%y) - 2 \) \* 12 + $(date +%m)) | \ | ||
- | grep -A 3 EVDO | tail -n 1 | grep -o '[0-9]*'</code> | ||
- | |||
- | Здесь используется **curl** — удобная программа, которую можно в шутку назвать «веб-браузер для робота». Ее можно вызывать из своих скриптов для отсылки запросов, форм, получения и отправки страниц и файлов. Для того, чтобы получить информацию по своему номеру, вы должны изменить **380921234567** на свой номер, а **11223344** — на свой пароль для входа на страницу самообслуживания. В процессе работы будет загружена страничка размером 11,5 кБ и из нее будет выделено единственное число, которое вы и получите «на выходе». О том, что делать дальше с этим числом, мы поговорим немного позже. | ||
- | |||
- | ===== Как работает этот код ===== | ||
- | |||
- | Обо всех опциях команды curl вы сможете узнать, если выполните в терминале команду | ||
- | <code>curl --help</code> | ||
- | Такой подход к получению справки типичен для большинства команд в Linux. | ||
- | Здесь мы используем такие ключи: | ||
- | * -s — «молчаливый» режим. Curl не будет печатать в терминале не нужную нам информацию о размере и скорости закачки указанной страницы; | ||
- | * -d и следующая строка в кавычках — данные, отсылаемые на сервер по методу POST; | ||
- | * --url и длинная строка, заканчивающаяся перед вертикальной чертой — адрес страницы, которую нужно получить. Сам ключ «--url» можно было бы и не писать, оставив только строку. Вертикальная черта передает страничку, загруженную командой curl, дальше, следующей команде, по конвейеру. | ||
- | |||
- | Откуда взялись параметры для ключей **-d** и **--url**? | ||
- | Проследим работу системы самообслуживания. Зайдем при помощи обычного браузера на страницу http://my.people.net.ua/. Нас просят ввести номер телефона и пароль, затем нажать кнопку подтверждения. Далее нужно перейти по ссылке //«Ежемесячный счет»//. На следующей странице выбрать нужный месяц из выпадающего списка (текущий месяц находится вверху и поэтому выбирать ничего не нужно) и нажать кнопку подтверждения. На следующей странице нужно пробежаться глазами по таблице и найти в строчке //«Передача даних EVDO»// нужное нам число. Теперь научим робота делать то же самое. | ||
- | Для исследования страниц нам пригодится ключ **-o** команды curl. После этого ключа указываем название файла и страничка, указанная в ключе **--url** будет загружена в этот файл. | ||
- | |||
- | Итак, первый шаг: | ||
- | |||
- | <code bash>curl --url "http://my.people.net.ua/" -o "take1.html"</code> | ||
- | Открываем полученный файл **take1.html** в текстовом редакторе (нужно хотя бы немного разбираться в html-разметке). Мы видим html-форму: | ||
- | <file> | ||
- | <form target="_top" action="/TSU/WWW/ACCOUNT_INFO/" method="post" | ||
- | name="LoginForm"> | ||
- | ... | ||
- | <input value="" name="X_Username" size="9" title="Введіть номер Вашого | ||
- | телефону" type="text"> | ||
- | ... | ||
- | <input name="X_Password" size="9" title="Введіть Ваш пароль" type="password"> | ||
- | ... | ||
- | <input value="Вхід" type="submit"> | ||
- | ... | ||
- | </form> | ||
- | </file> | ||
- | Я удалил всё, не относящееся к делу, чтобы можно было сосредоточиться на нашем задании. Итак, данные формы отправляются методом POST, значит, воспользуемся ключом -d команды curl. Вот, если бы метод был GET, то можно было бы не городить огород, а дописать передаваемые данные прямо в строку адреса (примерно так: [[http://наш.длинный/адрес?параметр1=значение1&параметр2=значение2]]). | ||
- | |||
- | Итак, из анализа формы становится понятно, что при нажатии кнопки подтверждения данные формы отсылаются по адресу http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO/ и эти данные — **X_Username=номер телефона** и **X_Password=пароль**. | ||
- | |||
- | Второй шаг наших раскопок: | ||
- | <code bash>curl -d "X_Username=380921234567&X_Password=11223344" --url "http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO/" -o "take2.html"</code> | ||
- | |||
- | Просмотрев загруженную страничку, мы видим, что да, нас успешно пустили в систему самообслуживания. Теперь нас интересует ссылка: | ||
- | <file><a href="http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO?sid=bills">Ежемесячный счет</a></file> | ||
- | Я снова убрал всё лишнее. Попробуем: | ||
- | <code bash>curl --url "http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO?sid=bills" -o "take3.html"</code> | ||
- | Получаем страничку с ошибкой. Хм, попробуем так: | ||
- | <code bash>curl --url "http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO/?sid=bills" -o "take3.html"</code> | ||
- | Теперь получаем первоначальную страничку для входа в систему самообслуживания. Нас забыли и снова предлагают ввести номер и пароль! Попробуем не городить огород, а просто объединим две команды, два адреса в один: | ||
- | curl -d "X_Username=380921234567&X_Password=11223344" --url "http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO/?sid=bills" -o "take3a.html" | ||
- | Так! Мы продвинулись дальше! Просматривая страницу, находим в ней форму для выбора месяца: | ||
- | <file><form action="http://my.people.net.ua/TSU/WWW/ACCOUNT_INFO" method="GET"> | ||
- | <input type="hidden" name="sid" value="bills"> | ||
- | <select name="rp"> | ||
- | <option value="117" selected>вересень 2011 року</option> | ||
- | <option value="116">серпень 2011 року</option> | ||
- | <option value="115">липень 2011 року</option> | ||
- | <option value="114">червень 2011 року</option> | ||
- | <option value="113">травень 2011 року</option> | ||
- | <option value="112">квітень 2011 року</option> | ||
- | <option value="111">березень 2011 року</option> | ||
- | <option value="110">лютий 2011 року</option> | ||
- | <option value="109">січень 2011 року</option> | ||
- | <option value="108">грудень 2010 року</option> | ||
- | <option value="107">листопад 2010 року</option> | ||
- | </select> | ||
- | <input type="submit" value="Показати"> | ||
- | </form> | ||
- | </file> |