読者です 読者をやめる 読者になる 読者になる

uamobile 0.2を考える(2)

Python Mobile

get_real_ip()

クライアントのアクセス元IPアドレスを取得するメソッド*1。キャリアのIPアドレス帯からアクセスしてきているかを確認するときに使う。

>>> device.get_real_ip()
IP('192.168.0.1')

get_real_ip()は内部向けのヘルパーメソッドなので、アクセス元が信頼できるかどうかは、通常はis_bogus()を使って判定すればよい。

>>> device.is_bogus()
True

クローラーの場合は、is_bogus()がTrue、is_crawler()もTrueになる。

>>> device = detect({'HTTP_USER_AGENT': 'DoCoMo/2.0 SH902i (compatible; Y!J-SRD/1.0; http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)', 'REMOTE_ADDR': '124.83.159.146'})
>>> device.is_docomo()
True
>>> device.is_crawler()
True
>>> device.is_bogus()
True

detect関数は例外を排出しない

今まではUser-Agentの解析に失敗したらuamobile.exceptions.NoMatchingErrorを排出していたが、これだと新機種や未知のクローラーに対応できなかった。

なので、0.2系からは「User-AgentがDoCoMoで始まってればdocomoのケータイじゃね?」くらいの「緩さ」で判定を行おうと思う。解析に失敗した場合は、各プロパティはNoneを返す。

>>> device = detect({'HTTP_USER_AGENT': 'DoCoMo/2.0 spam(egg)'})
>>> device.is_docomo()
True
>>> device.series is None
True

strip_serialnumber()

User-Agentからユーザ・端末固有のIDを削除。何に使うかというと、自サービスから外部のサービスにUser-Agentを渡すようなケースで使う。

>>> device = detect({'HTTP_USER_AGENT':'DoCoMo/2.0 N902iS(c100;TB;W24H12;ser0123456789abcd;icc8888888888888888888)'})
>>> device.strip_serialnumber()
DoCoMo/2.0 N902iS(c100;TB;W24H12)

Displayオブジェクトの標準のwidth/heightを有意なものに

今までは、登録されていない端末のDisplayサイズを0*0として返していたが、これを平均的なサイズで返すようにする。

>>> device = detect({'HTTP_USER_AGENT': 'DoCoMo/2.0 spam'})
>>> device.display.width
240
>>> device.display.height
320


まだまだ変更したい点は続く。

*1:real_ipというプロパティでもアクセスできるようにするかもしれない