目前日本的手机运营商主要是三大运营商:docomo、au和softbank。在手机web开发中,获取和判定客户终端的类型都是通过分析”user-agent“里的信息来实现的。各运营商在user-agent里包含了的对应文字列如下:

docomo:「DoCoMo」
au・TU-KA:「UP.Browser」
softbank:「J-PHONE」、「Vodafone」、「SoftBank」

通过上面这些,可以判断手机的运营商类型。

注意:有一部分的Vodafone手机的user-agent里耶包含了「UP.Browser」,所以判断字符的时候,应该是判断user-agent是什么开头的。


1.各大运营商的user-agent格式

(1)i-mode [NTT DoCoMo(R)]

i-mode对应HTML1.0

DoCoMo/1.0/机器类型名

i-mode对应HTML2.0

DoCoMo/1.0/机器类型名/运营商

    i-mode对应HTML3.0

DoCoMo/1.0/机器类型名运营商/机器个体识别

    FOMA

DoCoMo/2.0<SP>机器类型名(运营商;机器个体识别)

    i-mode对应カーナビシリーズ

DoCoMo/1.0/机器类型名

(2)J-PHONE [J-PHONE(R)]

    J-スカイ对应机器类型:

J-PHONE/浏览器版本/机器类型名

    ステーション对应机器类型

J-PHONE/浏览器版本/机器类型名

    J-スカイ パケット对应机器类型

J-PHONE/浏览器版本/机器类型名/机器个体识别 制造编号/user-agent版本号 Java情报(Profile/ Configuration) Java扩展版本(Ext-Profile)

(3)au [KDDI(R)]

     cdmaOne3000,5000 Series

KDDI-机器种类名 浏览器名/浏览器版本 服务器名

     cdmaOne200,300,400,1000Series,Digital,TU-KA

浏览器名-机器种类名 服务器名



2.一些user-agent的例子

(1)docomo

    type1 (MOVA)

DoCoMo/1.0/N503i/c10

     设定了唯一ID时


DoCoMo/1.0/N503i/c10/ser12345678901

    type2 (FORM)

DoCoMo/2.0 N901iS(c100;TB;W24H12)

     设定了唯一ID时

DoCoMo/2.0 N901iS(c100;TB;W24H12;ser123456789012345;icc12345678901234567890)

    P-07A

DoCoMo/2.0 P07A3(c500;TB;W24H15)

    也有些是没有/c10或(c100),而直接以机器类型名结束的。


  (2)au

        旧type 

UP.Browser/3.04-SN12 UP.Link/3.4.4

        新type

KDDI-HI21 UP.Browser/6.0.2.254 (GUI) MMP/1.1

       在user-agent里没有直接包含机器种类名,而是包含了device id,可以在运营商的网站上找到device id和机器种类名的对照。上面的例子中,SN12和HI21就是device id。网上应该有通过device id获取机器种类名的library。


     (3)softbank

           SoftBank 4-2 Series(JPHONE时代的)

J-PHONE/3.0/J-SH07

           SoftBank 6-5 Series(JPHONE时代的)


J-PHONE/4.0/J-SH51/SN12345678901 SH/0001a Profile/MIDP-1.0 Configuration/CLDC-1.0

           SoftBank 3G Series(vodafone时代的)


Vodafone/1.0/V904SH/SHJ001/SN123456789012345 Browser/VF-NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1

           SoftBank 3G Series(softbank时代的)


SoftBank/1.0/910T/TJ001/SN123456789012345 Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1

      基本上、user-agent的构成是:J-PHONE(or Vodafone or SoftBank)/浏览器版本/机器种类名/其它


3.限制手机以外(普通电脑)等访问的方法

     一是,可以通过user-agent内容来判断,但是http访问的头信息是可以人为模拟的。

     二是,通过IP判断(即在服务器上的.htaccess里或者代码里过滤),跟大运营商的IP都有自己的范围,同时,这些范围信息是对外开放的。

     各大运营商的IP范围信息参考:http://memorva.jp/memo/mobile/allow_ip.php

     伪装手机访问的方法参考:http://memorva.jp/memo/mobile/ua_uid_test.php


4.host名

   在判断运营商时,如果加上host的判断,会更加精确。(但是DNS的正确性不能保证)

   docomo

docomo.ne.jp

   au

ezweb.ne.jp

   softbank

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



5.运营商判别的示例代码

 (1)perl 

#只通过user-agent判断
$agent = $ENV{'HTTP_USER_AGENT'};
if($agent =~ /^DoCoMo/){

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

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

}


#同时通过host判断
$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$/){

}



 (2)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)){

}



 (3)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){

}



6.机器类型判别示例代码(取得机器类型名)
  Perl
    docomo

$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(两种type都能取得,但是如上所述,取到的是device id,需要自己去找对照的机器类型名)     

$agent = $ENV{'HTTP_USER_AGENT'};
$device = substr($agent, (index($agent, "-") + 1), (index($agent, " ") - index($agent, "-") - 1));



     softbank(只有通过x-jphone-msname的机器类型名才能取得)       

$device = $ENV{'HTTP_X_JPHONE_MSNAME'};



  PHP


    docomo      

$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(两种type都能取得)        

$agent = $_SERVER{'HTTP_USER_AGENT'};
$device = substr($agent, (strpos($agent, "-") + 1), (strpos($agent, " ") - strpos($agent, "-") - 1));



    softbank(只有通过x-jphone-msname的才能取得) 

$device = $_SERVER{'HTTP_X_JPHONE_MSNAME'};



  Java


    docomo     

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(两种type都能取得)       

String agent = request.getHeader("user-agent");
String device = agent.substring(agent.indexOf("-") + 1, agent.indexOf(" "));



    softbank(只有通过x-jphone-msname的才能取得)       

String device = request.getHeader("x-jphone-msname");