PHP
ガラケー

ガラケープログラミング

More than 1 year has passed since last update.


はじめに

最近は、ガラケー向けサイトを構築することもなくなりました。

ガラケー向けサイトを作ったことがない人も増えてきていると思います。

今回は、ガラケー向けサイトを作る上で、利用したテクニックを紹介します。

サンプルコードは、すべてPHPです。

2013年ごろの情報をもとに記述しています。現在と仕様が異なる場合があります。


ユーザーエージェント

ユーザーエージェントからキャリアを判定します。

はじめに、ユーザーエージェントを取得する方法です。

$agent = (isset($_SERVER['HTTP_USER_AGENT']) && !empty($_SERVER['HTTP_USER_AGENT'])) ? $_SERVER['HTTP_USER_AGENT'] : '';

ドコモのとき、trueを返します。

ereg("^DoCoMo", $agent) == 1;

auのとき、trueを返します。

ereg("^UP.Browser|^KDDI", $agent) == 1;

ソフトバンクのとき、trueを返します。J-PHONEやVodafoneもソフトバンクとします。

ereg("^J-PHONE|^Vodafone|^SoftBank", $agent) == 1;

Willcomのとき、trueを返します。

strpos($agent, 'WILLCOM') || strpos($agent, 'SHARP/WS') || strpos($agent, 'DDIPOCKET') == 1;


Cookieサポート判定

iモードブラウザ1.0、iモードブラウザ2.0の一部端末では、Cookieが利用できません。

一度、Cookieに値を書き込んで、その値が読み取れるかでCookieが利用できるか判定します。

// cookieが使えるか判定するために1を入れておく

@setcookie('cookie', '1', 0, '/');
(preg_match('/^DoCoMo\/1.0/', $agent) || preg_match('/^DoCoMo\/2.0[^(]+\(c100;/', $agent) || @$_COOKIE['cookie'] != 1);

Cookieが利用できない場合、セッションIDを付与したURLを作成する必要があります。

$url = $url.(strpos($url, '?') == false) ? '?' : '&'.session_name().'='.session_id();


IPアドレス

IPアドレスからキャリアを判定します。

OpenPNEの携帯電話IPアドレス帯域リストからymlファイルを入手します。

例えば、ドコモのIPアドレス帯域は、以下のとおりです。

docomo:

- 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.136.161.0/24
- 210.153.84.0/24
- 210.153.86.0/24

IPアドレスを取得します。


$ip = $_SERVER['REMOTE_ADDR'];

/* HTTP_X_FORWARDED_FORがある場合は上書きする */
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

ymlファイルを読み込みます。yaml拡張モジュールが必要です。

$table = yaml_parse_file(dirname(__FILE__).DIRECTORY_SEPARATOR.'mobile_ip_address.yml');

このIPアドレス帯域リストにIPアドレスが含まれているか確認します。

$carrier = 0;

foreach($table as $c => $caddrs){
foreach($caddrs as $check_addr){
list($p_ip, $mask) = explode("/", $check_addr);
$ip_long = ip2long($p_ip) >> (32 - $mask);
$p_ip_long = ip2long($ip) >> (32 - $mask);
if($ip_long == $p_ip_long) {
$carrier = $c;
break;
}
}
}