公衆無線LANサービスの自動ログインスクリプト

Python 版 WISPr クライアントはじめました。

国内で展開している、主に携帯キャリアの公衆無線LANサービスに対応した自動ログインスクリプトを公開します。

これまで色々と各キャリアの無線LANサービスについて書き連ねてきたわけですが、ここらでひとつコードとして纏めておこうと思い、さくっと書いてみました。NTT系以外*1の公衆無線LANサービスで動作確認を行っています。


ソースはこちら: tamias / PyWISPr / source / — Bitbucket

作成の経緯

そもそもは3G回線契約を持たない Android 端末でどうにか簡単に使えないかなというのが発端であり、純正アプリは軒並み低評価ということもあって、まずは Android 版の作成を考えていました。

が、1から作るのはなぁ…と思っていたところ、オープンソース(GPL)で公開されている 1st-wispr client の存在を知り、初めのうちはこれをベースにある程度使い物になるところまで作りかけたのですが、公開することを考え始めると、このアプリ、作者が台湾の方のようで、ソースコード内に台湾で展開しているサービスに特化した部分が複数あり、それらを逐一書き換えていくのはあまりにも骨が折れる作業だったため、結局フルスクラッチで書き上げることにしました。

似たようなスクリプトは既に「au Wi-Fi SPOTにLinuxから接続できるようにしてみた - Gマイナー志向」で作成されていましたが、あちらはユーザー情報を逐次入力するという、キーボード端末前提で書かれていたこと、また特別なUser Agent指定が必須の一部サービスには対応していなかったこと、そして何より Perl で書かれていたため、新たに作成し直すことにしました。

新規に作成するにあたり、 WISPr プロトコルへの準拠度を高めようとしましたが、以前のエントリでも書いたとおり、現行バージョンの2.0ならともかく、1.0を使うサービスが大勢を占める現状では準拠という言葉を使えないものの、それなりに想定されうるロジックは網羅しているはずです。

言語については携帯端末でもノートPCでも動作可能なものをと思い、Air/JavaScript などのより移植性の高い言語も考えたのですが、最終的になんだかんだで使いやすく、また Android であれば SL4A を通せば携帯端末でも動作する Python に落ち着きました。こちらの対応版は併せて PyWispr_sl4a.py として公開しています。中身というか処理ロジックは全く同じですし、大本の PyWispr.py も Android/SL4A 上で普通に動きますが*2、動作通知やパスワードファイルの保存位置などが携帯端末環境に適したコードになっています。

各社、というか主にソフトバンクモバイルワイヤ・アンド・ワイヤレスですが、User Agentを見て自社端末かどうかの識別を行っているようで、前者は特定の文字列がないと自社端末として見なさず、ログインさせないという方針をとっており、後者の一部のアクセスポイントでは逆に他社を特定可能な一部の文字列が存在すると、そもそもレスポンスを返さないという挙動を示すものがあります。これらの処理のせいで煩雑なコードになってしまっており、もうちょっとどうにかしてくれないかなぁというのが正直なところです。キャリアロックインを進めるのを止めるわけではありませんが…。

このような事情から、認証情報を記入する secret.xml に、ユーザーID、パスワードに加えて User Agent を記載しています。通常は User Agent 値を変更する必要はないものの、変更することは可能ですが、変更に伴って接続ができなくなる場合がありますのでご注意ください。

動作確認環境

標準ライブラリのみを使用して作成していますので、別途必要なライブラリはありません。

ただ、 XML のパースに ElementTree を使用していますので、これが標準で入っていないPython 2.5以前のバージョンでは別途導入およびコードの修正が必要です。その他、バージョン更新に伴って新たに導入されたメソッド群が存在している可能性がありますので、なるべく最新の環境で動作させることをお勧めします。 → Python Download

PyWispr
PyWispr_sl4a

つかいかた

  1. アクセスポイントへのWEP/WPAキーを入手し、OSに登録する cf) network/公衆無線/ホットスポット一覧 - Tomocha WikiPlus
  2. secret.xml を編集し、利用するサービスの認証情報を記入する*3
  3. 実行スクリプト(PyWispr.py もしくは PyWispr_sl4a.py)と secret.xml を同階層に保存する
  4. 外出し、認証情報を登録したサービスの無線LANアクセスポイントに接続する
  5. スクリプトを実行する
  6. 通常の環境の場合、ログインに成功すると Enter でログオフするか Ctrl+C で終了するか問われますので、状況に応じてご利用ください

注意点

  • 自己責任でご使用ください。サービスによっては、明確に自社配布アプリ経由以外での接続を禁じている場合があるかもしれません。
  • スクリプトでは、SSL証明書の確認は実施していません(Python 側の仕様です)。成りすましAPにはくれぐれもご注意ください。
  • SL4A では /sdcard/sl4a/scripts が保存フォルダになります(環境依存の可能性アリ)。ただし、実行時のCWDは /sdcard/sl4a です。
  • au_Wi-Fi の一部のアクセスポイントではログオフ機能は機能しません。これはログオフ機能のAPIがAP内のアドレスとなっているのに対し、認証に成功すると二度とAP内のアドレスを参照することができなくなるというサービス側の仕様によるものです。


スタバでのドヤリングのお供にも、コンビニ駐車場でのネットにも、どうぞご利用ください。

*1:非フレッツ&OCN契約でもないため、NTT-SPOT/HOTSPOT のアカウントがなかったもので…

*2:secret.xml へのパスの書き換え、あるいはファイル配置を修正する必要があります

*3:au wi-fi ではこの時点で接続端末の登録を済ませておく必要があります。