Perlスクリプトによる、いろいろな場面での端末振り分け法です。
端末判別法については、いろいろなサイトで、さまざまな方法が公開されています。
以下の記述は、それらのうちの1つの方法に過ぎないということをお含みの上でご覧下さい。
EZwebには、現在、WAP2.0対応機と、HDML機があります。
Webサーバー上のファイルがHDML・XHTMLどちらで記述されていても、ゲートウェイ変換により各端末で表示することが可能ですが、理想を言えば、WAP2.0機にはXHTMLを、HDML機にはHDMLを提供するのが一番よい方法です。
その為にはCGIなどにより、アクセスしてきた端末を、WAP2.0機とそれ以外の端末とに判別しなければなりません。
WAP2.0対応機には、シミュレータも含め、ユーザーエージェント情報(HTTP_USER_AGENT)に、「(GUI)」という文字列が含まれます。
この文字列が含まれるか否かをチェックすることで、WAP2.0対応機とHDML機を振り分けることができます。
この方法の欠点は、WML1.3のみ対応のWAP Edition(EZwebにはない)ブラウザを判別できないことです。
反面、「"(GUI)"文字列が含まれるか否か」のみで判定できますので、簡単に振り分けできます。
【WAP2.0対応機のユーザーエージェント(C5001T)】
KDDI-TS21 UP.Browser/6.0.2.273 (GUI) MMP/1.1 KDDI-デバイスID UP.Browser/ブラウザバージョン (GUI) MMP/1.1
【HDML機のユーザーエージェント(C401SA)】
UP.Browser/3.04-SY12 UP.Link/3.4.4 UP.Browser/ブラウザバージョン-デバイスID UP.Link/3.4.4
<<サンプルスクリプト>>
#!/usr/local/bin/perl
$UA = $ENV{'HTTP_USER_AGENT'} || "";
# まずEZweb端末かどうかチェック
if ($UA =~ 'UP.B'){
$ua = 1;
#次にWAP2.0対応機かどうかチェック
if ($UA =~ '(GUI)') {
$ua = 2;
}
}
# 「$ua = 1」なら、HDML機
# 「$ua = 2」なら、WAP2.0対応機
ブラウザが対応するMIMEタイプリストを格納しているHTTP_ACCEPT情報をチェックします。
WAP2.0対応機には、「text/css」が含まれています。
「xml」が含まれるかどうかでチェックしてもよいと思います。
<<サンプルスクリプト>>
#!/usr/local/bin/perl
$AC = $ENV{'HTTP_ACCEPT'} || "";
# まず、EZweb端末かどうかチェック
if ($AC =~ 'hdml') {
$ua = 1;
# WAP2.0対応機かどうかを「text/css」があるかどうかで判断
if ($AC =~ 'text/css') {
$ua = 2;
}
}
# 「$ua = 1」なら、HDML機
# 「$ua = 2」なら、WAP2.0対応機
【WAP2.0対応機のHTTP_ACCEPT(C5001T)】
application/vnd.phonecom.mmc-xml, image/gif, image/jpeg, image/vnd.wap.wbmp, image/bmp, image/x-up-wpng, image/png, multipart/mixed, multipart/related, text/css, text/html, text/plain, text/vnd.wap.wml; type=4365, application/x-pmd, application/x-smaf, audio/vnd.qcelp, text/x-vcalendar, text/x-vcard, application/x-up-download, application/octet-stream,text/x-hdml,*/*
【HDML機のHTTP_ACCEPT(C401SA)】
application/x-hdmlc, application/x-up-alert, application/x-up-cacheop, application/x-up-device, application/x-up-digestentry, application/x-up-download,text/x-vcanlender,text/x-vcard,application/x-pmd,audio/vnd.qcelp,image/x-up-bmp,image/png,, text/x-hdml;version=3.1, text/x-hdml;version=2.0, image/bmp,text/x-wap.wml,text/vnd.wap.wml,text/html, */*
WAP2.0対応機には、「HTTP_X_UP_DEVCAP_MULTIMEDIA」という、新しい環境変数が含まれています。
これは、HDML機の環境変数にはありませんので、これがあるかどうかで振り分けることができます。
<<サンプルスクリプト>>
#!/usr/local/bin/perl
$MULTI = $ENV{'HTTP_X_UP_DEVCAP_MULTIMEDIA'} || "";
$UA = $ENV{'HTTP_USER_AGENT'} || "";
# まずEZweb端末かどうかチェック
if ($UA =~ 'UP.B'){
$ua = 1;
# 次にマルチメディア情報があるかどうかでWAP2.0対応機か否かを判断
if ($MULTI) {
$ua = 2;
}
}
# 「$ua = 1」なら、HDML機
# 「$ua = 2」なら、WAP2.0対応機
Openwave™ シミュレータ等、パソコン上からのアクセスを排除する方法です。
サブスクライバIDチェックによる方法と、リモートホストチェックによる方法があります。
サブスクライバID(HTTP_X_UP_SUBNO)は、EZweb実機では以下のような形式になっています。
シミュレータ等、パソコン上からのアクセスでは、そのパソコンの名前が入ります。
万が一、パソコンの名前が以下のような形式にマッチした場合は排除できません。
※2005年4月より、サブスクライバIDの送出をユーザー側で止める機能が追加されましたので、あまりお薦めできません。
【サブスクライバIDの形式(C4xxシリーズ以降)】
xxxxxxxxxxxxxx_**.ezweb.ne.jp 14桁の数字_英小文字2個.ezweb.ne.jp
【サブスクライバIDの形式(C2xx/C3xxシリーズ)】
xxxxxxxxxxxxxx_wx.ez*.ido.ne.jp 14桁の数字_英小文字1個と1桁の数字.ez英小文字1個.ido.ne.jp
【サブスクライバIDの形式(TUKA)】
xxxxxxxxxxxxxx_tx.ezweb.ne.jp 又は、 xxxxxxxxxxxxxx_t*.ezweb.ne.jp 14桁の数字_t英小文字1個又は1桁の数字.ezweb.ne.jp
<<サンプルスクリプト>>
#!/usr/local/bin/perl # サブスクライバID取得 $SN = $ENV{'HTTP_X_UP_SUBNO'} || ""; # ユーザーエージェント取得 $UA = $ENV{'HTTP_USER_AGENT'} || ""; # まずEZweb端末かどうかチェック if ($UA =~ 'UP.B') { #サブスクライバIDの形式をチェック if ($SN =~ /^[\d]{14}_[0-9a-z]{2}\.ez[a-z\.]+ne\.jp$/){ # EZweb実機 $ua = 1; } elsif ($SN ne '') { # シミュレータ $ua = 9; } } # 「$ua = 1」なら、EZweb実機 # 「$ua = 9」なら、シミュレータ
※サブスクライバIDの定義は、Openwave™社のリファレンスによると、
となっています。
EZweb実機では、リモートホスト(REMOTE_HOST)に「ezweb.ne.jp」が含まれます。
シミュレータでは、パソコンが接続しているプロバイダのホスト名か、「空」となります。
<<サンプルスクリプト>>
#!/usr/local/bin/perl # ユーザーエージェント取得 $UA = $ENV{'HTTP_USER_AGENT'} || ""; # リモートホスト名取得 $HOST = $ENV{'REMOTE_HOST'} || ""; # まずEZweb端末かどうかチェック if ($UA =~ 'UP.B') { #リモートホストが「ezweb.ne.jp」又は「ido.ne.jp」で #終わっているかどうかチェック if ($HOST =~ /\.ezweb\.ne\.jp$/) { # EZweb実機 $ua = 1; } else { # シミュレータ $ua = 9; } } # 「$ua = 1」なら、EZweb実機 # 「$ua = 9」なら、シミュレータ
白黒端末とカラー端末で表示させる画像を変えたい場合などに使います。
ブラウザが対応するMIMEタイプリストを格納しているHTTP_ACCEPT情報をチェックします。
カラー端末には、「image/png」が含まれています。
一部の端末は、PNG対応でも表示は白黒4階調というものがあります。
<<サンプルスクリプト>>
#!/usr/local/bin/perl # 既にEZweb端末であることをチェック済みとする $supportImage = 0; # カラー対応機かどうかを「image/png」があるかどうかで判断 foreach (split(/\, */, $ENV{'HTTP_ACCEPT'})) { if (m|image/png|) { $supportImage = 1; last; } } # 「$supportImage = 1」ならカラー端末(含 PNG対応白黒4階調端末) # 「$supportImage = 0」なら白黒端末
EZweb機には、「HTTP_X_UP_DEVCAP_ISCOLOR」という独自の環境変数があります。
この値に「1」がセットされていると、カラー対応機、「0」か値が無ければ白黒端末ということになります。
ただし、「1」がセットされている端末の中には、モノクロ4階調の端末がありますので、同時に色深度環境変数「HTTP_X_UP_DEVCAP_SCREENDEPTH」をチェックした方がよいと思います。
<<サンプルスクリプト>>
#!/usr/local/bin/perl # 既にEZweb端末であることをチェック済みとする $supportImage = 0; # カラー対応機かどうか $iscolor = $ENV{'HTTP_X_UP_DEVCAP_ISCOLOR'}; # 画面色深度 $scrDepth = $ENV{'HTTP_X_UP_DEVCAP_SCREENDEPTH'}; if ($iscolor) { $supportImage = 1; # 色深度が2だとモノクロ4階調端末 if ($scrDepth == 2) { $supportImage = 0; } } # 「$supportImage = 1」ならカラー端末 # 「$supportImage = 0」なら白黒端末
一部のHDMLカラー端末及びWAP2.0対応端末は、GIF画像に対応しています。
それらをカラー端末からさらに切り分けます。
※ただし、HDML機に関しては、GIF画像に対応している端末であってもうまく表示できないことがありますので、PNG画像を出力しておいた方が無難です。
<<サンプルスクリプト>>
#!/usr/local/bin/perl # 既にEZweb端末であることをチェック済みとする $supportImage = 0; # GIFに対応しているかPNGのみ対応かを判断 foreach (split(/\, */, $ENV{'HTTP_ACCEPT'})) { if (m|image/gif|) { $supportImage =2; last; } elsif (m|image/png|) { $supportImage = 1; last; } } # 「$supportImage = 1」ならPNG対応カラー端末 # 「$supportImage = 2」ならGIF対応カラー端末 # 「$supportImage = 0」なら白黒端末
各携帯電話端末を、それぞれ用のページに振り分けるためのものです。
主にユーザーエージェント情報のみで振り分ける単純なものです。
個人で運営するサイトなどは、これで充分ではないでしょうか。
<<サンプルスクリプト>>
#!/usr/local/bin/perl # ユーザーエージェント取得 $user_agent = $ENV{'HTTP_USER_AGENT'} || ""; # MSNAME取得 $msname = $ENV{'HTTP_X_JPHONE_MSNAME'} || ""; # まずVodafone端末かどうかチェック if ($user_agent =~ m{^(?:J-PHONE|Vodafone|SoftBank)/\d}) { $ua = 4; # 次にEZweb端末かどうかチェック } elsif ($user_agent =~ 'UP.B' or $user_agent =~ m|UP/|) { $ua = 1; #WAP2.0対応機かどうかチェックしておく if ($user_agent =~ '(GUI)') { $ua = 2; } # 次にi-mode端末かどうかチェック } elsif ($user_agent =~ m{^DoCoMo/\d}) { $ua = 3; # 次にVodafoneモトローラ社端末は、MSNAMEもあるかどうかチェックする } elsif ($user_agent =~ /^MOT-/ and $msname ne "") { $ua = 4; # 次にHDGE端末かどうかチェック } elsif ($user_agent =~ m{^PDXGW/\d}) { $ua = 5; # 次にAIR-HDGE PHONE端末かどうかチェック } elsif ($user_agent =~ /(?:DDIPOCKET|WILLCOM);/) { $ua = 6; # 次にドットi端末かどうかチェック } elsif ($user_agent =~ m{^ASTEL/\d}) { $ua = 7; # その他はPCとする } else { $ua = 0; } # 「$ua = 1」 -> EZweb端末(HDML機) # 「$ua = 2」 -> EZweb端末(WAP2.0対応機) # 「$ua = 3」 -> i-mode端末 # 「$ua = 4」 -> Vodafone端末 # 「$ua = 5」 -> HDGE端末 # 「$ua = 6」 -> AIR-HDGE PHONE端末 # 「$ua = 7」 -> ドットi端末 # 「$ua = 0」 -> PC
PC用ブラウザの中には、ユーザーエージェント情報を編集できるものがあります。
それらをなるべく排除するようにしたものです。
3-1.簡易版と違う箇所は、「#PCブラウザをとっとと判定」のところだけです。
<<サンプルスクリプト>>
#!/usr/local/bin/perl # ユーザーエージェント取得 $user_agent = $ENV{'HTTP_USER_AGENT'} || ""; # MSNAME取得 $msname = $ENV{'HTTP_X_JPHONE_MSNAME'} || ""; # まずAIR-HDGE PHONE端末かどうかチェック if ($user_agent =~ /(?:DDIPOCKET|WILLCOM);/) { $ua = 6; # PCブラウザをとっとと判定 } elsif ($user_agent =~ /Mozilla|MSIE|Netscape|Opera|Lynx|AOL|Cuam|Gecko|Sleipnir|Ninja|WWWC/) { $ua = 0; # Vodafone端末かどうかチェック } elsif ($user_agent =~ m{^(?:J-PHONE|Vodafone|SoftBank)/\d}) { $ua = 4; # EZweb端末かどうかチェック } elsif ($user_agent =~ 'UP.B' or $user_agent =~ m|UP/|) { $ua = 1; #WAP2.0対応機かどうかチェックしておく if ($user_agent =~ '(GUI)') { $ua = 2; # i-mode端末かどうかチェック } elsif ($user_agent =~ m{^DoCoMo/\d}) { $ua = 3; # Vodafoneモトローラ社端末は、MSNAMEもあるかどうかチェックする } elsif ($user_agent =~ /^MOT-/ and $msname ne "") { $ua = 4; # HDGE端末かどうかチェック } elsif ($user_agent =~ m{^PDXGW/\d}) { $ua = 5; # ドットi端末かどうかチェック } elsif ($user_agent =~ m{^ASTEL/\d}) { $ua = 6; # その他はPCとする } else { $ua = 0; } # 「$ua = 1」 -> EZweb端末(HDML機) # 「$ua = 2」 -> EZweb端末(WAP2.0対応機) # 「$ua = 3」 -> i-mode端末 # 「$ua = 4」 -> Vodafone端末 # 「$ua = 5」 -> HDGE端末 # 「$ua = 6」 -> AIR-HDGE PHONE端末 # 「$ua = 7」 -> ドットi端末 # 「$ua = 0」 -> PC
EZweb/i-mode/Vodafoneの新しい端末では、より多くの絵文字(拡張絵文字)が使えます。
拡張絵文字にはバラエティ豊かなデザインのものが揃っており、つい多用したくなりますが、非対応機種では表示することができません。
そこでアクセス端末が拡張絵文字に対応しているかどうかを、ユーザーエージェントなどの環境情報から判断してみます。
| EZweb | → | 絵文字No.335〜822のもの(No.500〜518を除く) |
| i-mode | → | シフトJISコードF9B1〜F9FCの範囲内のもの |
| vodafone | → | 絵文字コードが、$O, $P, $Q で始まるもの $QZ[\]^絵文字は除く |
※今後のHTTP環境変数情報の変化などにより、使えなくなる可能性がありますのでご留意ください。
HTTP_X_UP_DEVCUP_MULTIMEDIA 環境変数の9桁目が、1 以上ならば、拡張絵文字対応です。
上記環境変数が無いか、0 がセットされていれば、拡張絵文字非対応です。
2005年09月現在、WAP2.0非対応機は全て拡張絵文字非対応です。
【C3003PのMULTIMEDIA値】(拡張絵文字非対応)
0223221100000000
【A1304TのMULTIMEDIA値】(拡張絵文字対応)
2000531211100000
【A3015SAのMULTIMEDIA値】(拡張絵文字非対応)
0233531100000000
【A1101SのMULTIMEDIA値】(拡張絵文字対応)
0102531110000000
<<サンプルスクリプト>>
#!/usr/local/bin/perl my $add = 0; # WAP2.0対応機だけ調べる # WAP2.0非対応機は、自動的に拡張絵文字非対応 if ($ENV{'HTTP_USER_AGENT'} =~ '(GUI)') { my @multiValue = split(//, $ENV{'HTTP_X_UP_DEVCAP_MULTIMEDIA'}); $add = 1 if ($multiValue[8] > 0); } # 「$add=0」なら拡張絵文字非対応 # 「$add=1」なら拡張絵文字対応
ユーザーエージェントに /T または、;T があれば、iモード対応HTML4.0 以上=拡張絵文字対応機種であると言えます。
ただし、現時点(2005/09月)で例外が2機種存在します。
D504iとD251iのユーザーエージェントには上記の文字が含まれませんが、この2機種は拡張絵文字対応です。
【N211iのユーザーエージェント】(拡張絵文字非対応)
DoCoMo/1.0/N211i/c10
【N504iのユーザーエージェント】(拡張絵文字対応)
DoCoMo/1.0/N504i/c10/TB
【F2051のユーザーエージェント】(拡張絵文字対応)
DoCoMo/2.0 F2051(c100;TB)
【D504iのユーザーエージェント】(拡張絵文字対応)
DoCoMo/1.0/D504i/c10
<<サンプルスクリプト>>
#!/usr/local/bin/perl
my $add = 0;
my $USER_AGENT = $ENV{'HTTP_USER_AGENT'} || "Unknown";
if ($USER_AGENT =~ m|^DoCoMo/|) {
if ($USER_AGENT =~ m{(?:/T|;T)}) { $add = 1; }
elsif ($USER_AGENT =~ m{/D(?:504|251)i/}) { $add = 1; }
}
# 「$add=0」なら拡張絵文字非対応
# 「$add=1」なら拡張絵文字対応
ユーザーエージェント情報に含まれるブラウザバージョンが、4.0 以上であれば、無条件に拡張絵文字対応となります。
ただし、ブラウザバージョンが、3.0の機種の中にも拡張絵文字対応の端末がある※そうです。
※この情報は、ツー氏よりいただきました。
V4xx/V3xxシリーズ,J-SA06,J-T010,J-D08,J-SH010,J-T09が、ブラウザバージョン3.0でありながら拡張絵文字対応とのことです。
今後発売されるブラウザバージョン3.0以上の機種は、全て拡張絵文字対応であると仮定すると、3.0機種の中から拡張絵文字対応機を拾うのではなく、 非対応の機種名にマッチしないユーザーエージェントを探した方が良いと思います。
【J-SH03のユーザーエージェント】(拡張絵文字非対応)
J-PHONE/2.0/J-SH03
【J-SH09のユーザーエージェント】(拡張絵文字非対応)
J-PHONE/3.0/J-SH09
【J-SH51のユーザーエージェント】(拡張絵文字対応)
J-PHONE/4.0/J-SH51 SH/0001aa Profile/MIDP-1.0 Configuration/CLDC-1.0
Ext-Profile/JSCL-1.1.0
# ↑ユーザーID(端末シリアル番号)通知OFFに設定してある場合
# 実際には上記のように改行は入らず、1行になっています。
【V301Dのユーザーエージェント】(拡張絵文字対応)
J-PHONE/3.0/V301D
<<サンプルスクリプト>>
#!/usr/local/bin/perl
my @agent = ();
my $add = 0;
my $USER_AGENT = $ENV{'HTTP_USER_AGENT'} || "Unknown";
if ($USER_AGENT !~ m{^J-PHONE/}) {
$add = 1;
} else {
@agent = split('/', $USER_AGENT);
if ($agent[1] > 3) { $add = 1; }
elsif (($agent[1] == 3) &&
($agent[2] !~ /(?:[KNS]A?0[3-5]|D0[3-7]|PE03|DN03|SH0[4-9]|T0[5-8]|NM0[12])/)) {
$add = 1;
}
}
# 「$add=0」なら拡張絵文字非対応
# 「$add=1」なら拡張絵文字対応
最終更新日:2006年9月02日