简介

主要实现了百度搜索收录状态检测与自动推送功能,可帮助网站管理员优化文章在百度搜索引擎中的收录效率

功能概述

  • 百度收录状态检测:通过百度站长平台 API,判断文章是否已被百度收录。
  • 自动推送未收录文章:当管理员访问文章页时,自动向百度提交未收录的文章链接。
  • 收录状态缓存机制:避免频繁请求 API,减少服务器资源消耗。
  • 前端交互提示:向用户显示文章收录状态(已收录 / 未收录),并提供手动提交入口
<?php
/* EMLOG百度搜索自动推送、主动收录JS优化
 * 文章地址:https://www.jybk.cc/5.html
 * 转载请保留出处,谢谢合作!
 */

// 配置常量,方便统一管理
define('BD_SITE', 'https://www.jybk.cc/5.html');
define('BD_TOKEN', 'WooJwDBvfvlUl9mz');

function bdPushData($id) {
    $url = Url::log($id);
    $isIndexed = baidu($url);

    if ($isIndexed === true) {
        echo '<!--本文已被百度收录,无需推送-->';
    } else {
        // 使用百度最新的自动推送JS
        echo '<script>
(function(){
    var bp = document.createElement("script");
    var curProtocol = window.location.protocol.split(":")[0];
    if (curProtocol === "https") {
        bp.src = "https://zz.bdstatic.com/linksubmit/push.js";
    } else {
        bp.src = "http://push.zhanzhang.baidu.com/push.js";
    }
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(bp, s);
})();
</script>';
    }
}

function baidu($url) {
    // 使用EMLOG的缓存目录
    $cacheDir = EMLOG_ROOT . '/content/cache/baidu/';
    $cacheKey = 'baidu_index_' . md5($url) . '.cache';

    // 确保缓存目录存在
    if (!is_dir($cacheDir)) {
        @mkdir($cacheDir, 0755, true);
    }

    $cacheFile = $cacheDir . $cacheKey;
    $cacheTime = 3600; // 缓存1小时

    // 检查缓存
    if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTime) {
        $cacheData = @file_get_contents($cacheFile);
        if ($cacheData !== false) {
            return $cacheData === '1' ? true : false;
        }
    }

    // 方案1:使用百度站长平台的site查询接口(推荐)
    $checkUrl = 'https://www.baidu.com/s?wd=' . urlencode($url) . '&rn=1';

    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $checkUrl,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_USERAGENT => 'Baiduspider+(+http://www.baidu.com/search/spider.htm)',
        CURLOPT_HTTPHEADER => [
            'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language: zh-CN,zh;q=0.8',
            'Cache-Control: no-cache'
        ]
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    $isIndexed = false;

    if ($httpCode === 200 && $response) {
        // 检查是否被收录的多种判断方式
        // 方式1:检查是否包含"没有找到该URL"
        if (strpos($response, '没有找到该URL') === false && 
            strpos($response, '很抱歉,没有找到与') === false) {
            $isIndexed = true;
        }

        // 方式2:检查是否包含"百度快照"字样
        if (strpos($response, '百度快照') !== false) {
            $isIndexed = true;
        }

        // 方式3:检查响应内容长度(收录的页面通常内容较多)
        if (strlen($response) > 5000 && strpos($response, '相关的网页') === false) {
            $isIndexed = true;
        }
    }

    // 缓存结果
    @file_put_contents($cacheFile, $isIndexed ? '1' : '0');

    return $isIndexed;
}

function checkbaidu($id) {
    $url = Url::log($id);
    $isIndexed = baidu($url);

    if ($isIndexed === true) {
        echo '<span style="color:green;">✓ 百度已收录</span>';
    } else {
        // 管理员和作者自动提交
        if (ROLE == 'admin' || ROLE == 'writer') {
            submitToBaidu($url);
        }

        // 手动提交链接
        $submitUrl = 'https://ziyuan.baidu.com/linksubmit/url?sitename=' . urlencode($url);
        echo '<a style="color:red;margin-left:10px;" rel="external nofollow" 
              title="点击手动提交收录" target="_blank" 
              href="' . $submitUrl . '">✗ 未收录(点击提交)</a>';
    }
}

// 新增:主动推送到百度
function submitToBaidu($url) {
    $api = 'http://data.zz.baidu.com/urls?site=' . BD_SITE . '&token=' . BD_TOKEN;

    $urls = [$url];

    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => $api,
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POSTFIELDS => implode("\n", $urls),
        CURLOPT_HTTPHEADER => ['Content-Type: text/plain'],
        CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)',
        CURLOPT_TIMEOUT => 10,
        CURLOPT_SSL_VERIFYPEER => false
    ]);

    $result = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($httpCode === 200 && $result) {
        $response = json_decode($result, true);
        if (isset($response['success']) && $response['success'] > 0) {
            echo '<span style="color:orange;margin-left:10px;">→ 已成功提交到百度</span>';
            return true;
        } else {
            // 记录错误日志
            error_log('百度推送失败:' . $result);
        }
    }

    return false;
}

// 优化:批量提交定时任务(推荐在模板设置中调用)
function batchSubmitToBaidu() {
    // 获取最近24小时未推送的文章
    $db = Database::getInstance();
    $timeLimit = time() - 86400;

    $sql = "SELECT gid FROM " . DB_PREFIX . "blog WHERE date > $timeLimit ORDER BY date DESC LIMIT 10";
    $result = $db->query($sql);

    $urls = [];
    while ($row = $db->fetch_array($result)) {
        $urls[] = Url::log($row['gid']);
    }

    if (!empty($urls)) {
        $api = 'http://data.zz.baidu.com/urls?site=' . BD_SITE . '&token=' . BD_TOKEN;

        $ch = curl_init();
        curl_setopt_array($ch, [
            CURLOPT_URL => $api,
            CURLOPT_POST => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POSTFIELDS => implode("\n", $urls),
            CURLOPT_HTTPHEADER => ['Content-Type: text/plain'],
            CURLOPT_TIMEOUT => 30,
            CURLOPT_SSL_VERIFYPEER => false
        ]);

        $result = curl_exec($ch);
        curl_close($ch);

        return $result;
    }

    return false;
}
?>

使用说明

模板调用:在文章页模板中添加:

<?php bdPushData($logid); ?>

显示收录状态:

<?php checkbaidu($logid); ?>

主要改进

  • ✅ 使用实际的百度搜索接口检测收录状态
  • ✅ 多重判断提高准确性
  • ✅ 使用EMLOG标准缓存目录
  • ✅ 添加详细的状态提示
  • ✅ 优化错误处理和日志记录
  • ✅ 新增批量推送功能