Yota-script или экономим c Yota кроссплатформенно

    Доброго времени суток, уважаемые хабражители.
    Пару месяцев назад и до нашего города добралась цивилизация в виде Yota. После беглого осмотра личного кабинета и выяснения что тарификация работает с точностью до минуты появился автоматизационный зуд :) Тут еще подвернулся топик Экономим затраты на интернет от Yota и понеслась. Главная проблема которую я хотел решить — позволить управлять своим тарифом из командной строки (к примеру с помощью crontab) кроссплатформенно т.к. сам давно живу под Arch Linux в качестве основной операционной системы.

    Подбираем ингредиенты

    Имея некоторый опыт с различными фреймворками для тестирования web-страниц я было ринулся за привычный Selenium, но подумал что желательно бы обойтись чем-то попроще да поинтереснее. Захотелось попробовать что-то новое.
    Итак, нам нужен headless браузер с каким-никаким API. Кандидаты:

    Строго говоря первые два являются binding'ами nodejs для Selenium, но попробовать их стоило. В итоге прототип приложения был написан, но получилось слишком сложно и громоздко. Далее был опробован Zombie.JS, но увы что-то не заладилось после успешной авторизации — страница кабинета никак не хотела рендериться. В итоге выбор пал на PhantomJS.

    Алгоритм работы

    После небольшого анализа странички личного кабинета оказывается, что слайдер скорости устроен весьма просто. Открываем обширную документацию по PhantomJS, берем первый попавшийся пример и модифицируем под себя:
    • загружаем страничку входа
    • заполняем поля логин/пароль
    • кликаем кнопку входа и ждем пока произойдет авторизация
    • получаем список тарифов
    • ищем нужный тариф
    • сабмитим форму.

    В итоге получился скромный скрипт который уютно расположился вот тут https://github.com/linx56/yota-script.

    Возможности yota-script

    PhantomJS — кроссплатформенное программное обеспечение, поэтому работать предложенное решение должно везде, где он может запуститься.
    Вызов yota-script выглядит примерно так:
    phantomjs yota.js your_login your_password [command] [parameter]
    


    Доступные команды:

    check — команда по-умолчанию которую можно опустить, покажет текущие условия и остаток в днях
    switch — активирует тариф, обязательный параметр — скорость, один из результатов команды list
    list — список параметров для switch с описаниями
    Пример:
    phantomjs yota.js your_login your_password switch 5.0
    
    Переключит тариф на 5 Мбит/с

    Ограничения и известные проблемы

    Периодически отваливается по таймауту переключение тарифа. Баг неустойчивый, проходит сам по себе. Для отладки можно воспользоваться параметром --debug=yes. Думаю также не лишним будет предупредить, что действия производимые данным скриптом вполне легальны, однако в любой момент позиция компании Yota может измениться.

    Планы по развитию

    В настоящий момент этот скрипт просто работает по crontab т.к. у меня вполне предсказуемый график пользования интернетом. Однако нет предела совершенству и я подумываю написать простенький анализатор занимаемой полосы, дабы переключать скорость исходя из потребности в ней. Предложения и комментарии как лучше это реализовать с удовольствием принимаются.
    • +14
    • 16,7k
    • 6
    Поделиться публикацией

    Похожие публикации

    Комментарии 6

      +1
      Спасибо! Довольно полезная штука для йотаводов. Правда, вот, есть у меня сомнения, что чем большую известность получит то, ради чего оно был создан — тем скорее товарищи из йоты, как бы это ни было грустно, выпилят кормушку :(
        0
        А что мешает просто curl'ом запросы посылать? Зачем нужно рендерить страницу?
          0
          Не все так просто. Там большая часть контента генерится из jQuery-шаблонов, которые как несложно догадаться curl'ом не обрабатываются.
            0
            Ну в конечном то итоге делается же какой-то POST или GET запрос, его можно отловить Firebug' ом например.
              0
              В конечном — да, а вот данные с информацией о тарифах подтягиваются похоже через jsonp или подобный механизм и без запуска JS это не сработает.
          +1
          У меня так и не запустился ваш скрипт.
          Постоянно сидит в waitFor и потом вылетает с timeout

          Переписал его на CasperJS и добавил проверку текущего IP, чтобы определить подключение к Yota

          Если вдруг кому нужно, исходник тут:

          github.com/velsa/yota

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое