Net_UserAgent_Mobile_UserIDをリリースしました

携帯電話の固有IDを扱うライブラリをopenpearでリリースしました。

Net_UserAgent_Mobile_UserID \ Package \ Openpear

先日公開された「携帯各キャリアの固有IDについて (全キャリア対応) - ぱらめでぃうす」がすばらしかったので、このまとめをもとにPEARパッケージをでっちあげてみました。

基本的な使い方はこんな感じです。

<?php
require_once 'Net/UserAgent/Mobile/UserID.php';

try {
    $userid = Net_UserAgent_Mobile_UserID::factory();
} catch (Net_UserAgent_Mobile_UserID_Exception $e) {
    var_dump($e->getMessage());
    exit;
}

// ID本体
echo $userid->getID();
// 接頭文字
echo $userid->getPrefix();
// 解析前のデータ
echo $userid->getRawData();

以下のような値が取得されます。

DoCoMo
種類 接頭文字 ID本体
端末製造番号 ser 英数11桁or15桁
FOMAカード製造番号 icc 英数20桁
iモードID なし 英数7桁
EZweb
種類 接頭文字 ID本体
EZ番号 なし 英数14桁+_+英数2桁+.ezweb.ne.jp
SoftBank
種類 接頭文字 ID本体
UID なし 英数16桁
端末シリアル番号 SN 英数11桁or15桁
e-mobile
種類 接頭文字 ID本体
UID u 英数17桁

先頭の固定文字を接頭文字としてID本体と分離してますが、余計なお世話かもしれません..。

ほかにユーザーIDの判定方法を差し替えたりなど。

<?php
require_once 'Net/UserAgent/Mobile/UserID.php';
require_once 'Net/UserAgent/Mobile/UserID/Abstract.php';

// ?id=aa-12345みたいなの
class Hoge extends Net_UserAgent_Mobile_UserID_Abstract
{
    public function getID()
    {
        if (array_key_exists('id', $_REQUEST)) {
            return $_REQUEST['id'];
        } else {
            return null;
        }
    }

    public function validateID($id)
    {
        return preg_match('/^[a-z}{2}\-[0-9]{5}$/', $id);
    }

    protected function _parseID($id)
    {
        return array(
            substr($id, 0, 2),
            substr($id, 3),
        );
    }
}

Net_UserAgent_Mobile_UserID::setUserIDModules('DoCoMo', new Hoge());

バリデーションだけ単体で使うこともできます。

<?php
require_once 'Net/UserAgent/Mobile/DoCoMo/ImodeID.php';

if (Net_UserAgent_Mobile_ImodeID::validateID('xxxxxxx')) {
    echo "ok";
} else {
    echo "ng";
}

Net_UserAgent_MobileでもユーザーIDは取得できるんですが、インターフェースが統一されてたらうれしいかなーとか、NDAな処理は呼出し側で追加できたらいいなーとか、そんな感じで作ってみました。