それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Wifi監視して公衆無線LANに自動ログインする。

毎回毎回のログイン要求に疲れた

公衆無線LANを使ってると、毎回毎回ログインがでてきて面倒だ。もう疲れました。ちょっと離席してたら、またログインしなおしですよ。疲れませんか?

自動ログインを作りましょう。

プランはこういうことになる

  1. 無線LANの変化を監視する
  2. 無線LANに変化があったらSSIDを調べる
  3. 指定したSSIDのときは処理を実行
  4. 事前にしていた自動ログインを実行する

私がここで、公衆無線LANと呼んでいるのはSSIDでWPA2などの事前共有キーを設定し、利用前にMACアドレス認証を受けるものだ。WISPrというプロトコルに従っていれば、もう少しマトモに処理ができるのだが、世の中そんなにうまくは行かない。

無線LANの変化の監視可能か実験する

/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist を監視するといいらしい

Wifiの接続オンオフで、切り替わるか確認する。

watch -dc -n 1 'md5sum /Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist'

ssid を切り替えたり、変化があるとファイルが切り替わることを確認。

これで、com.apple.airport.preferences.plistを監視し⇛変化したらプログラム実行というプランが現実的と確認をとった。

wifi のログインスクリプトを準備

とりあえず、処理が簡単な at_starbucks について書いておいた。

#!/usr/bin/env ruby
#coding: utf-8
#
require 'mechanize'

def check_ssid
    ret = `/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport -I | /usr/bin/grep -ie '^\s*ssid'  | cut -d ":" -f 2`
    ret.strip!
    return ret
end



def login( user, pass)
    m = Mechanize.new
    m.get("https://www.google.com") ##適当なURL

    forms =  m.page.forms.select{|e| e.fields_with(:type=>"password").size == 1 and ( e.fields_with(:type=> "text" ).size > 0  or e.fields_with(:type=> "text" ).size > 0 ) }
    raise "ログインフォーム見つからない" unless forms.size > 0

    form = forms.first
    form.field_with( :type=>"password").value = pass
    form.fields_with( :type=>"text").first.value = user
    form.submit

    m.page.body

end

ssid = check_ssid

exit if ssid == ""


case ssid

when /starbucks/i
     puts login("******", "*******")
when /grapic/i
     puts login("*******", "******")
when /wi2/i
    puts login("*****", "*******")
end

これをlaunchctl で登録。

Mac OSX でファイルの更新を監視して、処理をするといえばコレ。launchd

launchd に登録

~/Library/LaunchAgents/takuya_1st.wispr.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
          "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>takuya_1st.wispr</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/bin/wispr.rb</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/dev/null</string><!-- <string>/tmp/error</string> -->
    <key>StandardOutPath</key>
    <string>/dev/null</string>
    <key>WatchPaths</key>
    <array>
      <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
    </array>
  </dict>
</plist>

これを作って

登録する

cd ~/Library/LaunchAgents
launchctl load takuya_1st.wispr.plist

確認する

launchctl list | grep takuya

出来上がり。

これでしばらくログインに悩まされなくて済みそう。

キャリアの無線LANについて

キャリアのログインもどんどん面倒になってきてほんとうに困る。キャリア提供のプログラムがマジクソだったり正しい選択肢を示してくれないので「自由がない」仕方ないので自分で作るか・・・

au Wifiについて

au_Wi-Fi
Wi2premium
Wi2premium_club

この辺りがまともに使える。au の公衆無線LAN

ログインするには、ログインURLを叩く前に au ID にログインする必要がある。

require 'mechanize'
mech = Mechanize.new
mech.get ('https://id.auone.jp/login.html')
## au id でログイン後
mech.login()

## au Wifi についての操作をすることが出来る
require 'cgi'

json = '{"mac_addrs":["AA:AA:AA:AA:AA:AA"],"manufacturer":"Windows","model":"7","request_type":"4"}'

url = "https://auwifi-signup.auone.jp/su2/?#{CGI.escape(json)}"
mech.get url
puts mech.page.body

注意点

  • MACアドレスは「大文字」で書かないとダメ。出ないと {"S": 26 }とかそっけない返事が帰ってくる。
  • au id のCookieは必須。なければリダイレクトされる。
  • au id のログインするにはSMSによる二段階認証が必要。

type の値をいじれば、MACアドレスの登録/変更/削除/一覧のCRUD操作ができる。

以下 今後追加予定

参考資料