Reference by lark@s-crew.co.jp * @since PHP 4.3.0 * @version $Id: Client.php,v 1.00 2005/06/27 00:00:00 danielc Exp $ */ // class命名規則) Log,Net_Finger,HTML_Upload_Error /* 動作概要 1.IPアドレスからホスト名を割り出し、どのキャリアからのアクセスかを特定します。 (see propaty $this->ca) 2.また、UserAgentから機種名を割り出します。 (see propaty $this->dev) 3.EzとVodafoneは環境変数から画面表示最大横幅サイズを特定します。 4.DoCoMoはローカルのテキストファイルから検索して横幅を特定します。 5.ローカルのテキストファイルがなかった場合、又はリストに機種がなかった場合は 外部のサーバーとHTTP通信し、その結果から検索します。 特定出来た場合にはローカルのリストと「全て」入れ替えます。 (see propaty $this->width) 6.外部のリストを見ても見つからなかった場合、デフォルトのサイズを用います。 また特定のメールアドレスへ通知します。 (see propaty $this->sizeUnk,$this->mail) 7.PCからのアクセスの場合もデフォルトのサイズを用います。) (see propaty $this->sizePC) ※全ての(1〜7)各プロセスはオブジェクト生成のタイミングで実行されます。 */ //ex) /* function cl_sample() { $cl = new Client; echo "\n"; echo "\n"; echo "\n"; echo "test"; echo "\n"; echo "\n"; echo "
\n"; echo date("Y/m/d/H:i:s") . "
\n"; // echo $cl->UA . "
"; echo $cl->uid . "
\n"; echo $cl->dev . "
\n"; echo $cl->width . "
\n"; echo "
\n"; echo ""; $test = array("DoCoMo/2.0 N900i(c100;TB;W24H12)", "DoCoMo/1.0/SO505i/c20/TB/W21H09", "DoCoMo/1.0/N505iS/c20/TB/W20H10", "DoCoMo/1.0/SH505iS/c20/TB/W24H12", "DoCoMo/1.0/F501i", "DoCoMo/1.0/N502it", "DoCoMo/1.0/KO209i", "DoCoMo/1.0/P651ps", "DoCoMo/1.0/SO503iS/c10", "DoCoMo/2.0 MST_v_SH2101V(c100)", "DoCoMo/2.0 N2002(c100)", "DoCoMo/1.0/F671iS/c10/TB ", "DoCoMo/1.0/SO213iS/c10/TB", "DoCoMo/2.0 N2102V(c100;TB)", "DoCoMo/1.0/SH505i2/c20/TB/W24H12", "DoCoMo/1.0/F505iGPS/c20/TB/W20H10", "DoCoMo/1.0/P506iC/c20/TB/W20H10", "DoCoMo/1.0/SO506iC/c20/TB/W20H10", "DoCoMo/1.0/SO506iS/c20/TB/W20H10", "DoCoMo/1.0/D253iWM/c10/TB/W27H08", "DoCoMo/2.0 F900iT(c100;TB;W22H12)", "DoCoMo/2.0 N900iL(c100;TB;W24H12)", "DoCoMo/2.0 N900iG(c100;TB;W24H12)", "DoCoMo/2.0 F880iES(c100;TB;W20H08)", "DoCoMo/2.0 SH901iC(c100;TB;W24H12)", "DoCoMo/2.0 N700i(c100;TB;W24H12)", "DoCoMo/2.0 N901iS(c100;TB;W24H12" ); foreach ($test as $ua) { $dev = $cl->_dev_get_device("D", $ua); echo $ua . "
"; echo $dev . "
"; echo $cl->_dev_get_width("D", $dev) . "
";; echo "
"; } } */ class Client { var $UA; //ユーザーエージェント var $ca; //キャリア判別文字(D,E,V,O) var $gw; //IPアドレス var $url; //ドコモの幅取得URL var $file_d; //ドコモファイルの場所 var $sizePC; //PC用画像サイズ(横幅) var $sizeUnk; //サイズアンノウン時の横幅 var $uidUnk; //uidアンノウン時のuid var $dev; //機種名 var $width; //横幅サイズ var $mail; //エラー発生時のメール送り先 var $uid; //シリアルナンバーとかあれば埋め込む。ドコモは$_GET["UID"]を取ってみる。 var $REAL_UID; var $REAL_UID_MD5; function Client() { $this->mail = "kool@s-crew.co.jp"; $this->url = "http://dev.s-crew.co.jp/kool/device/width_docomo.txt"; // $this->url = "http://device.s-crew.co.jp/width_docomo.txt"; $this->file_d = "/tmp/width_docomo.txt"; $this->uid = ""; $this->sizePC = SIZE_PC; $this->sizeUnk = SIZE_UNK; $this->uidUnk = "Unknown"; $this->robot = 0; //検索エンジンのアクセスかどうか。 $this->mobile_robot = 0; //モバイル用検索エンジンのアクセスかどうか。 $this->_dev_main(); } //オブジェクト生成時にだけ呼ばれるメインメソッド function _dev_main() { if (!empty($_SERVER["REMOTE_ADDR"])) { //キャリア判別 $gw = gethostbyaddr($_SERVER["REMOTE_ADDR"]); $this->gw = $gw;; $ca = $this->_dev_get_career($gw); $this->ca = $ca; //機種判別 $ua = @$_SERVER["HTTP_USER_AGENT"]; $this->UA = $ua; $dev = $this->_dev_get_device($ca, $ua); $this->dev = $dev; //モバイル検索用 if($this->mobile_robot == 1){ $ca = "D"; $dev = "N905i"; $this->ca = $ca; $this->dev = $dev; } //画像サイズ判別 $size = $this->_dev_get_width($ca, $dev); $this->width = $size; if ((empty($size))&&($this->ca != "O")) { $size = $this->sizeUnk; if (($ca == "D") && (!empty($ua))) { /* 本来は機種リスト(list_device.txt)に機種がなかった場合にエラーを通知するためのものだが、 デフォルトで240になるのでコメントアウト。 2009/01/15 kool $this->_dev_error($dev, "ua:" . $ua . "\nca:" . $ca . "\nerror occured or not found device in _dev_get_width_docomo() at ClientClass"); */ } } //機種固定番号取得 $uid = $this->_dev_get_uid($ca, $ua); if (empty($uid)) { $uid = $this->uidUnk; } $this->uid = $uid; } else { echo "can't find your ip address.\n"; exit; } return 1; } // function _dev_get_uid($ca,$ua) { switch ($ca) { case "D": //公式サイトに伴い、セッションへ登録しちゃう。=>Session.phpへ移動、変数にいれるだけにする。 $REAL_UID = (!empty($_GET["uid"])) ? $_GET["uid"] : @$this->REAL_UID; $uid = ""; //FOMAはカード番号を、MOVAは端末番号を取る。 $sp = strpos($ua, "icc"); $sp = ($sp) ? $sp : strpos($ua, "ser"); if ($sp) { $ep = strpos($ua, ")"); $ep = ($ep) ? $ep : 0; $uid = ($ep) ? substr($ua, $sp, $ep - $sp) : substr($ua, $sp); } //UTNが取れなかったらimode-idをとってみる。 2008/06/18 else if (isset($_REQUEST["guid"]) && ($_REQUEST["guid"] === "ON") ){ $uid = @$_SERVER["HTTP_X_DCMGUID"]; } break; case "E": $uid = @$_SERVER["HTTP_X_UP_SUBNO"]; $REAL_UID = $uid; break; case "V": // ereg("/([^/]*) ", $ua, $r); // $uid = $r[1]; $uid = @$_SERVER["HTTP_X_JPHONE_UID"]; $REAL_UID = $uid; break; case "O": default: $uid = ""; $REAL_UID = $uid; break; } //$uidが空で、IPが210.168.236.134ならエスクルーからのデバッグかも /* 2010/07/28修正 if (isset($_REQUEST["guid"]) && ($_REQUEST["guid"] === "ON") && empty($uid) && defined("DEBUG_ALLOW_IP")) { $allow_ip = explode("," ,DEBUG_ALLOW_IP); if (@array_search($_SERVER["REMOTE_ADDR"], $allow_ip) !== FALSE) { */ if (defined("DEBUG_ALLOW_IP") && in_array($_SERVER["REMOTE_ADDR"], explode(",", DEBUG_ALLOW_IP))) { $uid = "SC_DEBUG_imodeid"; $REAL_UID = $uid; // } } $REAL_UID_MD5 = md5($REAL_UID); $this->REAL_UID = $REAL_UID; $this->REAL_UID_MD5 = $REAL_UID_MD5; // $_SESSION["UID"] = $REAL_UID; return $uid; } //画像サイズ(横幅)判別用メソッド function _dev_get_width($ca, $dev) { switch ($ca) { case "D": $size = $this->_dev_get_width_docomo($dev); break; case "E": if (isset($_SERVER["HTTP_X_UP_DEVCAP_SCREENPIXELS"])) { $size = explode(",", $_SERVER["HTTP_X_UP_DEVCAP_SCREENPIXELS"]); $size = trim($size[0]); } else { $size = $this->sizePC; } break; case "V": if (isset($_SERVER["HTTP_X_JPHONE_DISPLAY"])) { $size = explode("*", $_SERVER["HTTP_X_JPHONE_DISPLAY"]); $size = trim($size[0]); } else { $size = $this->sizePC; } break; case "O": default: $size = $this->sizePC; break; } return $size; } //ドコモ用のファイル操作(横幅取得)プログラム function _dev_get_width_docomo($dev) { $file = $this->file_d; $url = $this->url; //ローカルファイルがないので外から取得 if (!is_file($file)) { //echo "外から取得
"; $this->_dev_write2local($file, $url); } //ローカルファイルがあるのでまず検索 if (is_file($file)) { $data = file($file); if (is_array($data)) { $tmp = array(0,0); foreach ($data as $v) { $tmp = explode(",", $v); if ($dev === $tmp[0]) { return $tmp[1]; break; } } //見つからなかったので外のファイルを呼んで見る。 //echo "見つからなかったので外のファイルを呼んで見る。
"; $tmp = array(0,0); $data = file($url); if (is_array($data)) { foreach ($data as $v) { $tmp = explode(",", $v); if ($dev === $tmp[0]) { //echo "found:{$tmp[1]}
"; break; } else { $tmp = array(0,0); } } } //みっかったら新しいものだとしてローカルファイルと入れ替える if ((!empty($tmp[1])) && ($this->_dev_write2local($file, $url))) { //echo "見つかったから置き換える
"; return $tmp[1]; } else { //echo "でも見つからない。
"; } } } return 0; } //エラー通知用メソッド function _dev_error($dev, $estr) { mb_send_mail($this->mail, "エラー発生", "エラー内容\n" . "dev:" . $dev . "\n" . $estr); } //外部ファイルをローカルに書き出すメソッド function _dev_write2local($file, $url) { //echo "write
"; $data = file_get_contents($url); $fp = fopen($file, "w+"); if ($fp) { fwrite($fp, $data); fclose($fp); return 1; } else { return 0; } } //機種名判別用メソッド function _dev_get_device($ca, $ua) { switch ($ca) { case "D": if (ereg("i-robot", $ua)) { $dev = "i-robot"; $this->robot = 1; } else { // ereg("([a-z,A-Z]{1,2}[1-9]{1}[0-9]{2,3}[a-z,A-Z]{0,4})", $ua, $r); ereg("([a-z,A-Z]{1,2}[0-9]{1}[0-9]{1,3}[a-z,A-Z]{0,4})", $ua, $r); //N01A等の新タイプ対応 $dev = $r[1]; } break; case "E": if (eregi("Google", $ua)) { $this->robot = 1; } $tmp = explode(" ", $ua); $tmp = explode("-", trim($tmp[0])); $dev = @trim($tmp[1]); break; case "V": if (eregi("VodafoneKkSearch", $ua)) { $this->robot = 1; } $dev = @$_SERVER["HTTP_X_JPHONE_MSNAME"]; break; case "O": default: //モバイルサーチエンジン用追加 2008/05/21 muragishi if (eregi("Googlebot-Mobile", $ua) || eregi("LD_mobile_bot", $ua) || eregi("moba-crawler", $ua) || eregi("croozbot", $ua) || eregi("symphonybot1", $ua) || eregi("YahooSeeker", $ua)){ $this->mobile_robot = 1; } else{ if (eregi("Googlebot", $ua) || eregi("Sidewinder", $ua) || eregi("Slurp", $ua) || eregi("Scooter", $ua) || eregi("MSNBot", $ua) || eregi("NaverBot", $ua) || eregi("Ninja", $ua) // || ereg("Mozilla", $ua) ) { $this->robot = 1; } } $dev = "PC"; break; } return $dev; } //キャリア判別用メソッド function _dev_get_career($gw) { //ドコモ if (ereg("\.docomo\.ne\.jp$", $gw)) { $ca = "D"; } //au else if (ereg("\.(ezweb|ido)\.ne\.jp$", $gw)) { // else if (ereg("^KDDI-", $_SERVER["HTTP_USER_AGENT"])) { $ca = "E"; } //Vodafone else if (ereg("\.jp-([a-z])\.ne\.jp$", $gw)) { $ca = "V"; } //その他はPC else { $ca = "O"; } return $ca; } } //cl_sample(); ?> * @since PHP 4.3.11 * @version $Id: Overload.php,v 1.02 2005/08/01 00:00:00 danielc Exp $ * Last Change: 2006/11/14 12:36:35. * 1.04 bugfix list_deviceに空行があった場合にNoticeが出るのを修正 * 1.03 add tfileをプロパティに保存 * 1.02 bugfix デバイスリストがなくても動かなくてはいけない。 * 1.01 ol_run()の返り値を$tfileを返すように変更 */ /* 概要 htmlオーバーロード機能を提供する。 決め内のファイルを2種類用意する必要がある。 */ // class命名規則) Log,Net_Finger,HTML_Upload_Error class _Overload extends Util{ var $list_domain; //ドメインとベースディレクトリの設定ファイル var $list_device; //端末毎に設定するオーバーロードディレクトリのファイル var $base; //テンプレートファイルがあるベースディレクトリの設定 var $over_load; //オーバーロードしたかどうかの判定フラグ var $obj; //他クラスオブジェクト参照用 var $ca; //キャリア判別プロパティ Client.phpのプロパティを参照する。 var $dev; //端末判別プロパティ Client.phpのプロパティを参照する。 var $tfile; //オーバーロード対象ファイル //コンストラクタ 特にやることなし function _Overload() { defined("BASE_DIR") ? TRUE : define("BASE_DIR", dirname(dirname($_SERVER["SCRIPT_FILENAME"]))); defined("TPL_DIR") ? TRUE : define("TPL_DIR", BASE_DIR . "/tpl"); } //ここで使うものの初期化 function ol_init() { $this->ca = (is_object($this->obj["cl"])) ? $this->obj["cl"]->ca : $this->_die("CLオブジェクトがロードされていません。@ol"); $this->dev = (is_object($this->obj["cl"])) ? $this->obj["cl"]->dev : $this->_die("CLオブジェクトがロードされていません。@ol"); $this->list_domain = TPL_DIR . "/list_domain.txt"; $this->list_device = TPL_DIR . "/list_{$this->ca}_device.txt"; $this->base["E"] = TPL_DIR . "/base_au"; $this->base["D"] = TPL_DIR . "/base_docomo"; $this->base["V"] = TPL_DIR . "/base_vodafone"; $this->base["M"] = TPL_DIR . "/base_mobile"; // $this->base["O"] = "../tpl/base_docomo"; //"../tpl/base_pc";? $this->base["O"] = TPL_DIR . "/base_pc"; $this->over_load = 0; $this->max_sh = 100; } //オーバーロード用ディレクトリと表示用htmlの検索 function ol_run() { $ca = $this->ca; $dev = $this->dev; $list_domain = $this->list_domain; $list_device = $this->list_device; $base = $this->base; //ドメインリストファイルを検索してブランドディレクトリを探す。 if (is_file($list_domain)) { $ldom = file($list_domain); foreach ($ldom as $v) { $tmp = explode(",", $v); // if ($_SERVER["SERVER_NAME"] === trim($tmp[0])) { if ($_SERVER["HTTP_HOST"] === trim($tmp[0])) { break; } unset($tmp); } //オーバーロードhtmlがあるか調べる。 $rfile = (!empty($tmp[1])) ? (trim($tmp[1]) . $_SERVER["REDIRECT_URL"]) : die("404 Not Found/1"); if (@is_file($list_device)){ $ldev_dir = ""; $ldev = file($list_device); if (count($ldev) > 0) { foreach ($ldev as $v) { if (ereg(":", $v)) { unset($tmp); $tmp = explode(":", $v); $devtmp = explode(",", trim($tmp[1])); foreach ($devtmp as $vv) { if ($dev === trim($vv)) { $ldev_dir = trim($tmp[0]); break 2; } } } } } //オーバーロードhtml用ディレクトリを発見した場合 if (!empty($ldev_dir)) { $tfile = "{$base[$ca]}_{$ldev_dir}/{$rfile}"; //特定ディレクトリにファイルが存在するか調べる if (is_file($tfile)) { $this->over_load = 1; } //なければ、ベースディレクトリに存在するか調べる else if (is_file($tfile = "{$base[$ca]}/{$rfile}")) { TRUE; } //なければ、(モバイルの場合)モバイル共通ディレクトリに存在するか調べる。 else if (is_file($tfile = "{$base["M"]}/{$rfile}")) { TRUE; } //それでもなければ本当に404 else { // die("404 Not Found/2/"); (is_object($this->obj["err"]) ? trigger_error("err: not found tfile:{$tfile}//404 Not Found/2") : die("404 Not Found/2")); } } //オーバーロード用htmlディレクトリを発見出来なかった場合 else { $tfile = "{$base[$ca]}/{$rfile}"; // is_file($tfile) ? TRUE : $this->_die("{$tfile}をおいてね♪"); // is_file($tfile) ? TRUE : die("404 Not Found/3")); //2008/08/19 add by kool list_device.txtに端末指定がなかった場合で、baseディレクトリにhtmlがなかった場合、モバイル共通を見る処理 if (is_file($tfile)) { TRUE; } else if (is_file($tfile = "{$base["M"]}/{$rfile}")) { TRUE; } else { (is_object($this->obj["err"]) ? trigger_error("err: not found tfile:{$tfile}//404 Not Found/3") : die("404 Not Found/3")); } } $this->tfile = $tfile; return $tfile; } //オーバーロード定義ファイルがないのでベースファイルを渡す。 else { // die("デバイスリストがみあたらないよ{$list_device}"); $tfile = "{$base[$ca]}/{$rfile}"; //is_file($tfile) ? TRUE : $this->_die("{$tfile}をおいてね♪"); is_file($tfile) ? TRUE : die("404 Not Found/4"); $this->tfile = $tfile; return $tfile; } } else { //$this->_die("りすとどめいんふぁいるがないよ"); die("404 Not Found/5"); } } } ?>