2008年8月11日月曜日

携帯UA まとめ

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

  1. パソコンのブラウザと同様に、ドコモ、au、ソフトバンクの各携帯電話のブラウザのユーザーエージェントをプログラムで取得することができます。

  2. ユーザーエージェントを利用して機種判別やキャリア判別を行うことができます。

  3. ユーザーエージェントには、ドコモなら「DoCoMo」、au・TU-KAなら「UP.Browser」、ソフトバンクなら「J-PHONE」、「Vodafone」、「SoftBank」という文字が含まれてます。

    これでキャリア判別を行います。

    ただし、Vodafoneの一部の機種に「UP.Browser」という文字がユーザーエージェントの途中に含まれています。

    「先頭の文字が何で始まるか」で判別した方が良いと思います。

  4. ユーザーエージェントには、機種名が含まれています。

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

    ユーザーエージェントは、機種ごとにたくさんありますが、書き方のパターンは以下のどれかに当てはまります。

    詳細は、各キャリア公式サイトを参照。

    • ドコモの例

      • タイプ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)

      • /c10や(c100)が付かず、機種名で終わる場合もある。

      • 個体識別情報は、個体識別情報を参照。



    • auの例

      • 旧タイプ

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

      • 新タイプ

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

      • auは機種名ではなく、デバイスタイプ(SN12など)で表記されている。

        デバイスタイプと製品名の対応表は、キャリアのサイトにある。



    • ソフトバンクの例

      • 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)/ブラウザバージョン/機種名/その他、になってます。





  6. IP帯域

    パソコンのブラウザでは、任意のユーザーエージェントに設定できるものがあります。

    ユーザーエージェントを携帯電話と同じにして、携帯サイトへアクセスされることも予想されます。

    完璧にパソコンからのアクセスを防ぐには、.htaccessなどで携帯電話で使われるIPアドレスの帯域を指定し、パソコンからのアクセスを防ぎます。

    各キャリアが使用しているIPの帯域は、公式サイトで公開されています。

  7. ホスト名

    ユーザーエージェントは、偽装できてもリモートのホスト名は、偽装できません。

    ユーザーエージェントの他にホスト名も判別に入れれば、より精度が高くなります。

    • ドコモ

      • 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フォン東京などの名残。






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

  • 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タイプとも取得できる)

      $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");





0 件のコメント:

コメントを投稿