简介
主要实现了百度搜索收录状态检测与自动推送功能,可帮助网站管理员优化文章在百度搜索引擎中的收录效率
功能概述
- 百度收录状态检测:通过百度站长平台 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标准缓存目录
- ✅ 添加详细的状态提示
- ✅ 优化错误处理和日志记录
- ✅ 新增批量推送功能
评论 (0)