携帯をIPベースで判定
最近よくCodeIgniterを使っているんだけど*1、結構おもしろい。
ZendFrameworkはあらかじめ用意されている部品が多くて、至れり尽くせりだけど重かった。*2
CIは軽いんだけどシンプルなので、必要になったら自分で作れって事らしい。*3
練習がてら*4にIP判定クラスを作ってみた。
MobileIP
http://miscast.org/files/mobileip.zip
上記ファイルをCIにぶち込んでください。
使い方は
$this->load->library('mobileip'); print $this->mobileip->get_remote_carrier(); if($this->mobileip->ismobile()){ 〜〜 }
で使えます。
当然、携帯だけでテストなんてやってられないので
$this->mobileip->set_remote_ip('202.229.176.199');
でRemoteIPを上書きしてテストできます。
Config説明
キャッシュフォルダ
// cache directory
$config['mobileip_cache_dir'] = '../system/cache/';
index.php から見た相対表記になります。
CIはユーザーにCacheを直接触ることを考慮してないらしく、
変数がなかったので追記してます。
// cache directory
$config['mobileip_cache_dir'] = BASEPATH . 'cache/';
index.php から見た相対表記になります。
BASEPATHは思いっきりあちこちに書いてありました・・・(..;)
IPリストの生成場所はキャッシュディレクトリにしてあります。
キャッシュファイル生成
// carrier URL $config['mobileip_carrier_url']['au'] = 'http://www.au.kddi.com/ezfactory/tec/spec/ezsava_ip.html'; $config['mobileip_carrier_url']['docomo'] = 'http://www.nttdocomo.co.jp/service/imode/make/content/ip/'; $config['mobileip_carrier_url']['softbank'] = 'http://creation.mb.softbank.jp/web/web_ip.html'; $config['mobileip_carrier_url']['willcom'] = 'http://www.willcom-inc.com/ja/service/contents_service/create/center_info/'; $config['mobileip_carrier_url']['em'] = 'http://developer.emnet.ne.jp/ipaddress.html';
各キャリアのIP一覧が載ってるURLです。
上記URLからIPアドレス一覧を抜いてきて、キャッシュフォルダにIPリストを生成してます。
キャリアが増えたり減ったり、上記URLが変更になったときは書き換えてください。
書き換えた後は、キャッシュフォルダ内の ip_xxxx.txt を削除してください。
次回アクセス時に自動生成します。
キャリア名
// carrier name $config['mobileip_carrier_name']['au'] = 'au'; $config['mobileip_carrier_name']['docomo'] = 'docomo'; $config['mobileip_carrier_name']['softbank'] = 'softbank'; $config['mobileip_carrier_name']['willcom'] = 'willcom'; $config['mobileip_carrier_name']['em'] = 'em';
$this->mobileip->get_remote_carrier();
したときに帰ってくる名前です。
Vodafone -> Softbank みたいに名前変わったときくらいしか使わないですけどね・・・。
キャッシュファイルの更新
// ip list reload time $config['mobileip_reload_time'] = 60*60*24;
アクセス時にキャッシュファイルが上記以上古ければ、自動生成しなおします。
1日1回更新しておけば問題ないでしょう・・・きっと・・・。
IPの変更ってどれくらいの頻度で行われるんですかね?