のお勉強

マックのモバイル使ったキャンペーンを見つけました。
ためしにPCブラウザから閲覧できるかやってみた。

結果はNG。
TOPページでキャリア判別してはじいているんですね。

    • やってみたこと--

http://e.mcd.jp
  ↓
ブラウザ NG

携帯
  ↓
  OK
URL
http://www.macdonalds.co.jp/mobile/i/kidsday2006/index.html
 ↑PCからはNG

ふ〜〜ん。

ユーザーエージェントを判別するプログラムのサンプルを見つけま
した。
元ネタ
http://memorva.jp/memo/mobile/http_user_agent.php

    • <<以下引用>>---

■携帯ブラウザのユーザーエージェント
パソコンのブラウザと同様に、ドコモ、auボーダフォンの各携帯電話のブラウザのユーザーエージェントをプログラムで取得することができます。
ユーザーエージェントを利用して機種判別やキャリア判別を行うことができます。
ユーザーエージェントには、ドコモなら「DoCoMo」、auTU-KAなら「UP.Browser」、ボーダフォンなら「J-PHONE」という文字が含まれてます。
これでキャリア判別を行います。
ユーザーエージェントには、機種名が含まれてます。
ユーザーエージェントのサンプル
ユーザーエージェントは、機種ごとにたくさんありますが、書き方のパターンは以下のどれかに当てはまります。
詳細は、各キャリア公式サイトを参照。
ドコモの例
タイプ1(MOVA
DoCoMo/1.0/N503i/c10
タイプ2(FOMA
DoCoMo/2.0 N901iS(c100;TB;W24H12)
/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など)で表記されている。
バイスタイプと製品名の対応表は、キャリアのサイトにある。
ボーダフォンの例
パケット非対応機
J-PHONE/3.0/J-SH07
パケット対応機
J-PHONE/4.0/J-SH51/SN******** SH/0001a Profile/MIDP-1.0 Configuration/CLDC-1.0
基本的にJ-PHONE/ブラウザバージョン/機種名/その他、になってます。
パソコン版のブラウザでは、任意のユーザーエージェントに設定できるものがあります。
ユーザーエージェントを携帯電話と同じにして、携帯サイトへアクセスされることも予想されます。
完璧にパソコンからのアクセスを防ぐには、.htaccessなどで携帯電話で使われるIPアドレスの帯域を指定し、パソコンからのアクセスを防ぎます。
各キャリアが使用しているIPの帯域は、公式サイトで公開されてます。
その他の情報は、携帯サイト作成、携帯ホームページを参照。
■キャリア判別のサンプルソース
CGIPerl)の場合
$agent = $ENV{'HTTP_USER_AGENT'};
if($agent =~ /DoCoMo/){

}elsif($agent =~ /J-PHONE/){

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

}

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

}else if(ereg("J-PHONE", $agent)){

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

}

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

}else if(agent.indexOf("J-PHONE") >= 0){

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

}

■機種判別のサンプルソース(機種名を取得する)
CGIPerl)の場合
ドコモ
$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);
}

ボーダフォン(x-jphone-msnameで機種名だけ取得できる)
$device = $ENV{'HTTP_X_JPHONE_MSNAME'};

au(エージェントは、2タイプとも取得できる)
$agent = $ENV{'HTTP_USER_AGENT'};
$device = substr($agent, (index($agent, "-") + 1), (index($agent, " ") - index($agent, "-") - 1));

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);
}

ボーダフォン(x-jphone-msnameで機種名だけ取得できる)
$device = $_SERVER{'HTTP_X_JPHONE_MSNAME'};

au(エージェントは、2タイプとも取得できる)
$agent = $_SERVER{'HTTP_USER_AGENT'};
$device = substr($agent, (strpos($agent, "-") + 1), (strpos($agent, " ") - strpos($agent, "-") - 1));

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);
}

ボーダフォン(x-jphone-msnameで機種名だけ取得できる)
String device = request.getHeader("x-jphone-msname");

au(エージェントは、2タイプとも取得できる)
String agent = request.getHeader("user-agent");
String device = agent.substring(agent.indexOf("-") + 1, agent.indexOf(" "));