PEAR::Net_UserAgent_Mobile を学習目的にコピってみた

お前の予定!はケータイ向けサイトの練習として作り始めたサイトです。

で、ケータイ向けのサイトを作ってみようと思ったけど、何が必要かわからないので、OpenPNEのソースを眺めてみた。携帯電話からのwebアクセスで「かんたんログイン」で使用する固有IDは各社まちまちで、UserAgentに入れてくるDoCoMo, SoftBank とhttp拡張ヘッダで渡してくるauがある。さらに2008/4/1からDoCoMoiモードIDとかいう固有IDを提供することになった。

OpenPNEのやり方はシンプルで良いのだけれど、細切れになっていて把握しづらい。なのでPEARを参考にすることにした。パターンとかいうやつの勉強にもなりそうなのでこっちのほうが良さそうだ。

しかし、PEARのほうだと、いわゆる固有IDに対応するようなプロパティやメソッドが一貫して在るというわけではないので、携帯電話向けのwebサービスの作成時に必要になりそうなインタフェースを備えたクラスを作ってみようと考えた。

  • シングルトン・パターン
  • ファクトリメソッド・パターン
    • PEAR::Net_UserAgent_Mobile パクリ。インスタンスつくるときに楽チン。各キャリアの判定や判定後に各キャリアのクラスをインスタンス化するなんてことはしなくてよい。インタフェースをつくったら同じメソッドで済むよ。
  • 携帯の固有IDを取得する
    • OpenPNEPEARからのパクリ。各社の端末を持っていないので、それぞれどういう仕様なのかまったく分からないね。ソースを見て大体の見当がついた。
      • HTTP-X-UserAgentをパースする部分は、それぞれの個性が出ている。PEARのほうはケータイ向けのコンテンツサービスを念頭においていて、OpenPNEのほうはとりあえずキャリア判別して固有IDが取れればイイやって感じ。
  • 携帯キャリアのGWからのアクセスか判定する
    • OpenPNE パクリ。UserAgentを偽ったり、シミュレーターからのアクセスを判別するために使う。IPアドレスのリストを作るだけなんだけどね。OpenPNEのつくり方はシンプルなんだけどなんだか気に入らないのでリストだけコピった。

DoCoMoについては、一部仕様が変わった。こちらのページを参考に手を加えた。

使い方

<?php
require_once('Keitai.class.php');
$ua =& Keitai::singleton();  // インスタンス生成
if ( !$ua->isError() ) {
    if ( !$ua->isValidIp() ) {
        die("携帯以外のGateWay シミュレータ等\n");
    }
    if ( $ua->isNonMobile() ) {
        die("フルブラウザでのアクセスなど\n");
    }
    /*
     * 固有IDの取得する無ければNULLを返す。
     *   DoCoMo  : iモードIDがあればiモードIDが入る。なければシリアル番号。
     *   KDDI    : サブスクライバ番号。
     *   SoftBank: シリアル番号。
     */
    $id = $ua->getKeitaiId();
    if ( $ua->isDoCoMo() ) {
        $id = $ua->_serialId(); // これまでのシリアル番号には直接プロパティを触りにいく。(ダメだね)
    }
}
else {
    // パースエラー
    if ( PEAR::isError($ua) ) {
        die($ua->toString()."\n");
    }
    else {
        die("Unknown error. Cannot parse your UserAgent.\n");
    }
}
?>
続きを読む