Итак, валяется у меня на даче на чердаке модем, который подцеплен к серверу, и через который ко мне идут интернеты. И через интернеты я иногда заглядываю как там и что без меня происходит. И все бы хорошо, но иногда хочется узнать, сколько осталось там траффика.
Вариантов тут было несколько.
- 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
Сохраняем как balance.js, запускаем phantomjs balance.js и вуоля!
Прелесть решения в том, что интересующие кусочки для QuerySelector ищутся в две секунды мышкой при помощи инструмента Firefox "Web Developer -> Inspect", даже если дизайн охрененно навороченный. И даже если мегафону приспичит серьезно сменить дизайн, обновить подобный скрипт будет очень просто и быстро. Намного проще, чем разбираться в особой уличной магии переданной sed/awk в виде аргумента в три часа ночи год с хреном назад.
Так что теперь я с нетерпением жду конца расчетного периода, чтобы оттестить фантом на network sign-on'е.
Leave a Reply