2月末に発表されたとおり、3月末日よりDoCoMo端末のリクエストから「iモードID」というのが利用できるようになった。リクエストラインに「guid=ON」というクエリを付与するとリクエストヘッダに7桁の英数字(FOMAカードごとにユニーク / 再利用されない)が付与されてくる。

いろいろ不具合はあるがとりあえずユーザ側にダイアログを出すことなく端末識別ができるようになったのは大きな進歩。早速(…というほど早くないが。風邪でダウンしてました)いろいろ試してみる。

ユーザエージェントからキャリア種別と端末名を知る」で紹介した端末情報取得クラスをちょっと改修。

<?php
class MobileUtil
{
    /******** 前略 ********/
    private $guid = "" ;        // iモードID / DoCoMoのみ
    /******** 中略 ********/
            // 先頭が DoCoMo = DoCoMo ==========================================
            if ($uaSlash[] == "DoCoMo")
            {
                /******** 中略 ********/
                // HTTPヘッダからiモードIDを取得
                $this->guid = getenv("HTTP_X_DCMGUID") ;
            }
    /******** 後略 ********/
}
?>

手近に転がっていた端末でテストしてみた。テストに使ったフォームはこんな感じ。

<form action="?guid=ON" method="post" utn="utn">
    <input type="text"   name="text" />
    <br />
    <input type="submit" name="__exec__" value="OK" />
</form>

icc / ser / guidは適当に伏せてある。

--------------------------------------------------------------------------------
SH905i
--------------------------------------------------------------------------------
array(6) {
  ["type"]=>
  int(1)
  ["name"]=>
  string(6) "SH905i"
  ["icc"]=>
  string(20) "8981************039f"
  ["ser"]=>
  string(15) "353*********044"
  ["ua"]=>
  string(76) "DoCoMo/2.0 SH905i(c100;TB;W30H20;ser353*********044;icc8981************039f)"
  ["guid"]=>
  string(7) "NW****x3"
}
--------------------------------------------------------------------------------
SO903i
--------------------------------------------------------------------------------
array(6) {
  ["type"]=>
  int(1)
  ["name"]=>
  string(6) "SO903i"
  ["icc"]=>
  string(20) "8981************948f"
  ["ser"]=>
  string(15) "351*********564"
  ["ua"]=>
  string(76) "DoCoMo/2.0 SO903i(c100;TB;W30H23;ser351*********564;icc8981************948f)"
  ["guid"]=>
  string(7) "7t***Ob"
}
--------------------------------------------------------------------------------
P703imyu
--------------------------------------------------------------------------------
array(6) {
  ["type"]=>
  int(1)
  ["name"]=>
  string(8) "P703imyu"
  ["icc"]=>
  string(20) "8981************208F"
  ["ser"]=>
  string(15) "359*********705"
  ["ua"]=>
  string(78) "DoCoMo/2.0 P703imyu(c100;TB;W24H12;ser359*********705;icc8981************208F)"
  ["guid"]=>
  string(7) "2d***hz"
}
--------------------------------------------------------------------------------
D703i
--------------------------------------------------------------------------------
array(6) {
  ["type"]=>
  int(1)
  ["name"]=>
  string(5) "D703i"
  ["icc"]=>
  string(20) "8981************628f"
  ["ser"]=>
  string(15) "359*********518"
  ["ua"]=>
  string(75) "DoCoMo/2.0 D703i(c100;TB;W28H15;ser359*********518;icc8981************628f)"
  ["guid"]=>
  string(7) "04***EI"
}
--------------------------------------------------------------------------------
F703i
--------------------------------------------------------------------------------
array(6) {
  ["type"]=>
  int(1)
  ["name"]=>
  string(5) "F703i"
  ["icc"]=>
  string(20) "8981************636f"
  ["ser"]=>
  string(15) "359*********503"
  ["ua"]=>
  string(75) "DoCoMo/2.0 F703i(c100;TB;W23H12;ser359*********503;icc8981100010579573************36f)"
  ["guid"]=>
  string(7) "Fc***4T"
}

D703iとF703iのFOMAカードを交換してみる。

--------------------------------------------------------------------------------
D703i
--------------------------------------------------------------------------------
array(6) {
  ["type"]=>
  int(1)
  ["name"]=>
  string(5) "D703i"
  ["icc"]=>
  string(20) "8981************636f"
  ["ser"]=>
  string(15) "359*********518"
  ["ua"]=>
  string(75) "DoCoMo/2.0 D703i(c100;TB;W28H15;ser359*********518;icc8981************636f)"
  ["guid"]=>
  string(7) "Fc***4T"
}
--------------------------------------------------------------------------------
D703i
--------------------------------------------------------------------------------
array(6) {
  ["type"]=>
  int(1)
  ["name"]=>
  string(5) "F703i"
  ["icc"]=>
  string(20) "8981************628f"
  ["ser"]=>
  string(15) "359*********503"
  ["ua"]=>
  string(75) "DoCoMo/2.0 F703i(c100;TB;W23H12;ser359*********503;icc8981************628f)"
  ["guid"]=>
  string(7) "04***EI"
}

…ということで、serは端末固有、iccとiモードIDはFOMAカード固有【追記参照】、ということが確認できた。

「POSTのbody部については対象外」も念のため検証してみた。

<form action="" method="post" utn="utn">
    <input type="text"   name="guid" value="ON" />
    <br />
    <input type="submit" name="__exec__" value="OK" />
</form>
--------------------------------------------------------------------------------
SH905i
--------------------------------------------------------------------------------
array(6) {
  ["type"]=>
  int(1)
  ["name"]=>
  string(6) "SH905i"
  ["icc"]=>
  string(20) "8981************039f"
  ["ser"]=>
  string(15) "353*********044"
  ["ua"]=>
  string(76) "DoCoMo/2.0 SH905i(c100;TB;W30H20;ser353*********044;icc8981************039f)"
  ["guid"]=>
  bool(false)
}

仕様どおり。

クエリに「guid」というキー名が使えなくなるということなので、運が悪いと今頃改修で大変な方もいるのではないだろうか。私は幸いにして無関係だが。

仕様ページにちっちゃくしれっと注意点が書いてあるので引用しておく。

利用時の注意点

  • ユーザのiモードID利用設定がOFFの場合にはiモードIDの拡張ヘッダは付与されません。
  • ユーザの名義変更、改番、iモード契約の解約によりiモードIDは変更となります。
  • 一度、付与したiモードIDは再利用いたしません。
  • SSL通信時は、iモードIDは付与できません。
  • 2in1契約の場合、利用中のモードによらず、AナンバーのiモードIDを付与します。
  • 交換機などの工事・ネットワークの負荷状況によりiモードIDが送出できない場合があります。

SSL通信時は使えないというのはこちらでも困ってるし、私のプロジェクトでもそのうち困ることになるだろうなぁ。公式サイトではuidという端末識別IDを送出させるクエリがあるのだが、そちらもSSL通信時は使えなくて大変苦労した過去がある。

    • *2008.07.09追記:

OST勉強会に参加してきたら、講演資料にちゃんとした検証結果があった。検証の甘さに恥じ入りつつ、成果はあつかましく取り入れさせていただく。

<th>
  action
</th>

<th>
  hidden
</th>
<td align="center">
  ×
</td>

<td align="center">
  ○
</td>
<td align="center">
  ○
</td>

<td align="center">
  ×
</td>
formメソッド
get
post
  • [action]…

  • [hidden]…

    • *2009.01.22追記:

大変いまさらだが、微妙な(しかし大きな)誤記があったのでお詫びして訂正する。

  • icc

     >FOMAカードの製造番号。

  • iモードID(guid)

     >電話番号に固有の番号。名義変更 / 番号変更 / iモード契約解約で変更される。

●その他の留意点 | サービス・機能 | NTTドコモ

http://www.nttdocomo.co.jp/service/imode/make/content/html/notice/other/#p14

●重要なお知らせ : 『iモードID』の提供開始について | お知らせ | NTTドコモ

http://www.nttdocomo.co.jp/info/notice/page/080228_00.html

つまりiモードIDを変えずにiccを変える方法も、逆にiccを変えずにiモードIDを変える方法も存在する、ということ。認証やユーザ識別に両方を使用している場合注意が必要となる。

●紛失・盗難などによる利用中断・再開 | お客様サポート | NTTドコモ

http://www.nttdocomo.co.jp/support/procedure/change_release/trouble/index.html