MEMORVA

携帯ブラウザのユーザーエージェント(User-Agent)による機種判別、キャリア判別

更新:

ドコモ、au、ソフトバンクの携帯ブラウザのユーザーエージェントによる機種判別、キャリア判別。

携帯ブラウザのユーザーエージェント

ドコモ、au、ソフトバンクの各携帯電話のブラウザのユーザーエージェントは、パソコンのブラウザと同様にプログラムで取得することができる。
ユーザーエージェントを利用してキャリアの判別や機種判別を行うことができる。
ユーザーエージェントには、ドコモなら「DoCoMo」、au・TU-KAなら「UP.Browser」、ソフトバンクなら「J-PHONE」、「Vodafone」、「SoftBank」という文字列が含まれている。
これらの文字列を調べることで携帯電話のキャリアを判別することができる。
ただし、Vodafoneの一部の機種は、「UP.Browser」という文字列がユーザーエージェントの途中に含まれている。
キャリアを判別する場合は、「ユーザーエージェントの先頭の文字が何で始まるか」で判別した方が良いと思われる。

また、ユーザーエージェントには機種名の文字列が含まれているので、機種の判別を行うことができ、それを用いてページの表示やダウンロードさせるものを機種ごとに分けることができる。


ユーザーエージェントのサンプル

ユーザーエージェントは機種ごとにたくさんあるが、書き方のパターンは以下のどれかに当てはまる。
詳細は各キャリア公式サイトを参照。

ドコモ

  • タイプ1(MOVA)
    DoCoMo/1.0/N503i/c10
    個体識別情報を得た場合は、
    DoCoMo/1.0/N503i/c10/ser12345678901
  • タイプ2(FOMA)
    DoCoMo/2.0 N901iS(c100;TB;W24H12)
    個体識別情報を得た場合は、
    DoCoMo/2.0 N901iS(c100;TB;W24H12;ser123456789012345;icc12345678901234567890)

    P-07A のユーザーエージェント
    DoCoMo/2.0 P07A3(c500;TB;W24H15)
    ドコモ端末のユーザーエージェント

/c10や(c100)が付かず、機種名で終わる場合もある。
iモードブラウザ2.0 かどうかを見分けるには、キャッシュが500(c500)であるかを調べるしか方法がない。
個体識別情報は個体識別情報を参照。

au

  • 旧タイプ
    UP.Browser/3.04-SN12 UP.Link/3.4.4
  • 新タイプ
    KDDI-HI21 UP.Browser/6.0.2.254 (GUI) MMP/1.1

機種の名称は、デバイスID(デバイスタイプ)と呼ばれる名称で表記されている。
上の例だとSN12やHI21がデバイスID。
デバイスIDと製品名の対応表はキャリアのサイトにある。
デバイスIDを機種名に直したい場合は、変換処理を自作するかライブラリを探す。
機種名をデバイスIDで表現するのは au の仕様。
機種名を直接取得する方法はない。

ソフトバンク

SoftBank 4-2 Series(Jフォン時代のもの)
J-PHONE/3.0/J-SH07
SoftBank 6-5 Series(Jフォン時代のもの)
J-PHONE/4.0/J-SH51/SN12345678901 SH/0001a Profile/MIDP-1.0 Configuration/CLDC-1.0
SoftBank 3G Series(ボーダフォン時代のもの)
Vodafone/1.0/V904SH/SHJ001/SN123456789012345 Browser/VF-NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1
SoftBank 3G Series(ソフトバンク時代のもの)
SoftBank/1.0/910T/TJ001/SN123456789012345 Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1

基本的に、J-PHONE(or Vodafone or SoftBank)/ブラウザバージョン/機種名/その他、という構成になっている。


IP帯域とホスト名

パソコンのブラウザには任意のユーザーエージェントを設定できるものがある。
ユーザーエージェントを偽装できるブラウザを使わなくても、telnetを利用したり、アプリケーションを自作することで任意のヘッダ情報を持たせて通信を行うことができる。
ユーザーエージェントを携帯電話と同じものにして携帯サイトへアクセスするユーザーがいることも予想される。
パソコンからのアクセスを防ぐには、ネットワーク機器や.htaccessなどで携帯電話で使用されているIPアドレス帯域からのアクセスのみ許可する設定を行う。
各キャリアが使用しているIPの帯域は、キャリアのサイトで公開されている。
IP帯域については 携帯キャリアのIPアドレス帯域 をご覧下さい。
偽装方法については 携帯サイトの動作テスト をご覧下さい。

ユーザーエージェントの他にホスト名もキャリアの判別に入れれば、より判別の精度が高くなる。
ただし、DNSの情報が正しいとは限らない。

  • ドコモ
    docomo.ne.jp
  • au
    ezweb.ne.jp
  • ソフトバンク
    jp-d.ne.jp
    jp-h.ne.jp
    jp-t.ne.jp
    jp-c.ne.jp
    jp-k.ne.jp
    jp-r.ne.jp
    jp-n.ne.jp
    jp-s.ne.jp
    jp-q.ne.jp

jp-t などのアドレスは、Jフォン東京(J-PHONE TOKYO)などの名残り。
地域ごとに、Jフォン関西、Jフォン九州などがあった。


キャリア判別のサンプルソース

Perlの例
#ユーザーエージェントのみで判別する場合
$agent = $ENV{'HTTP_USER_AGENT'};
if($agent =~ /^DoCoMo/){

}elsif($agent =~ /^J-PHONE|^Vodafone|^SoftBank/){

}elsif($agent =~ /^UP.Browser|^KDDI/){

}


#ホスト名も判別する場合
$agent = $ENV{'HTTP_USER_AGENT'};
$host = $ENV{'REMOTE_HOST'};
if($agent =~ /^DoCoMo/ && $host =~ /.+docomo\.ne\.jp$/){

}elsif($agent =~ /^J-PHONE|^Vodafone|^SoftBank/ && $host =~ /.+jp-.\.ne\.jp$/){

}elsif($agent =~ /^UP.Browser|^KDDI/ && $host =~ /.+ezweb\.ne\.jp$/){

}

PHPの例
$agent = $_SERVER['HTTP_USER_AGENT']; 
if(ereg("^DoCoMo", $agent)){

}else if(ereg("^J-PHONE|^Vodafone|^SoftBank", $agent)){

}else if(ereg("^UP.Browser|^KDDI", $agent)){

}

Javaの例
String agent = request.getHeader("user-agent"); 
if(agent.indexOf("DoCoMo") == 0){

}else if(agent.indexOf("J-PHONE") == 0 || agent.indexOf("Vodafone") == 0 || agent.indexOf("SoftBank") == 0){

}else if(agent.indexOf("UP.Browser") == 0 || agent.indexOf("KDDI") == 0){

}


機種判別のサンプルソース(機種名を取得する)

Perlの例

  • ドコモ
    $agent = $ENV{'HTTP_USER_AGENT'};
    if(index($agent, "DoCoMo/1.0") >= 0 && index($agent, "/", 11) >= 0){
    $device = substr($agent, 11, (index($agent, "/", 11) - 11));
    }elsif(index($agent, "DoCoMo/2.0") >= 0 && index($agent, "(", 11) >= 0){
    $device = substr($agent, 11, (index($agent, "(", 11) - 11));
    }else{
    $device = substr($agent, 11);
    }
    
  • au(エージェントは2タイプとも取得できる)
    上述の通り、auで取得できるのは機種名ではなくデバイスIDです。
    $agent = $ENV{'HTTP_USER_AGENT'};
    $device = substr($agent, (index($agent, "-") + 1), (index($agent, " ") - index($agent, "-") - 1));
    
  • ソフトバンク(x-jphone-msnameで機種名だけ取得できる)
    $device = $ENV{'HTTP_X_JPHONE_MSNAME'};
    

PHPの例

  • ドコモ
    $agent = $_SERVER{'HTTP_USER_AGENT'};
    if(strpos($agent, "DoCoMo/1.0") >= 0 && strpos($agent, "/", 11) >= 0){
    $device = substr($agent, 11, (strpos($agent, "/", 11) - 11));
    }elsif(strpos($agent, "DoCoMo/2.0") >= 0 && strpos($agent, "(", 11) >= 0){
    $device = substr($agent, 11, (strpos($agent, "(", 11) - 11));
    }else{
    $device = substr($agent, 11);
    }
    
  • au(エージェントは2タイプとも取得できる)
    $agent = $_SERVER{'HTTP_USER_AGENT'};
    $device = substr($agent, (strpos($agent, "-") + 1), (strpos($agent, " ") - strpos($agent, "-") - 1));
    
  • ソフトバンク(x-jphone-msnameで機種名だけ取得できる)
    $device = $_SERVER{'HTTP_X_JPHONE_MSNAME'};
    

Javaの例

  • ドコモ
    String agent = request.getHeader("user-agent");
    String device = "";
    if(agent.indexOf("DoCoMo/1.0") >= 0 && agent.indexOf("/", 11) >= 0){
    device = agent.substring(11, agent.indexOf("/", 11));
    }else if(agent.indexOf("DoCoMo/2.0") >= 0 && agent.indexOf("(", 11) >= 0){
    device = agent.substring(11, agent.indexOf("(", 11));
    }else{
    device = agent.substring(11);
    }
    
  • au(エージェントは2タイプとも取得できる)
    String agent = request.getHeader("user-agent");
    String device = agent.substring(agent.indexOf("-") + 1, agent.indexOf(" "));
    
  • ソフトバンク(x-jphone-msnameで機種名だけ取得できる)
    String device = request.getHeader("x-jphone-msname");