Работаем с мегафоном через PhantomJS (часть 1)

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

  • 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’е.

4 thoughts on “Работаем с мегафоном через PhantomJS (часть 1)

  1. @Lws: Да, вполне. С network sign-on’ом просто засада, поймать его очень проблематично для отладки.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.