ホーム > PHP > [PHP] 携帯(モバイル)サイト作成用の関数

[PHP] 携帯(モバイル)サイト作成用の関数

<?php
//--------------------------------------------------------------------------
// 設定
//--------------------------------------------------------------------------
mb_internal_encoding('UTF-8');
mb_language('ja');

// 開発者のグローバルIPアドレス
define('DEV_IP_ADDRESS', '***.***.***.***');

// サイトURL
define('SITE_URL', 'http://example.com');

// Google Analytics の モバイル用アカウント
define('GA_ACCOUNT', 'MO-*******-**');
// Google Analytics の ga.php のパス
define('GA_PIXEL', '/ga.php');

define('MOBILE_CARRIER_UNKNOWN',  0);
define('MOBILE_CARRIER_DOCOMO',   1);
define('MOBILE_CARRIER_EZWEB',     2);
define('MOBILE_CARRIER_SOFTBANK', 3);
define('MOBILE_CARRIER_EMOBILE',  4);
define('MOBILE_CARRIER_IPHONE',   5);
define('MOBILE_CARRIER_PHS',      6);

//--------------------------------------------------------------------------
//携帯キャリアの判別
//--------------------------------------------------------------------------
function getMobileCarrier($user_agent = null) {
	$carrier = null;
	if ($user_agent === null) {
		$user_agent = $_SERVER['HTTP_USER_AGENT'];
	}
	if (strpos($user_agent, 'DoCoMo') !== false) {
		$carrier = MOBILE_CARRIER_DOCOMO;
	} elseif (preg_match('/KDDI|UP.Browser/', $user_agent)) {
		$carrier = MOBILE_CARRIER_EZWEB;
	} elseif (preg_match('/SoftBank|Vodafone|J-PHONE|MOT-C980|MOT-V980/', $user_agent))  {
		$carrier = MOBILE_CARRIER_SOFTBANK;
	} elseif (strpos($user_agent, 'emobile') !== false) {
		$carrier = MOBILE_CARRIER_EMOBILE;
	} elseif (strpos($user_agent, 'iPhone') !== false) {
		$carrier = MOBILE_CARRIER_IPHONE;
	} elseif (preg_match('/WILLCOM|DDIPOCKET/', $user_agent))  {
		$carrier = MOBILE_CARRIER_PHS;
	}
	return $carrier;
}

//--------------------------------------------------------------------------
// 機種固有番号の取得
//--------------------------------------------------------------------------
function getMobileUid($carrier = null){
	if ($carrier === null) {
		$carrier = getMobileCarrier();
	}
	$uid = null;
	if ($carrier == MOBILE_CARRIER_DOCOMO && isset($_SERVER["HTTP_X_DCMGUID"])) {
		$uid = $_SERVER['HTTP_X_DCMGUID'];
	} elseif ($carrier == MOBILE_CARRIER_EZWEB && isset($_SERVER['HTTP_X_UP_SUBNO'])) {
		$uid = $_SERVER['HTTP_X_UP_SUBNO'];
	} elseif ($carrier == MOBILE_CARRIER_SOFTBANK && isset($_SERVER['HTTP_X_JPHONE_UID'])) {
		$uid = $_SERVER['HTTP_X_JPHONE_UID'];
	} elseif ($carrier == MOBILE_CARRIER_SOFTBANK && preg_match("/SN[a-zA-Z0-9]+/", $_SERVER['HTTP_USER_AGENT'], $match)) {
		$uid = $match[0];
	} elseif ($carrier == MOBILE_CARRIER_EMOBILE && isset($_SERVER['HTTP_X_EM_UID'])) {
		$uid = $_SERVER['HTTP_X_EM_UID'];
	} elseif($_SERVER["REMOTE_ADDR"] === DEV_IP_ADDRESS){
		$uid = 'dev_dummy_uid';
	}
	return $uid;
};

//--------------------------------------------------------------------------
// 携帯キャリア毎のIPアドレス
//--------------------------------------------------------------------------
function getMobileIpAddresses($key = null) {
	$arr = array(
		#docomo 2010/05/14
		MOBILE_CARRIER_DOCOMO => array(
			'210.153.84.0/24',
			'210.136.161.0/24',
			'210.153.86.0/24',
			'124.146.174.0/24',
			'124.146.175.0/24',
			'202.229.176.0/24',
			'202.229.177.0/24',
			'202.229.178.0/24',
			'210.153.87.0/24',
			'203.138.180.0/24',
			'203.138.181.0/24',
			'203.138.203.0/24',
			),
		#ezweb 2010/05/14
		MOBILE_CARRIER_EZWEB => array(
			'210.230.128.224/28',
			'121.111.227.160/27',
			'61.117.1.0/28',
			'219.108.158.0/27',
			'219.125.146.0/28',
			'61.117.2.32/29',
			'61.117.2.40/29',
			'219.108.158.40/29',
			'219.125.148.0/25',
			'222.5.63.0/25',
			'222.5.63.128/25',
			'222.5.62.128/25',
			'59.135.38.128/25',
			'219.108.157.0/25',
			'219.125.145.0/25',
			'121.111.231.0/25',
			'121.111.227.0/25',
			'118.152.214.192/26',
			'118.159.131.0/25',
			'118.159.133.0/25',
			'118.159.132.160/27',
			'111.86.142.0/26',
			'111.86.141.64/26',
			'111.86.141.128/26',
			'111.86.141.192/26',
			'118.159.133.192/26',
			),

		#softbank 2010/05/14
		MOBILE_CARRIER_SOFTBANK => array(
			'123.108.237.0/27',
			'202.253.96.224/27',
			'210.146.7.192/26',
			'210.175.1.128/25',
			'123.108.237.224/27',
			'202.253.96.0/28',
		),

		#emobile 2010/05/14
		MOBILE_CARRIER_EMOBILE => array(
			'117.55.1.224/27',
			'117.55.1.128/26',
			'117.55.1.96/27',
			'117.55.65.0/28',
			),

		#willcom 2010/05/13
		MOBILE_CARRIER_PHS => array(
			'61.198.128.0/24',
			'61.198.129.0/24',
			'61.198.130.0/24',
			'61.198.131.0/24',
			'61.198.132.0/24',
			'61.198.133.0/24',
			'61.198.134.0/24',
			'61.198.135.0/24',
			'61.198.136.0/24',
			'61.198.137.0/24',
			'61.198.138.100/32',
			'61.198.138.101/32',
			'61.198.138.102/32',
			'61.198.138.103/32',
			'61.198.139.0/29',
			'61.198.139.128/27',
			'61.198.139.160/28',
			'61.198.140.0/24',
			'61.198.141.0/24',
			'61.198.142.0/24',
			'61.198.143.0/24',
			'61.198.160.0/24',
			'61.198.161.0/24',
			'61.198.162.0/24',
			'61.198.163.0/24',
			'61.198.164.0/24',
			'61.198.165.0/24',
			'61.198.166.0/24',
			'61.198.168.0/24',
			'61.198.169.0/24',
			'61.198.170.0/24',
			'61.198.171.0/24',
			'61.198.172.0/24',
			'61.198.173.0/24',
			'61.198.174.0/24',
			'61.198.175.0/24',
			'61.198.248.0/24',
			'61.198.249.0/24',
			'61.198.250.0/24',
			'61.198.251.0/24',
			'61.198.252.0/24',
			'61.198.253.0/24',
			'61.198.254.0/24',
			'61.198.255.0/24',
			'61.204.0.0/24',
			'61.204.2.0/24',
			'61.204.3.0/25',
			'61.204.3.128/25',
			'61.204.4.0/24',
			'61.204.5.0/24',
			'61.204.6.0/25',
			'61.204.6.128/25',
			'61.204.7.0/25',
			'61.204.92.0/24',
			'61.204.93.0/24',
			'61.204.94.0/24',
			'61.204.95.0/24',
			'114.20.49.0/24',
			'114.20.50.0/24',
			'114.20.51.0/24',
			'114.20.52.0/24',
			'114.20.53.0/24',
			'114.20.54.0/24',
			'114.20.55.0/24',
			'114.20.56.0/24',
			'114.20.57.0/24',
			'114.20.58.0/24',
			'114.20.59.0/24',
			'114.20.60.0/24',
			'114.20.61.0/24',
			'114.20.62.0/24',
			'114.20.63.0/24',
			'114.20.64.0/24',
			'114.20.65.0/24',
			'114.20.66.0/24',
			'114.20.67.0/24',
			'114.21.255.0/27',
			'125.28.0.0/24',
			'125.28.1.0/24',
			'125.28.15.0/24',
			'125.28.16.0/24',
			'125.28.17.0/24',
			'125.28.2.0/24',
			'125.28.3.0/24',
			'125.28.4.0/24',
			'125.28.5.0/24',
			'125.28.8.0/24',
			'210.168.246.0/24',
			'210.168.247.0/24',
			'210.169.92.0/24',
			'210.169.93.0/24',
			'210.169.94.0/24',
			'210.169.95.0/24',
			'210.169.96.0/24',
			'210.169.97.0/24',
			'210.169.98.0/24',
			'210.169.99.0/24',
			'211.126.192.128/25',
			'211.18.232.0/24',
			'211.18.233.0/24',
			'211.18.234.0/24',
			'211.18.235.0/24',
			'211.18.236.0/24',
			'211.18.237.0/24',
			'219.108.10.0/24',
			'219.108.11.0/24',
			'219.108.12.0/24',
			'219.108.13.0/24',
			'219.108.14.0/24',
			'219.108.15.0/24',
			'219.108.7.0/24',
			'219.108.8.0/24',
			'219.108.9.0/24',
			'221.119.0.0/24',
			'221.119.1.0/24',
			'221.119.2.0/24',
			'221.119.3.0/24',
			'221.119.4.0/24',
			'221.119.6.0/24',
			'221.119.7.0/24',
			'221.119.8.0/24',
			'221.119.9.0/24',
			'219.108.2.0/24',
			'219.108.3.0/24',
			'125.28.6.0/24',
			'125.28.7.0/24',
			'125.28.11.0/24',
			'125.28.12.0/24',
			'125.28.13.0/24',
			'125.28.14.0/24',
			'211.18.238.0/24',
			'211.18.239.0/24',
			'219.108.4.0/24',
			'219.108.5.0/24',
			'219.108.6.0/24',
			'221.119.5.0/24',
			'124.211.23.0/26',
			),

		#Google 2010/05/14
		GOOGLE_IP => array(
			'72.14.199.0/25',
			'209.85.238.0/25',
			),
		#Yahoo 2010/05/14
		YAHOO_IP => array(
			'124.83.159.146',
			'124.83.159.147',
			'124.83.159.148',
			'124.83.159.149',
			'124.83.159.150',
			'124.83.159.151',
			'124.83.159.152',
			'124.83.159.153',
			'124.83.159.154',
			'124.83.159.155',
			'124.83.159.156',
			'124.83.159.157',
			'124.83.159.158',
			'124.83.159.159',
			'124.83.159.160',
			'124.83.159.161',
			'124.83.159.162',
			'124.83.159.163',
			'124.83.159.164',
			'124.83.159.165',
			'124.83.159.166',
			'124.83.159.167',
			'124.83.159.168',
			'124.83.159.169',
			'124.83.159.170',
			'124.83.159.171',
			'124.83.159.172',
			'124.83.159.173',
			'124.83.159.174',
			'124.83.159.175',
			'124.83.159.176',
			'124.83.159.177',
			'124.83.159.178',
			'124.83.159.179',
			'124.83.159.180',
			'124.83.159.181',
			'124.83.159.182',
			'124.83.159.183',
			'124.83.159.184',
			'124.83.159.185',
			'124.83.159.224',
			'124.83.159.225',
			'124.83.159.226',
			'124.83.159.227',
			'124.83.159.228',
			'124.83.159.229',
			'124.83.159.230',
			'124.83.159.231',
			'124.83.159.232',
			'124.83.159.233',
			'124.83.159.234',
			'124.83.159.235',
			'124.83.159.236',
			'124.83.159.237',
			'124.83.159.238',
			'124.83.159.239',
			'124.83.159.240',
			'124.83.159.241',
			'124.83.159.242',
			'124.83.159.243',
			'124.83.159.244',
			'124.83.159.245',
			'124.83.159.246',
			'124.83.159.247',
			),

		#livedoor 2010/05/14
		LIVEDOOR_IP => array(
			'203.104.254.0/24',
			),

		#goo 2010/05/14
		GOO_IP => array(
			'210.150.10.32/27',
			'203.131.253.0/24',
			'203.131.250.0/24',
			'203.131.251.0/24',
			'203.131.252.0/24',
			'203.131.254.0/24',
			'203.131.255.0/24',
			),

		#froute 2010/05/14
		FROUTE_IP => array(
			'60.43.36.253',
			),

		#DeNA 2010/05/14
		DENA => array(
			'202.238.103.126',
			'202.213.221.97',
			),
	);
	return isset($arr[$key]) ? $arr[$key] : $arr;
}

//--------------------------------------------------------------------------
// 携帯IPアドレスの判定
//--------------------------------------------------------------------------
function validMobileIpAddresses($carrier = null) {
	if ($carrier === null) {
		$carrier = getMobileCarrier();
	}
	//PEAR Net_IPv4の読み込み
	require_once("Net/IPv4.php");
	$flg = false;
	$carrier_ip_addresses = getMobileIpAddresses($carrier);
	if (!empty($carrier_ip_addresses)) {
		foreach ($carrier_ip_addresses as $val) {
			if (Net_IPv4::ipInNetwork($_SERVER["REMOTE_ADDR"], $val) === true || $_SERVER['REMOTE_ADDR'] === $val) {
				$flg = true;
			}
		}
	}
	return $flg;
}

//--------------------------------------------------------------------------
// Google Analytics
//--------------------------------------------------------------------------
function googleAnalyticsGetImageUrl() {
	global GA_ACCOUNT, GA_PIXEL;
	$url = SITE_URL;
	$url .= GA_PIXEL . "?";
	$url .= "utmac=" . GA_ACCOUNT;
	$url .= "&utmn=" . rand(0, 0x7fffffff);
	$referer = $_SERVER["HTTP_REFERER"];
	$query = $_SERVER["QUERY_STRING"];
	$path = $_SERVER["REQUEST_URI"];
	if (empty($referer)) {
		$referer = "-";
	}
	$url .= "&utmr=" . urlencode($referer);
	if (!empty($path)) {
		$url .= "&utmp=" . urlencode($path);
	}
	$url .= "&guid=ON";
	return str_replace("&", "&", $url);
}

//---------------------------------------------------------------------------
// 各携帯キャリアの入力モード
//---------------------------------------------------------------------------
function getMobileInputMode ($key = null) {
	switch (getMobileCarrier()) {
		case 'docomo':
			$arr[0] = "istyle";
			$arr[1] = 1;//ひらがな/漢字
			$arr[2] = 2;//カタカナ
			$arr[3] = 3;//アルファベット
			$arr[4] = 4;//数字
			break;
		case 'au':
			$arr[0] = "format";
			$arr[1] = "*M";
			$arr[2] = "*M";
			$arr[3] = "*m";
			$arr[4] = "*N";
			break;
		case 'softbank':
			$arr[0] = "mode";
			$arr[1] = "hiragana";
			$arr[2] = "katakana";
			$arr[3] = "alphabet";
			$arr[4] = "numeric";
			break;
		default:
			$arr[0] = "istyle";
			$arr[1] = 1;
			$arr[2] = 2;
			$arr[3] = 3;
			$arr[4] = 4;
			break;
	}
	return isset($arr[$key]) ? $arr[$key] : $arr;
}

//---------------------------------------------------------------------------
// 携帯メールアドレス
//---------------------------------------------------------------------------
function getMobileEmails($key = null) {
	$arr = array(
		1 => '@docomo.ne.jp',//Docomo
		2 => '@ezweb.ne.jp',//EZWEB
		3 => '@softbank.ne.jp',//SoftBank
		4 => '@disney.ne.jp',
		5 => '@d.vodafone.ne.jp',
		6 => '@h.vodafone.ne.jp',
		7 => '@t.vodafone.ne.jp',
		8 => '@c.vodafone.ne.jp',
		9 => '@k.vodafone.ne.jp',
		10 => '@r.vodafone.ne.jp',
		11 => '@s.vodafone.ne.jp',
		12 => '@n.vodafone.ne.jp',
		13 => '@q.vodafone.ne.jp',
		14 => '@jp-d.ne.jp',
		15 => '@jp-h.ne.jp',
		16 => '@jp-t.ne.jp',
		17 => '@jp-c.ne.jp',
		18 => '@jp-k.ne.jp',
		19 => '@jp-r.ne.jp',
		20 => '@jp-s.ne.jp',
		21 => '@jp-n.ne.jp',
		22 => '@jp-q.ne.jp',
		23 => '@i.softbank.jp',//iPhone
		24 => '@pdx.ne.jp',
		25 => '@emnet.ne.jp',//EMOBILE
		26 => '@willcom.com',//WILLCOM
	);
	return isset($arr[$key]) ? $arr[$key] : $arr;
}

//---------------------------------------------------------------------------
// 携帯メールアドレスか否かの判定
//---------------------------------------------------------------------------
function isMobileEmail() {
	$flg = false;
	foreach ($arr as $key => $val) {
		if (stripos($email, $val) !== false) {
			$flg = true;
			break;
		}
	}
	return $flg;
}
?>

DoCoMo用の処理の例

// ヘッダーの送信 と guidの付与
$guid = '';
if (getMobileCarrier() === MOBILE_CARRIER_DOCOMO) {
	header('Content-Type:application/xhtml+xml'."\n");
	$guid = '?guid=ON';
}

// URLにセッションを付与する例
//「Docomo の User Agent」 + 「Docomo の uid」 + 「Docomo の IPアドレス」のすべてに一致した場合のみ使用
$sess_id = '';
if (getMobileCarrier() === MOBILE_CARRIER_DOCOMO &&
		getMobileUid() == $_SERVER['HTTP_X_DCMGUID'] &&
		validMobileIpAddresses(MOBILE_CARRIER_DOCOMO)
{
	ini_set('session.use_cookies', 0);
	session_start();
	$sess_id = session_name().'='.session_id();
	$sess_id = htmlspecialchars($sess_id);
}

こちらもあわせてどうぞ

  1. [PHP] 携帯サイトの入力フォームを、各キャリアに対応した入力モードにする方法
  2. [PHP] Basic認証を実装する方法
カテゴリー: PHP タグ: ,
  1. php fun
    2010 年 6 月 19 日 14:47 | #1

    機種固有番号の取得のfunctionの中の
    $carrer 変数が間違いましたみたいですね!

  2. admin
    2010 年 7 月 6 日 20:51 | #2

    >php fun さん
    スペルミスでしたね。
    ご指摘ありがとうございました。

  1. トラックバックはまだありません。