<?php
// 基础配置常量，统一管理
define('CACHE_DIR', '/www/wwwroot/web/cache2/');
define('CACHE_EXPIRE', 86400); // 24小时缓存
define('MAX_COLLECT_FILE', 20); // 最多读取txt文件数
define('MIN_FILE_SIZE', 800); // 文件最小3KB才读取
define('MIN_TEXT_LEN', 4); // 锚文本最小长度
define('MIN_LINK_LEN', 1); // 链接最小长度

// 错误控制：只屏蔽警告，保留致命错误方便调试
error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
ini_set('memory_limit', '1024M');

// 获取当前主域名、请求地址
$serName = myhost();
$rul = request_uri();
$folder = CACHE_DIR . $serName . '/';
$linkCacheFile = $folder . 'link_cache.php';

// 自动创建缓存目录
if (!is_dir($folder)) {
    mkdir($folder, 0755, true);
}

// 缓存读取逻辑
$link = [];
$text = [];
// if (file_exists($linkCacheFile) && (time() - filemtime($linkCacheFile)) < CACHE_EXPIRE) {
//     $cacheData = require $linkCacheFile;
//     $link = $cacheData['link'] ?? [];
//     $text = $cacheData['text'] ?? [];
// } else 
{
    // 读取主域名txt文件
    
    $files = glob($folder . '*');
    
    // 过滤掉文件夹，只保留文件（可选）
    $files = array_filter($files, 'is_file');
    if (!empty($files)) 
    {
        foreach($files as $v)
        {
            $temphtml = file_get_contents($v);
            if (preg_match('/<title>(.*?)<\/title>/is', $temphtml, $m)) {
                $link[] = base64_decode(str_ireplace(".txt","",basename($v)));
                $text[] = trim(strip_tags($m[1]));
            }
        }
    }

}

// 路由分发：三种地图输出
$uriLower = strtolower($rul);
$scheme = $_SERVER['REQUEST_SCHEME'] ?? 'http';
$host = $_SERVER['HTTP_HOST'] ?? '';


// 1. HTML站点地图
if (stripos($uriLower, 'sitemap.html') !== false) {
    $htmlItems = '';
    foreach ($link as $idx => $href) {
        $title = htmlspecialchars($text[$idx] ?? '');
        $fullUrl = htmlspecialchars("$href");
        $htmlItems .= "<a href=\"{$fullUrl}\">{$title}</a><br/>";
    }

    echo '<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>网站地图</title>
</head>
<body>
' . $htmlItems . '
</body>
</html>';
    exit;
}

// 2. TXT纯链接地图
if (stripos($uriLower, 'sitemap.txt') !== false) {
    header('Content-Type: text/plain; charset=utf-8');
    $txtContent = '';
    foreach ($link as $href) {
        $txtContent .=  "/$href\r\n";
    }
    echo $txtContent;
    exit;
}

// 3. XML标准站点地图
if (stripos($uriLower, 'sitemap.xml') !== false) {
    header('Content-Type: application/xml; charset=utf-8');
    $xmlItems = '';
    $today = date('Y-m-d');
    foreach ($link as $href) {
        $loc = htmlspecialchars("/$href");
        $xmlItems .= <<<XML
<url>
    <loc>{$loc}</loc>
    <lastmod>{$today}</lastmod>
    <changefreq>always</changefreq>
    <priority>1.0</priority>
</url>
XML;
    }
    echo '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9/">
' . $xmlItems . '
</urlset>';
    exit;
}

/**
 * 提取a标签链接+锚文本，自动去重过滤无效链接
 * @param string $html
 * @return array [link数组, text数组]
 */
function getlinks(string $html): array
{

    

    $temphtml1 = file_get_contents($randFile1);
    $temphtml2 = file_get_contents($randFile2);
    // 提取title
    $preNewsHref = "http://www.$serName/".str_ireplace("_","/",basename($randFile1));
    $nextNewsHref = "http://www.$serName/".str_ireplace("_","/",basename($randFile2));

    if (preg_match('/<title>(.*?)<\/title>/is', $temphtml1, $m)) {
        $preNews = trim(strip_tags($m[1]));
    }
    if (preg_match('/<title>(.*?)<\/title>/is', $temphtml2, $m)) {
        $nextNews = trim(strip_tags($m[1]));
    }
    
    
}

/**
 * 解析主域名，处理二级复合后缀(com.cn/co.kr等)
 * @param string $url
 * @return string
 */
function myhost(string $url = ''): string
{
    $url = $url ?: ($_SERVER["HTTP_HOST"] ?? '');
    $dualHostSuffix = [
        'aaa.pro','ac.cn','ac.kr','ac.mu','aca.pro','acct.pro','ae.org','ah.cn','ar.com','avocat.pro','bar.pro','biz.ki','biz.pl','bj.cn','br.com','busan.kr','chungbuk.kr','chungnam.kr','club.tw','cn.com','co.ag','co.am','co.at','co.bz','co.cm','co.com','co.gg','co.gl','co.gy','co.il','co.im','co.in','co.je','co.kr','co.lc','co.mg','co.ms','co.mu','co.nl','co.nz','co.uk','co.ve','co.za','com.af','com.ag','com.am','com.ar','com.au','com.br','com.bz','com.cm','com.cn','com.co','com.de','com.ec','com.es','com.gl','com.gr','com.gy','com.hn','com.ht','com.im','com.ki','com.lc','com.lv','com.mg','com.ms','com.mu','com.mx','com.nf','com.pe','com.ph','com.pk','com.pl','com.ps','com.pt','com.ro','com.ru','com.sb','com.sc','com.se','com.sg','com.so','com.tw','com.vc','com.ve','cpa.pro','cq.cn','daegu.kr','daejeon.kr','de.com','ebiz.tw','edu.cn','edu.gl','eng.pro','es.kr','eu.com','fin.ec','firm.in','fj.cn','game.tw','gangwon.kr','gb.com','gb.net','gd.cn','gen.in','go.kr','gov.cn','gr.com','gs.cn','gwangju.kr','gx.cn','gyeongbuk.kr','gyeonggi.kr','gyeongnam.kr','gz.cn','ha.cn','hb.cn','he.cn','hi.cn','hk.cn','hl.cn','hn.cn','hs.kr','hu.com','hu.net','idv.tw','in.net','incheon.kr','ind.in','info.ec','info.ht','info.ki','info.nf','info.pl','info.ve','jeju.kr','jeonbuk.kr','jl.cn','jp.net','jpn.com','js.cn','jur.pro','jx.cn','kg.kr','kiwi.nz','kr.com','law.pro','ln.cn','me.uk','med.ec','med.pro','mex.com','mo.cn','ms.kr','ne.kr','net.af','net.ag','net.am','net.br','net.bz','net.cm','net.cn','net.co','net.ec','net.gg','net.gl','net.gr','net.gy','net.hn','net.ht','net.im','net.in','net.je','net.ki','net.lc','net.lv','net.mg','net.mu','net.my','net.nf','net.nz','net.ph','net.pk','net.pl','net.ps','net.ru','net.sb','net.sc','net.so','net.vc','net.ve','nm.cn','no.com','nom.ag','nom.co','nom.es','nom.ro','nx.cn','or.at','or.jp','or.kr','or.mu','org.af','org.ag','org.am','org.bz','org.cn','org.es','org.gg','org.gl','org.gr','org.hn','org.ht','org.il','org.im','org.in','org.je','org.ki','org.lc','org.lv','org.mg','org.ms','org.mu','org.my','org.nz','org.pk','org.pl','org.ps','org.ro','org.ru','org.sb','org.sc','org.so','org.uk','org.vc','org.ve','pe.kr','pro.ec','qc.com','qh.cn','radio.am','radio.fm','re.kr','recht.pro','ru.com','sa.com','sc.cn','sc.kr','sd.cn','se.com','senet','seoul.kr','sh.cn','sn.cn','sx.cn','tj.cn','tw.cn','uk.com','uk.net','ulsan.kr','us.com','us.org','uy.com','web.ve','xj.cn','xz.cn','yn.cn','za.com','zj.cn'
    ];
    $domainPart = explode('.', $url);
    $targetHost = '';
    if (count($domainPart) <= 2) {
        $targetHost = $url;
    } else {
        $tld = array_pop($domainPart);
        $secTld = array_pop($domainPart);
        $thirdTld = array_pop($domainPart);
        $tempHost = $secTld . '.' . $tld;
        if (in_array($tempHost, $dualHostSuffix, true)) {
            $targetHost = $thirdTld . '.' . $secTld . '.' . $tld;
        } else {
            $targetHost = $secTld . '.' . $tld;
        }
    }
    // 正则精准截取完整域名
    preg_match('/[\w][\w-]*\.(?:com\.cn|net\.cn|net\.au|org\.cn|com\.hk|com|cn|top|shop|co|net|vip|xyz|icu|org|gov|cc|biz|info)/isU', $url, $matchDomain);
    return $matchDomain[0] ?? $targetHost;
}

/**
 * 安全获取请求URI
 * @return string
 */
function request_uri(): string
{
    if (isset($_SERVER['REQUEST_URI'])) {
        return $_SERVER['REQUEST_URI'];
    }
    if (isset($_SERVER['argv'])) {
        return $_SERVER['PHP_SELF'] . '?' . implode('&', $_SERVER['argv']);
    }
    return $_SERVER['PHP_SELF'] . '?' . ($_SERVER['QUERY_STRING'] ?? '');
}
?>