Top > WAP全般 > 端末振り分け

端末振り分け

Perlスクリプトによる、いろいろな場面での端末振り分け法です。
端末判別法については、いろいろなサイトで、さまざまな方法が公開されています。
以下の記述は、それらのうちの1つの方法に過ぎないということをお含みの上でご覧下さい。


  1. WAP2.0機とHDML機を振り分ける
    1. ユーザーエージェントをチェックする
    2. 対応するMIMEタイプをチェックする
    3. マルチメディア情報をチェックする
  2. シミュレータを排除する
    1. サブスクライバIDによるシミュレータ排除
    2. リモートホストによるシミュレータ排除
  3. 白黒端末とカラー端末を振り分ける
    1. 対応するMIMEタイプで振り分け
    2. カラーサポート環境変数で振り分け
    3. GIF画像対応端末をピックアップ
  4. 各キャリアを振り分ける
    1. 簡易版
    2. PCをなるべく排除する
  5. 拡張絵文字対応機かどうか判断する
    1. EZwebの場合
    2. i-modeの場合
    3. Vodafoneの場合

1.WAP2.0機とHDML機を振り分ける

EZwebには、現在、WAP2.0対応機と、HDML機があります。
Webサーバー上のファイルがHDML・XHTMLどちらで記述されていても、ゲートウェイ変換により各端末で表示することが可能ですが、理想を言えば、WAP2.0機にはXHTMLを、HDML機にはHDMLを提供するのが一番よい方法です。
その為にはCGIなどにより、アクセスしてきた端末を、WAP2.0機とそれ以外の端末とに判別しなければなりません。

1-1.ユーザーエージェントをチェックする

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対応機

1-2.対応するMIMEタイプをチェックする

ブラウザが対応する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, */*

1-3.マルチメディア情報をチェックする

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対応機

2.シミュレータを排除する

Openwave™ シミュレータ等、パソコン上からのアクセスを排除する方法です。
サブスクライバIDチェックによる方法と、リモートホストチェックによる方法があります。

2-1.サブスクライバ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™社のリファレンスによると、

  1. 最大32桁
  2. _が含まれる
  3. Mobile Access Gateway Server のホスト名を含む

となっています。

2-2.リモートホストによるシミュレータ排除

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」なら、シミュレータ

3.白黒端末とカラー端末を振り分ける

白黒端末とカラー端末で表示させる画像を変えたい場合などに使います。

3-1.対応するMIMEタイプで振り分け

ブラウザが対応する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」なら白黒端末

3-2.カラーサポート環境変数で振り分け

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」なら白黒端末

3-3.GIF画像対応端末をピックアップ

一部の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」なら白黒端末

4.各キャリアを振り分ける

各携帯電話端末を、それぞれ用のページに振り分けるためのものです。

4-1.簡易版

主にユーザーエージェント情報のみで振り分ける単純なものです。
個人で運営するサイトなどは、これで充分ではないでしょうか。

<<サンプルスクリプト>>

#!/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

4-2.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

5.拡張絵文字対応機かどうか判断する

EZweb/i-mode/Vodafoneの新しい端末では、より多くの絵文字(拡張絵文字)が使えます。
拡張絵文字にはバラエティ豊かなデザインのものが揃っており、つい多用したくなりますが、非対応機種では表示することができません。
そこでアクセス端末が拡張絵文字に対応しているかどうかを、ユーザーエージェントなどの環境情報から判断してみます。

<(このページでの)拡張絵文字の定義>
EZweb 絵文字No.335〜822のもの(No.500〜518を除く)
i-mode シフトJISコードF9B1〜F9FCの範囲内のもの
vodafone 絵文字コードが、$O, $P, $Q で始まるもの
$QZ[\]^絵文字は除く

今後のHTTP環境変数情報の変化などにより、使えなくなる可能性がありますのでご留意ください。

5-1.EZwebの場合

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」なら拡張絵文字対応

5-2.i-modeの場合

ユーザーエージェントに /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」なら拡張絵文字対応

5-3.Vodafoneの場合

ユーザーエージェント情報に含まれるブラウザバージョンが、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」なら拡張絵文字対応

Go to Top

最終更新日:2006年9月02日
© Kimura [My First HDML] All Rights Reserved.