network manager + автоматизация http-логина в wifi

    Пост будет коротким, но очень полезным.

    abstract: Есть масса wifi-хот-спотов, которые просят сделать какую-нибудь глупость при подключении. Ввести пароль в http-форме, поставить чекбокс «согласен с продажей почки в обмен на интернет» и т. д.

    Это задалбывает, особенно, если из wifi периодически выкидывает. В посте предлагается простое решение для автоматизации логина с помощью хуков Network Manager.

    Подготовка


    Нам надо понять куда кого как посылать, чтобы оно заработало. Ставим firebug или любой другой похожий плагин. Включаем, идём в вкладку 'net', включаем persistent (это важно), логинимся.

    Получаем вот такое:



    Находим POST (если их несколько — методом перебора и комбинирования), выбираем copy as curl, сохраняем куда-нибудь на будущее.

    Дальше находим uuid нашего коннекта — в файле /etc/NetworkManager/system-connections/our_wifi.

    Пишем скрипт (всё ниже — от рута) в каталоге /etc/NetworkManager/dispatcher.d/, например, /etc/NetworkManager/dispatcher.d/02-our_wifi-auto

    #!/bin/bash
    if [ $2 == 'up' -a $CONNECTION_UUID='d2b76508-139e-4073-a921-61a0a7fec9df' ];
    then
    echo `date` 'logging to our_wifi'>>/var/log/our_wifi
    curl 'https://hautdebitmobile.orange.fr:8443/home/logon' -H 'Cookie: JSESSIONID=E559B5201AA5B75B.aws5; JSESSIONID=E559B5201AA5B75B; owalang=en' -H 'DNT: 1' -H 'Host: hautdebitmobile.orange.fr:8443' -H 'Content-Type: application/x-www-form- urlencoded' --data 'username={FKZDOBR&password=ZLEHFR&isCgu=on&hidden_isCgu=&tab=3&code=0&auth=1&restrictedCode=&restrictedProfile=0&restrictedRealm=' 2>&1>>/var/log/our_wifi
    fi

    Выделенное жирным заменить на актуальные данные.

    Делаем chmod +x /etc/NetworkManager/dispatcher.d/02-our_wifi-auto.

    Вуаля, wifi начинает себя вести как нормальный — сразу после подключения есть интернеты.

    P.S. Буду очень благодарен за что-то подобное для андроидов.

    P.p.s. как подсказывают в почте, для московского метро есть такой скрипт: gitorious.org/vmetro-auth/vmetro-auth

    Для yota: github.com/esin/Esin-s-scripts/blob/master/sh/yota/yota_open
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 29

      +4
      Скрипт будет работать до устаревании сессии в кукисе.
        0
        Ок, посмотрим. Не уверен, что она важна — если важна, допишу получение.
        0
        Пример для Orange, имхо, не особо актуален. Заменить бы его на пример с wi-fi в московском метро что ли (там ведь тоже какая-то страница с какими-то «новостями» и рекламой вылезает?).
          0
          Извините, где укусило, там и починил. Принцип тот же — выцепить нужный запрос, вписать в хук. Для меня больше всего отладки было — найти, как на up для нужного коннекта реагировать, без ложных срабатываний.

          Так что нау хау в посте два: «это можно сделать» и строчка с if'ом.
            0
            На почту прислали, ссылку добавил в пост.
            –1
            Ну, что-то как-то совсем просто и без проверок. Такой подход чуть-чуть расстроил меня, amarao.
            Самое правильное решение — смотреть на параметр Network Authentication Type у сети, и если есть какой-то тип, то пытаться распарсить html и сделать запрос.
            Но, к сожалению, зачастую этот параметр не ставят, тогда можно просто открывать какую-то страницу, и если открывается другая страница, опять же пытаться отправить запрос.
              +2
              Нафига? Uuid сети гарантирует, что мы «в той» сети, а любые телодвижения сделают подключение медленнее. От двойного логина никто не помер ещё, да и при отключении оранж сбрасывает логин, то есть надо логиниться снова.

              Можно к коду ещё юнит-тестов написать и фреймворк для построения фабрик по генерации абстрактных методов. Но зачем?

                –1
                Затем, что у вас оно будет работать только в одной сети, а, возможно, и только одной точки.
                  +1
                  Было бы странное, если бы я свой логин/пароль, купленный за 20€, отправлял в какие-либо другие сети, не? Для того проверка на uuid и стоит.
              +3
              В Apple'овских устройствах для таких WiFi-сетей появляется переключатель «Автоматически» и оно правда работает, не знаю как, но, видимо, есть какой-то универсальный протокол общения с этим хозяйством, хотелось бы увидеть исследования на эту тему + универсальный скрипт для любых сетей с web-попапом.
                0
                На правах инверсного оффтопа.
                У меня на одном стареньком аппарате стоит виндафон 7.5. Так вот, я заметил, что каждый раз после перезагрузки и при регистрации его на моем роутере — у него разный MAC, точней, первая (левая) половина MAC статична, а вторая половина генерится рандомно каждый раз при перезагрузке девайса, в результате чего невозможно (по крайней мере простым стандартным способом) выдавать ему конкретый пишнег и каждый раз он ему выдается динамически. Притом, на этом же девайсе, но под андроидом — MAC статичен, но другой, конечно же.

                Ну, вот зачем виндафон так делает?!
                image

                Не надо так!
                image
                  +3
                  2>&1 >>/var/log/our_wifi
                  

                  А у вас молоко убежало stderr в лог не попадает.
                    0
                    2>&1 разве не оно?
                      +2
                      Нет, не оно (в данном, конкретном случае). Перенаправление «читается» справа налево. Т.е. у вас сначала идет вывод stdout в файл, а потом уже stderr перенаправляется в stdout. Надо делать наоборот:
                      >>/var/log/our_wifi 2>&1
                      

                      Или, что даже проще, так (stdout и stderr перенаправит в файл):
                      &>>/var/log/our_wifi
                      


                        +3
                        PS: Пояснение на примере:
                        $ (echo "stdout" ; echo "stderr" >&2 )
                        stdout
                        stderr
                        $ (echo "stdout" ; echo "stderr" >&2 ) 2>&1 >/dev/null
                        stderr
                        $ (echo "stdout" ; echo "stderr" >&2 ) >/dev/null 2>&1
                        $ (echo "stdout" ; echo "stderr" >&2 ) &>/dev/null
                        

                        Две последние команды равноценны.
                        +2
                        Немного дополню Angel2S2.

                        При старте шелла создаются 3 дескриптора: stdin, stdout, stderr. Нас интересуют последние 2. Представим такой псевдокод:

                        stdout = fopen('/dev/tty')
                        stderr = fopen('/dev/tty')
                        

                        Когда мы делаем так:

                        2>&1 >> /tmp/file.log
                        

                        Происходит что-то такое:

                        stderr = stdout #stderr -> /dev/tty
                        stdout = fopen('/tmp/file.log') #stdout -> file
                        

                        А когда мы делаем так:

                        >> /tmp/file.log 2>&1
                        

                        Получается такое:

                        stdout = fopen('/tmp/file.log') #stdout -> file
                        stderr = stdout #stderr -> file
                        
                        0
                        Дык, вроде ж stderr перенаправляется в stdout, а stdout добавляется в /var/log/our_wifi… Что-то разве не так или я чего-то недогоняю?
                      0
                      А что, ни у кого у них нет антиксрф токена или любого подобного механизма с уникальным параметром в формах логина?)
                        0
                        Зачем? От кого?

                        Даже если появится, ну будут два курла вместо одного.
                        0
                        Я бы ещё MAC менял для московского метро :)
                          +1
                          А такую штуку можно как то реализовать и на Andorid?
                            0
                            Тоже интересно.
                            Запуск скрипта можно организовать, например, через Llama (при подключении к определенной wifi сети, выполнить действие — запуск приложения/ярлыка). Осталось только найти программу, которая может запустить скрипт, либо которая может выполнить нужные действия. В свое время не нашел таких (для других целей — у меня при перезагрузке симка переключается в 2G режим, хотел автоматизировать включение 3G режима).
                              0
                              консоль как таковая же в Android есть BusyBox ведь можно поставить, надо будет попробовать на работе.
                              А то надоедает кнопку нажимать, а страница с авторизаций не всегда выходит, и непонятно в такой момент как в сеть входить, надо что то более надежное.
                                0
                                Я не смог запустить скрипт через Llama, т.к. она выводит список установленных программ. Вручную путь указать нельзя (хотя глубоко не копал). В Tasker вроде можно (то-ли стандартно, то-ли через плагин какой-то), но я его не пробовал, поэтому точно не скажу, может путаю с чем-то. Еще есть Locale.
                              0
                              на 4pda была прога для авторизации в московском метро как раз, так что да, возможно.
                              0
                              Я так понял вопрос не решён?
                                0
                                Вы сильный археолог. Я сейчас даже не могу сказать, какой именно вопрос, но моя конкретная боль с конкретным оператором во-первых была решена, а во-вторых, более не волнует.

                              Only users with full accounts can post comments. Log in, please.