Итак, валяется у меня на даче на чердаке модем, который подцеплен к серверу, и через который ко мне идут интернеты. И через интернеты я иногда заглядываю как там и что без меня происходит. И все бы хорошо, но иногда хочется узнать, сколько осталось там траффика.
Вариантов тут было несколько.
- USSD запрос до провайдера.
Чревато занятиями любовью с /dev/ttyUSB* для отправки USSD и парсингом ответа с последующим вырезанием рекламы. Но так как один такой порт у меня оккупировал gammu-smsd, а на другом висит самописная приблуда для мониторинга качества соединения и переключения на 2g, в случае если вышка 3g “упадет”… (почему не доверяю переключаться самостоятельно модему – это отдельная история). В обещем, вкрячивать в эту штуку что-то еще мне ой как не хочется.
Да и, как выяснилось, во время отправки USSD иногда мой хуавей рвет соединение. Отпадает. - Отправлять SMS и парсить ответ.
C gammu-smsd это можно было бы сделать досточно быстро, да вот в силу неизбежной необходимости работать со страницей мегафона, этот вариант отпал. - Доступ для автоматизированных систем (который проскакивал в некоторых софтинах, типа BalanceRobot под андройд). Да вот только после 10 минут гуглежа документации по нему так и не нашлось.
- Забирать http://user.moscow.megafon.ru и парсить содержимое.
Последнее показалось мне наиболее вменяемой затеей. У мегафона есть такая волшебная страничка, заходя на которую, мы получаем без авторизации всю информацию, так нужную нам. Заходить ясен пень надо через мегафоновский интернет, иначе фокус не сработает. И парсить страничку нужда назревала, ибо мегафон любит выдавать жесткую подставу, с которой я только планирую разбираться: За пару дней до конца расчетного периода, даже если на счете валяются заранее заброшенная денюжка, мегафон при заходе на любой вебсайт делает редирект к себе и выдает страничку из серии “А знаете, что я завтра спишу у вас абонентку?”. И можно было бы отделаться легким раздражением, если ты блондинка, и сидишь в парке во вконтактике с iPAD’а.
Но вот если через этот канал в интернет смотрит некоторая автоматика, а-ля умный дом, на состояние которой я периодически посматриваю? В общем, отсутствие соединения способно доставить неприятностей. Особенно когда сам километров за 50 от дачи. И использовать лишний раз SMS на радость оператору я почему-то совершенно не хочу.
Итак, в чем проблема? Если мегафону приспичило что-то довести до сознания абонента, то интернет не подключается, покуда жертва не нажмет на веб страничке на огромадную кнопку “перейти в интернет”. Но вот, что делать, если рядом только тупые железяки? При этом любой http запрос будет переправляться на эту самую страницу, а соединения на другие порты тупо не пройдут. Ну прямо какое-то неуважение к роботам, чесслово!
Идеи?
Вот тут я и вспомнил про одну такую хорошую штуку как PhantomJS. Это полноценный webkit, разве что без окошка браузера и не тянущий за собой иксы, который полноценно исполняет весь жабаскрипт, и позволяет опять таки жабаскриптом с этими страницами взаимодействовать.
Собственно, не долго думая, я сел и быстро родил нижеседующий быдлокод:
/* print the value */ function p(k,d) { console.log(k+":"+d); } function p_nospan(k,d) { d=d.split(""); p(k,d[1]); } fields = [ ["td.traffic", "Траффика было", p], ["td.traffic-by", "Траффика осталось", p], ["p.phone", "Номер телефона", p_nospan], ["p.balance", "Денег на счете", p_nospan], ]; function check_balance_megafon(url) { var page = require('webpage').create(); page.open(url, function (status) { if (status === 'fail') { console.log('failed to get page: ' + url); } else { for (j=0;j<fields.length;j++) { k = fields[j][0]; d = fields[j][1]; v = page.evaluate(function (key) { return document.querySelector(key).innerHTML; },k); if (null != fields[j][2]) fields[j][2](d,v) } } page.close(); phantom.exit(0); }); } check_balance_megafon('http://user.moscow.megafon.ru'); |
Сохраняем как balance.js, запускаем phantomjs balance.js и вуоля!
Прелесть решения в том, что интересующие кусочки для QuerySelector ищутся в две секунды мышкой при помощи инструмента Firefox “Web Developer -> Inspect”, даже если дизайн охрененно навороченный. И даже если мегафону приспичит серьезно сменить дизайн, обновить подобный скрипт будет очень просто и быстро. Намного проще, чем разбираться в особой уличной магии переданной sed/awk в виде аргумента в три часа ночи год с хреном назад.
Так что теперь я с нетерпением жду конца расчетного периода, чтобы оттестить фантом на network sign-on’е.
вставка кода глючит
for (j=0;j<fields.length;j++) {
Thnx! починил.
Ну как скрипт норм, оправдал себя?
@Lws: Да, вполне. С network sign-on’ом просто засада, поймать его очень проблематично для отладки.