'count_visitor.php'); $DEFAULT_TAGPART_ARRAY = array(); // 指定されたCP_CODEを持つ広告情報を設定ファイルから読み込む // @param co_code string 対象のco_code(キャンペーンエディターのcpid) // データベースは参照していないのでキャンペーンエディターで「再生成」されるまでは // 反映されないので注意してください。 function load_cp_info($cp_code) { global $DEFAULT_TEMPLATE_FILE, $DEFAULT_ADDPART_ARRAY, $DEFAULT_TAGPART_ARRAY; // 個人アフィリエイト対応 if (strpos($cp_code, 'a_') === 0) { $cpid = 'affiliate'; } else { $cpid = $cp_code; } // Yahoo Premium対応 if (($pos = strpos($cp_code, ':')) !== false) { $data = explode(':', $cp_code); $cpid = $data[0]; } $cp_info = array('cp_code' => ''); $cp_file_data = file(dirname(__FILE__).'/files/campaign_list.txt'); foreach ($cp_file_data as $data) { $param = explode(',', $data); if ($cpid == trim($param[0])) { $add_part_name = array(); $add_part_name[1] = trim($param[5]); $add_part_name[2] = trim($param[6]); $add_part_name[3] = trim($param[7]); $add_part_name[4] = trim($param[8]); $add_part_name[5] = trim($param[9]); $add_part_name[6] = trim($param[10]); $tag_part = array(); $tag_part[1] = trim($param[11]); $app_link_ios = trim($param[12]); $app_link_android = trim($param[13]); $cp_info['cp_code' ] = $cp_code; $cp_info['cp_point' ] = trim($param[1]); $cp_info['cp_name' ] = trim($param[2]); $cp_info['cp_portal' ] = trim($param[3]); $cp_info['template_name'] = trim($param[4]); $cp_info['add_part_name'] = $add_part_name; $cp_info['tag_part' ] = $tag_part; $cp_info['tp_code' ] = ''; $cp_info['extra' ] = array(); if ($app_link_ios && $app_link_ios != '') { $cp_info['app_link_ios'] = $app_link_ios; } if ($app_link_android && $app_link_android != '') { $cp_info['app_link_android'] = $app_link_android; } if ($cp_info['template_name'] == '') { $cp_info['template_name'] = $DEFAULT_TEMPLATE_FILE; $cp_info['add_part_name'] = $DEFAULT_ADDPART_ARRAY; $cp_info['tag_part' ] = $DEFAULT_TAGPART_ARRAY; } // 特殊テンプレート対応 $cp_info = load_group_template($cp_info); $cp_info = load_dorekiru_template($cp_info); $cp_info = load_new_template($cp_info); break; } } return $cp_info; } // 指定されたCP_CODEと同じグループから広告情報を読み込む // @param gid string 対象のグループCP_CODE // グループIDは yahoo_ad23 のような形で指定され、 // 登録されている広告情報一覧から、最後の1文字以外は一致する広告を // 全てリストアップし、そのリストの中からラウンドロビンで選択された // 広告の設定情報を返却する。 // 先ほどの例からいうと、yahoo_ad23A, yahoo_ad23B, yahoo_ad23C, yahoo_ad23D // の4つが登録されていた場合、その4つを閲覧されるたびに順繰りに表示する function load_cp_info_by_group($gid) { if (strpos($gid, 'tid') === 0) { $target = db()->query("select cp_code from gid_group where gid=$1 and enable='t'", $gid); if (!$target) { return load_cp_info($gid); } $win = db()->query_value("select win from gid_group_settings where gid=$1", $gid); if ($win) { return load_cp_info($win); } $expects = array(); foreach ($target as $cp) { $expects[] = $cp['cp_code']; } $func = function($cpid) use (&$expects) { foreach ($expects as $expect) { if ($expect == $cpid) { return true; } } return false; }; } else { $gidlen = strlen($gid) + 1; $func = function($cpid) use ($gid, $gidlen) { if (preg_match('/'.$gid.'./', $cpid) && ($gidlen == strlen($cpid))) { return true; } return false; }; } $default = null; $cp_id_table = array(); $cp_file_data = file(dirname(__FILE__).'/files/campaign_list.txt'); foreach ($cp_file_data as $data) { $param = explode(',', $data); $cpid = trim($param[0]); if ($func($cpid)) { array_push($cp_id_table, $cpid); } } if (($id_num = count($cp_id_table)) == 0) { return load_cp_info($gid); } // main $fp_lock = @fopen("./data/counter_$gid.lock", 'r+'); if (!$fp_lock) { $fp_lock = fopen("./data/counter_$gid.lock", 'w'); } flock($fp_lock, LOCK_EX); $counter = (int) implode(file("./data/counter_$gid.txt")); $target_id = $cp_id_table[$counter % $id_num]; ++$counter; if ($fp = fopen("./data/counter_$gid.txt", w)) { flock($fp, LOCK_EX); fwrite($fp, $counter); flock($fp, LOCK_UN); fclose($fp); } flock($fp_lock, LOCK_UN); return load_cp_info($target_id); } // gid 指定で LP を利用する際に F5 リロードしても、同一の LP テンプレートを返す関数 function load_cp_info_by_cookie($gid) { global $DEFAULT_TEMPLATE_FILE, $DEFAULT_ADDPART_ARRAY, $DEFAULT_TAGPART_ARRAY; global $COOKIE_PREFIX; $cp_code = (string)filter_input(INPUT_COOKIE, $COOKIE_PREFIX.'HOTMJ_CAMPAIGN', FILTER_SANITIZE_SPECIAL_CHARS); if ($cp_code && strpos($cp_code, $gid) === 0) { $cp_file_data = file(dirname(__FILE__).'/files/campaign_list.txt'); foreach ($cp_file_data as $data) { $param = explode(',', $data); $cpid = trim($param[0]); if ($cpid === $cp_code) { return load_cp_info($cp_code); } } } return load_cp_info_by_group($gid); } // 指定されたキャンペーンコード及びポータルコードをCOOKIEに設定する。 // 設定された各種コードは登録時のreg_from, cp_codeに利用される // ただし、 function set_mj_campaign_cookie($cp_code, $cp_portal) { global $STATIC_ISP_URL; global $COOKIE_PREFIX, $COOKIE_DOMAIN; //キャンペーンコード埋め込みクッキーをセット $cookie_campaign = $COOKIE_PREFIX.'HOTMJ_CAMPAIGN'; $limit_campaign = time() + (60 * 60 * 24 * 14); $path_campaign = '/'; setcookie($cookie_campaign, $cp_code, $limit_campaign, $path_campaign, $COOKIE_DOMAIN); if (($cp_code != $cp_portal) && array_key_exists($cp_portal, $STATIC_ISP_URL)) { $cookie_from = 'HOTMJ_FROM'; $limit_from = time() + (60 * 60 * 24 * 14); $path_from = '/'; setcookie($cookie_from, $cp_portal, $limit_from, $path_from); } return true; } // アクセストレード広告タグ // Schedule #63994 function set_accesstrade_cookie($atss_code) { global $STATIC_ISP_URL; global $COOKIE_PREFIX, $COOKIE_DOMAIN; $cookie_name = $COOKIE_PREFIX .'ACCESSTRADE_ATSS'; $limit_campaign = time() + (60 * 60 * 24 * 90); // 先方指定 90 日以上 $path_campaign = '/'; // 先方指定 HttpOnly 属性 Secure 属 setcookie($cookie_name, $atss_code, $limit_campaign, $path_campaign, $COOKIE_DOMAIN, TRUE, TURE); return true; } function view_mj_campaign_page($cp_info) { //キャンペーンページの表示 $cp_code = $cp_info['cp_code']; $cp_name = $cp_info['cp_name']; $cp_point = $cp_info['cp_point']; $tp_code = $cp_info['tp_code']; $target_filename = dirname(__FILE__).'/files/'.$cp_info['template_name']; $table = $cp_info['extra']; // OSによる出し分け if (($suffix = user_os_suffix()) != '') { $pathext = pathinfo($target_filename, PATHINFO_EXTENSION); if ($pathext != '') { $pathrc = preg_replace('/\.'.$pathext.'$/', "{$suffix}.{$pathext}", $target_filename); } else { $pathrc .= $suffix; } if (is_readable($pathrc)) { $target_filename = $pathrc; } } // TAG PART の処理 $add_part_name = $cp_info['add_part_name']; for ($no = 1; $no <= 6; ++$no) { $content_part = ''; if ($add_part_name[$no] != '') { /* * phpファイルの動的読み込み対応 * 対象phpファイルで生成物をreturnする */ $part_names = explode('?', $add_part_name[$no]); $filename = $part_names[0]; $ext = pathinfo($filename, PATHINFO_EXTENSION); if (isset($part_names[1])) { // GET呼び出しへの対応 $gets = explode('&', $part_names[1]); foreach ($gets as $get) { list($get_index, $get_value) = explode('=', $get); $_GET[$get_index] = $get_value; } } if ($ext === 'php') { $part_filename = dirname(__FILE__).'/files/'.$filename; $part_filename = find_ua_file($part_filename); $content_part = require $part_filename; } else { // 拡張子がphp以外の場合は単純ファイル読み込み $part_filename = dirname(__FILE__).'/files/'.$add_part_name[$no]; $part_filename = find_ua_file($part_filename); $content_part = file_get_contents($part_filename); } } $table['add_part'.$no] = $content_part; } // タグパート処理 $table['tag_part1'] = @$cp_info['tag_part'][1]; // MJIリンク処理 $table['app_link_ios'] = isset($cp_info['app_link_ios']) ? $cp_info['app_link_ios'] : 'https://itunes.apple.com/jp/app/id816142637?l=ja&ls=1&mt=8&at=1l3vpsg&ct=mobileindex'; $table['app_link_android'] = isset($cp_info['app_link_android']) ? $cp_info['app_link_android'] : 'https://play.google.com/store/apps/details?id=com.signaltalk.mji'; $cp_image = "/image/cplogo_{$cp_code}.jpg"; if (is_readable(dirname(__FILE__).$cp_image)) { $self_path = '/'.str_replace(PUBLIC_HOME, '', dirname(__FILE__)); $cp_name = ''; } global $AD_SERVER_ADDR; $table['cp_code'] = $cp_code; $table['cp_point'] = $cp_point; $table['cp_name'] = $cp_name; $table['tp_code'] = $tp_code; $table['ad_server_url'] = 'http://'.$AD_SERVER_ADDR; $table['raw_mode'] = true; if (empty($table['from'])) { $from = get_session_portal(); if ($from == 'ios' || $from == 'android') { $table['from'] = $from; } } $table['ua'] = Http::analyze_ua(); $target_filename = find_ua_file($target_filename); $contents = twango_str($target_filename, $table); $contents = preg_replace('#([\'"\(])//www\.#', '$1https://ssl-www.', $contents); print $contents; } function redirect_page($cp_info) { $url = '/sys/campaign/set.php?id=err_redirect'; if ($cp_info['template_name'] == 'redirect:store') { $os = get_user_os(); if (strpos($os,'Android') !== false) { $url = isset($cp_info['app_link_android']) ? $cp_info['app_link_android'] : 'https://play.google.com/store/apps/details?id=com.signaltalk.mji'; } else if ($os == 'iOS' || $os == 'Mac') { $url = isset($cp_info['app_link_ios']) ? $cp_info['app_link_ios'] : 'https://itunes.apple.com/jp/app/id816142637?l=ja&ls=1&mt=8&at=1l3vpsg&ct=mobileindex'; } } else { $url = substr($cp_info['template_name'], strlen('redirect:')); } \Http::redirect($url); } function execute_last_cpcode_record($cp_code) { // ここからラストキャンペーン計測 global $my_cookie_pass; $value_pass = ''; // クッキーの確認 if (isset($_COOKIE['HOTMJ_PASS'])) { $value_pass = $_COOKIE['HOTMJ_PASS']; } elseif (isset($_COOKIE[$my_cookie_pass])) { $value_pass = $_COOKIE[$my_cookie_pass]; } if ($value_pass != '') { $val = explode(' ', $value_pass); $ck_login_id = $val[0]; if ($ck_login_id != '') { $FILENAME_LASTCP_LOCK = ROOT_PATH.'log/last_cpcode_record.lock'; $FILENAME_LASTCP_OUTPUT = ROOT_PATH.'data/statistics/last_cpcode_record.csv'; //ロック $fp_lock = @fopen($FILENAME_LASTCP_LOCK, 'r+'); if (!$fp_lock) { $fp_lock = fopen($FILENAME_LASTCP_LOCK, 'w'); } flock($fp_lock, LOCK_EX); { // 出力は、時刻とパラメータの実データ $output = date('Y-m-d G:i:s').','.$_SERVER['REMOTE_ADDR'].','.$cp_code.','.$ck_login_id.','.$_SERVER['HTTP_USER_AGENT']."\n"; // ファイルに追記 $handle = fopen($FILENAME_LASTCP_OUTPUT, 'a'); if ($handle) { fwrite($handle, $output); fclose($handle); } } flock($fp_lock, LOCK_UN); fclose($fp_lock); } } } ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// ////////////////////////////// utility /////////////////////////// ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// function load_group_template($cp_info) { if (isset($cp_info['template_name']) == false) { return $cp_info; } if (strpos($cp_info['template_name'], 'group_template_') === false) { return $cp_info; } // オートテンプレート $cp_code = $cp_info['cp_code']; $template_name = $cp_info['template_name']; $template_table = @file(dirname(__FILE__)."/files/{$template_name}"); $template_num = count($template_table); // カウンターで順番に出す→キャンペーンコード毎 $work_path = dirname(__FILE__).'/group_template/'; $work_base = "{$work_path}/{$template_name}_{$cp_code}"; //ロック $fp_lock = @fopen("{$work_base}.lock", 'r+'); if (!$fp_lock) { $fp_lock = fopen("{$work_base}.lock", 'w'); } flock($fp_lock, LOCK_EX); $counter = (int) file_get_contents("{$work_base}_counter.txt"); $target_template_data = explode(',', $template_table[($counter % $template_num)]); $tp_code = trim($target_template_data[0]); $target_template_name = trim($target_template_data[1]); ++$counter; if ($fp = fopen("{$work_base}_counter.txt", w)) { fwrite($fp, $counter); fclose($fp); } // ロック終わり flock($fp_lock, LOCK_UN); $cp_info['tp_code' ] = $tp_code; $cp_info['template_name'] = $target_template_name; return $cp_info; } function load_dorekiru_template($cp_info) { if (isset($cp_info['template_name']) == false) { return $cp_info; } if (strpos($cp_info['template_name'], 'dorekiru_template_') === false) { return $cp_info; } $template_name = $cp_info['template_name']; //どれ切るテンプレート対応 $template_table = @file(dirname(__FILE__)."/files/{$template_name}"); $answer_no = @$_GET['answer']; if (($answer_no == '') || !(preg_match('/[0-9]/', $answer_no))) { $answer_no = 0; } $target_template_data = explode(',', $template_table[$answer_no]); $target_template_name = trim($target_template_data[1]); $target_answer_name = trim($target_template_data[2]); $cp_info['extra']['answer_html'] = file_get_contents(dirname(__FILE__).'/files/'.$target_answer_name); $cp_info['template_name'] = $target_template_name; return $cp_info; } function load_new_template($cp_info) { global $my_cookie_pass; if (isset($cp_info['template_name']) == false) { return $cp_info; } if (strpos($cp_info['template_name'], 'template_new_') === false) { return $cp_info; } // 既存会員出し分け // ここからラストキャンペーン計測 $value_pass = ''; // クッキーの確認 if (isset($_COOKIE['HOTMJ_PASS'])) { $value_pass = $_COOKIE['HOTMJ_PASS']; } elseif (isset($_COOKIE[$my_cookie_pass])) { $value_pass = $_COOKIE[$my_cookie_pass]; } if ($value_pass != '') { $val = explode(' ', $value_pass); $ck_login_id = $val[0]; if ($ck_login_id != '') { // ここにきたら出し分ける $cp_info['template_name'] = str_replace('template_new_', 'template_mem_', $cp_info['template_name']); } } return $cp_info; } if (!function_exists('get_user_os')) { function get_user_os() { global $SERVERMODE; if (get('os') != '' && ($SERVERMODE != 'SERVICE' || (get('magic') == 'segadna' || (isset($_COOKIE['magic']) && $_COOKIE['magic'] == 'segadna')))) { $os = get('os'); $omit = array('xp' => 'WindowsXP', 'XP' => 'WindowsXP', 'vista' => 'WindowsVista', '7' => 'Windows7', '8' => 'Windows8', 'ios' => 'iOS', 'android' => 'Android', 'mac' => 'Mac'); return array_key_exists($os, $omit) ? $omit[$os] : $os; } $agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null; if (strpos($agent, 'Windows Phone') !== false) { $os = 'WindowsPhone'; } elseif (strpos($agent, 'BlackBerry') !== false) { $os = 'BlackBerry'; } elseif (strpos($agent, 'Windows NT 6.2') !== false) { $os = 'Windows8'; } elseif (strpos($agent, 'Windows NT 6.1') !== false) { $os = 'Windows7'; } elseif (strpos($agent, 'Windows NT 6.0') !== false) { $os = 'WindowsVista'; } elseif (strpos($agent, 'Windows NT 5.1') !== false || strpos($agent, 'Windows NT 5.2') !== false) { $os = 'WindowsXP'; } elseif (strpos($agent, 'iPhone') !== false || strpos($agent, 'iPad') !== false) { $os = 'iOS'; } elseif (strpos($agent, 'Android') !== false) { $suffix = (preg_match('/Android\s(\d+)/', $agent, $m)) ? $m[1] : ''; $os = 'Android'.$suffix; } elseif (strpos($agent, 'Mac') !== false) { $os = 'Mac'; } else { $os = null; } return $os; } } function user_os_suffix($os = null) { if ($os === null || $os === false) { $os = get_user_os(); } switch ($os) { case 'WindowsPhone': return '_wp'; case 'BlackBerry': return '_bb'; case 'Windows8': return '_8'; case 'Windows7': return '_7'; case 'WindowsVista': return '_vista'; case 'WindowsXP': return '_XP'; case 'iOS': return '_ios'; case 'Android': return '_android'; case 'Mac': return '_mac'; } return ''; } function find_ua_file($filename) { $ua = Http::analyze_ua(); if ($ua) { $fn = preg_replace('{\.([^/]+)$}', "_$ua.$1", $filename); if (is_file($fn)) { $filename = $fn; } } return $filename; }