毎回毎回のログイン要求に疲れた
公衆無線LANを使ってると、毎回毎回ログインがでてきて面倒だ。もう疲れました。ちょっと離席してたら、またログインしなおしですよ。疲れませんか?
自動ログインを作りましょう。
プランはこういうことになる
私がここで、公衆無線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
~/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
ログインするには、ログイン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操作ができる。
以下 今後追加予定
参考資料
- Tips: au wifi に登録されている端末をしる方法
- Mac OS X で自動的に公衆無線LANへログインするツール (wifi_login) を作った - まちゅダイアリー(2012-10-01)
- 無線APによって自動でhostsを変える方法 - unknownplace.org
- au Wi-Fi SPOTにLinuxから接続できるようにしてみた - Dマイナー志向
- Docomo Wi-Fi のWISPr対応について - eggshell blue
- 0001softbank、あるいはソフトバンクWi-Fiスポットに関する一考察 - eggshell blue
- au wifi の認証方式について - eggshell blue
- 公衆Wifiの認証情報について - eggshell blue
- 公衆無線LANサービスの自動ログインスクリプト - eggshell blue
- WISPr について - eggshell blue