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

uamobile 0.2を考える(3)

Python Mobile

前回のエントリからだいぶ時間がたって、実のところbranchで開発していたuamobile 0.2はすでに実戦投入している。中のコードはまだまだ手を入れたいが、外向きのAPIはだいぶ満足がいくようになったし、下位互換性もある。

supports_cookieメソッド

上記記事にある通り、Cookieをサポートしている携帯端末であってもいろいろ気を使うわけだが、僕の経験では、SoftBankのJPドメインの扱いが非常に苦労し、今でも例外扱いにしている。

具体的にはSoftBankのOpenWaveブラウザ(UP.Browser)は、

  • www.example.jp

というJPドメインにはCookieを送出するが、

  • example.jp

というJPドメインにはCookieを送出しないという挙動がある。・・・と書いてみたものの、www.example.jpにCookieを送出するか否かは、記憶に頼っていて自信がない*1ところなので、結局のところ、

class UserAgentContainer(object):
    def __init__(self, ua):
        self.__ua = ua

    def supports_cookie(self):
        if self.__ua.is_softbank() and '/UP.Browser/' in self.__ua.useragent:
            return False

        return self.__ua.supports_cookie()

というようなuamobile.base.UserAgentクラスのラッパークラスを書いて、「SoftBankでUP.BrowserならばCookieをサポートしない」ものとして扱うようにしている。こういったラッパークラスを書かないですむようにuamobile.softbank自体を変更してしまうかどうかは悩みどころ。

Contextクラス

  • 独自のUserAgentオブジェクトを使いたい
  • キャリアやクローラーのIPを追加したしたい
  • プラグイン機構

等を実現するにあたって、どういう風なインターフェイスにするかだいぶ考慮して、次の2案を考えていた。

最初の案。

from uamobile import make_detector

detector = make_detector(
  extra_docomo_ips=["192.168.1.0/24"],
  extensions=[FlashLiteVersionExtension()],
  # なんやかんやの設定が続く
)

device = detector.detect(environ)

この路線で考えていたが、UserAgentサブクラスのインスタンスはそのインスタンス自身が生成されたコンテクストを知っていた方がよいという読みから、次のようなインターフェイスに路線転換。

ctxt = Context(extra_docomo_ips=['192.168.0.0/24'])
ua = detect({'HTTP_USER_AGENT': 'DoCoMo/2.0 P01A(c100;TB;W24H15)',
             'REMOTE_ADDR'    : '192.168.0.1',
            },
            context=ctxt)
assert ua.is_docomo()
assert ua.is_bogus() is False

ただ、実際に使ってみて感じたのが、「ある特定のキャリアだけ任意のアドレスを追加したい」というケースがほとんどないであろうということ。そのため、

ctxt = Context(
  extra_docomo_ips=['192.168.0.0/24'],
  extra_ezweb_ips=extra_docomo_ips=['192.168.0.0/24'],
  extra_softbank_ips=['192.168.0.0/24'],
  extra_willcom_ips=['192.168.0.0/24']
)

と書くよりは、

ctxt = Context(extra_mobile_ips=['192.168.0.0/24'])

の方が現実的である。0.2正式リリースの時にはこの形式の引数をサポートしているだろう。(実際のところは、アプリケーションをうまく作ればキャリアのIPを追加したいという必要性はそんなに出ないと思うけどね。)

*1:xxx.www.example.jpというドメインでは問題がないことは確実。サブドメインなしのexample.jpは確実にNG