モバイルCGI研究(総合編)
|
2002年3月11日更新 |
PC や各ケータイ端末、 L-mode で異なる処理をしたいときに必要になるのが端末判別。 User Agent を使う方法が一般的ですが、他にもいくつかの方法が考えられるので紹介します。
各ケータイ端末の環境変数を詳しく知りたい場合は「モバイルCGI研究(総合編)環境変数リファレンス」をご参照下さい。
User Agent はアクセスしてきたブラウザの情報で、環境変数 "HTTP_USER_AGENT" に格納されています。各ケータイ端末、L-modeの User Agent のフォーマットは以下のようになっています。
ASTEL/HTTPバージョン/機種名(バージョン)/1ページあたりの容量/対応メロディ 例)ASTEL/1.0/J-0511.00/c10/smel
UP.Browser/ブラウザバージョン-デバイスID UP.Link/UP.Linkサーババージョン 例)UP.Browser/3.04-SN13 UP.Link/3.3.0.5
KDDI-デバイスID UP.Browser/ブラウザバージョン サーバ名 例) KDDI-HI21 UP.Browser/6.0.2.254(GUI) MMP/1.1
PDXGW/HTTPバージョン (端末表示能力) 例)PDXGW/1.0 (TX=8;TY=7;GX=96;GY=84;C=C256;G=BF;GI=2)
DoCoMo/1.0/機種名/キャッシュサイズ/個体識別情報 例)DoCoMo/1.0/SO503i/c10
DoCoMo/2.0 機種名 (キャッシュサイズ;個体識別情報) 例)DoCoMo/2.0 P2101V(c100)
J-PHONE/ブラウザバージョン/機種名(バージョン) 例)J-PHONE/2.0/J-SH02
L-mode//HTTPバージョン//// 例)L-mode//1.0////
よって、次のようなスクリプトが考えられます。
Perl # User Agent によるキャリア判別 # 2002.03.11更新 @user_agent = split(/\//,$ENV{'HTTP_USER_AGENT'}); if ($user_agent[0] eq 'ASTEL') { # ドットi 用の処理 } elsif ($user_agent[0] eq 'UP.Browser') { # EZweb 旧端末用の処理 } elsif ($user_agent[0] =~ /^KDDI/) { # EZweb WAP2.0 対応端末用の処理 } elsif ($user_agent[0] eq 'PDXGW') { # H" 用の処理 } elsif ($user_agent[0] eq 'DoCoMo') { # i-mode 用の処理 } elsif ($user_agent[0] eq 'J-PHONE') { # J-SKY 用の処理 } elsif ($user_agent[0] eq 'L-mode') { # L-mode 用の処理 } else { # それ以外 }
PHP // User Agent によるキャリア判別 // 2002.03.11更新 global $HTTP_USER_AGENT; $ua = explode("/",$HTTP_USER_AGENT); if ($ua[0] == 'ASTEL') { // ドットi 用の処理 } elseif ($ua[0] == 'UP.Browser') { // EZweb 旧端末用の処理 } elseif (ereg("^KDDI","$ua[0]")) { // EZweb WAP2.0 対応端末用の処理 } elseif ($ua[0] == 'PDXGW') { // H" 用の処理 } elseif ($ua[0] == 'DoCoMo') { // i-mode 用の処理 } elseif ($ua[0] == 'J-PHONE') { // J-SKY 用の処理 } elseif ($ua[0] == 'L-mode') { // L-mode 用の処理 } else { // それ以外 }
ただし、この方法ですと、例えば "DoCoMo/〜" と名乗るブラウザは、パソコン上で動かすシミュレータなども含めて全て i-mode と判断されてしまいます。もちろんパソコン上で動作確認をするときなどには便利なのですが、反面、ケータイ用ページのソースを見せたくない場合やリンク先の URL を秘密にしたい場合などには困った状況になります。
そこで考えられるのが、次の Remote Host を使った方法です。
ケータイ端末は、たいがい各社のサーバを経由してインターネットに接続されますので、そのサーバ情報を格納している環境変数 "REMOTE_HOST" を調べることによって、該当するケータイ端末かどうかを判別することができます。
Perl # Remote Host によるキャリア判別 # 2002.03.11更新 if ($ENV{'REMOTE_HOST'} =~ /\.(ezweb|ido)\.ne\.jp$/) { # EZweb 用の処理 if ($ENV{'HTTP_USER_AGENT'} =~ /^KDDI/) { # EZweb WAP2.0 端末用の処理 } else { # EZweb 旧端末用の処理 } } elsif ($ENV{'REMOTE_HOST'} eq 'pdxcgw.pdx.ne.jp') { # H" 用の処理 } elsif ($ENV{'REMOTE_HOST'} =~ /\.docomo\.ne\.jp$/) { # i-mode 用の処理 } elsif ($ENV{'REMOTE_HOST'} =~ /\.jp-[ckqt]\.ne\.jp$/) { # J-SKY 用の処理 } elsif ($ENV{'REMOTE_HOST'} =~ /\.pipopa\.ne\.jp$/) { # L-mode 用の処理 } else { # それ以外 }
PHP // Remote Host によるキャリア判別 // 2002.03.11更新 global $REMOTE_HOST; global $HTTP_USER_AGENT; if (ereg("\.(ido|ezweb)\.ne\.jp$",$REMOTE_HOST)) { if (ereg("^KDDI",$HTTP_USER_AGENT)) { // EZweb WAP2.0 端末用の処理 } else { // EZweb 旧端末用の処理 } } elseif ($REMOTE_HOST == 'pdxcgw.pdx.ne.jp') { // H" 用の処理 } elseif (ereg("\.docomo\.ne\.jp$",$REMOTE_HOST)) { // i-mode 用の処理 } elseif (ereg("\.jp-[ckqt]\.ne\.jp$",$REMOTE_HOST)) { // J-SKY 用の処理 } elseif (ereg("\.pipopa\.ne\.jp$",$REMOTE_HOST)) { // L-mode 用の処理 } else { // それ以外 }
この方法の問題点の1つは、ドット i 及び DoCoMo のブラウザフォン(PHS)を判別できないことです。ブラウザフォンはたいがい mopera.ne.jp を経由してくるようですが、それが全てではありません。
もう一つの問題点は、他のサーバを経由してアクセスしてきた場合にケータイ端末だと判別されないことです。近頃はパケット代を節約するために、不要なタグを削除してくれるサービスなどがありますが、これらはケータイ各社の専用サーバとホームページの間に立って、データを変換してくれています。この場合、 Remote Host は経由サーバのものになりますので注意が必要です。
J-SKY のサーバはもっとある、という指摘をいただくことがありますが、おそらくそれはメールサーバのことで、 J-SKY ウェブのサービスに関わるサーバは "jp-c"、"jp-k"、"jp-q"、"jp-t" の4つで良さそうです。
これ以外に、各ケータイ端末特有の環境変数を利用する方法があります。
例えば J-SKY 端末の場合は、 "HTTP_X_JPHONE_COLOR" 、 "HTTP_X_JPHONE_DISPLAY" 、 "HTTP_X_JPHONE_MSNAME" 、 "HTTP_X_JPHONE_SMAF" 、 "HTTP_X_JPHONE_SOUND" 等の独自の環境変数があります。
ただし、全ての端末にこれらの情報が含まれるという確証がないこと(現に、 "HTTP_X_JPHONE_SMAF" は一部の端末では格納されていないことがわかっています)、また、 User Agent 同様、パソコン上のシミュレータをはじくことができないのが難点です。
CGIぽんはINFOJAMの安価で快適なサーバを利用しています。
|
CGIぽん (C)Copyright 2000-2002 OGATA,Tetsuji
|