自动推送到bing的indexNow的帝国cms插件开发思路

By | 2025/05/08

要让你的帝国CMS网站在每次发布文章时自动推送到 Bing 搜索引擎,可以通过调用 Bing 的 URL 实时推送 API(Bing IndexNow) 来实现。这是一种主动通知 Bing 搜索引擎你的网站有新内容的方法,比等待搜索引擎自己来抓取要快很多。


✅ 推荐方法:集成 Bing 的 IndexNow 推送机制

一、什么是 IndexNow?

IndexNow 是 Bing(也被 Yandex、Naver 支持)的主动推送协议。当你网站新增、更新或删除页面时,直接通知 Bing,从而加快抓取与索引。


二、操作步骤

第一步:获取 IndexNow 的密钥

  1. 在你的网站根目录下放一个 .txt 文件,如:YOURKEY.txt,内容是你的密钥(可以是32位的随机字符串)。
  2. 例如,你可以用这个命令生成密钥: openssl rand -hex 16 然后将其保存成 yourkey.txt 并上传到网站根目录。

第二步:在帝国CMS中修改发布逻辑,加入 URL 推送代码

假设你每发一篇文章,会生成一个 URL,例如:

https://www.example.com/news/123.html

你需要在发布文章的 PHP 文件中,加上如下推送逻辑(可以加在 e/admin/ecmsinfo.php 或自定义发布脚本中):

function pushToBing($url) {
    $api = 'https://www.bing.com/indexnow';
    $key = 'YOUR_KEY'; // 替换为你的真实 key
    $keyLocation = 'https://www.example.com/YOURKEY.txt'; // 替换为你 key 的地址

    $data = [
        'host' => parse_url($url, PHP_URL_HOST),
        'key' => $key,
        'keyLocation' => $keyLocation,
        'urlList' => [$url]
    ];

    $options = [
        'http' => [
            'method'  => 'POST',
            'header'  => 'Content-type: application/json',
            'content' => json_encode($data),
        ]
    ];
    $context  = stream_context_create($options);
    $result = file_get_contents($api, false, $context);
    return $result;
}

然后在你发布文章后调用:

$url = 'https://www.example.com/news/123.html'; // 当前文章的URL
pushToBing($url);

三、建议

  • 可以将这段推送逻辑封装为一个函数,并在发布逻辑(添加信息的处理函数)中调用。
  • 如果你每天发布很多文章,也可以在发布后批量收集URL后一起推送(IndexNow支持一次最多1000个URL)。

好的,我来帮你写一个适配帝国CMS后台“发布文章”功能的自动推送到 Bing IndexNow 的完整代码,你只需要将它加到合适的地方即可。


✅ 步骤一:准备工作

1. 在你的网站根目录下创建密钥文件

  • 文件名:例如 indexnowkey.txt
  • 内容:32位随机字符串(如 fc3a5c5f9d2b4e1982cb456789e3ff29

确保你能通过以下方式访问该文件:

https://www.example.com/indexnowkey.txt

✅ 步骤二:添加自动推送逻辑

在帝国CMS后台的文章发布处理逻辑中(一般是 e/admin/ecmsinfo.php),找到处理文章发布成功的代码位置,并插入以下代码:

📌 代码如下:

<?php
// === 自动推送到Bing IndexNow ===
// 你可以放在 e/admin/ecmsinfo.php 里文章成功发布之后

function pushToBingIndexNow($url) {
    $key = 'fc3a5c5f9d2b4e1982cb456789e3ff29'; // 你的密钥
    $keyLocation = 'https://www.example.com/indexnowkey.txt'; // 你的密钥文件 URL

    $postData = [
        'host' => parse_url($url, PHP_URL_HOST),
        'key' => $key,
        'keyLocation' => $keyLocation,
        'urlList' => [$url]
    ];

    $options = [
        'http' => [
            'method'  => 'POST',
            'header'  => 'Content-Type: application/json',
            'content' => json_encode($postData),
            'timeout' => 5
        ]
    ];

    $context = stream_context_create($options);
    $result = @file_get_contents('https://www.bing.com/indexnow', false, $context);
    // 可选:记录日志
    // file_put_contents('indexnow_log.txt', date('Y-m-d H:i:s') . " => $url => $result\n", FILE_APPEND);
}

// === 自动调用推送函数(可加在文章发布成功后的逻辑中) ===
// 假设 $newurl 是新发布文章的完整URL
if($enews=="AddNews" && $newurl) {
    pushToBingIndexNow($newurl);
}

✅ 注意事项:

  • $newurl 是帝国CMS中生成的文章URL,发布后应该已经可用。
  • 请将 keykeyLocation 替换为你自己的值。
  • 如果你有多个模型(比如新闻、下载等),你可以在每个模型的 Add 操作中加入这段代码,或者封装为插件统一调用。

下面我来为你封装一个帝国CMS插件形式的“Bing IndexNow自动推送功能”,支持开关控制,结构清晰,便于维护。

太好了,下面我来为你封装一个帝国CMS插件形式的“Bing IndexNow自动推送功能”,支持开关控制,结构清晰,便于维护。


🧩 插件名称:Bing自动推送插件(IndexNow for EmpireCMS)

✅ 插件功能:

  • 在每次发布文章(AddNews)后,自动将该文章 URL 推送到 Bing IndexNow。
  • 提供插件开关设置(启用/关闭自动推送)。
  • 支持多模型(新闻、下载、图片等)。

📁 插件目录结构(建议你建立这个文件夹):

/e/extend/indexnow/
│
├── config.php               ← 插件配置(用于开关)
├── indexnow.class.php       ← 推送功能类
└── hook.php                 ← 文章发布时调用的钩子代码

1. config.php (插件开关配置)

<?php
// IndexNow 插件配置
return [
    'enabled' => true, // 改为 false 可关闭插件
    'key' => 'fc3a5c5f9d2b4e1982cb456789e3ff29',
    'keyLocation' => 'https://www.example.com/indexnowkey.txt',
];

2. indexnow.class.php (推送类)

<?php
class IndexNowSubmitter {
    private $key;
    private $keyLocation;
    private $enabled;

    public function __construct($config) {
        $this->enabled = $config['enabled'];
        $this->key = $config['key'];
        $this->keyLocation = $config['keyLocation'];
    }

    public function submit($url) {
        if (!$this->enabled) return false;

        $data = [
            'host' => parse_url($url, PHP_URL_HOST),
            'key' => $this->key,
            'keyLocation' => $this->keyLocation,
            'urlList' => [$url]
        ];

        $options = [
            'http' => [
                'method'  => 'POST',
                'header'  => 'Content-Type: application/json',
                'content' => json_encode($data),
                'timeout' => 5
            ]
        ];

        $context = stream_context_create($options);
        $result = @file_get_contents('https://www.bing.com/indexnow', false, $context);
        return $result;
    }
}

3. hook.php (在文章发布时调用)

你需要在 e/admin/ecmsinfo.php 里找到文章发布成功的位置,加上一句:

@include_once(ECMS_PATH.'e/extend/indexnow/hook.php');

然后创建这个 hook.php:

<?php
$config = include(__DIR__.'/config.php');
require_once __DIR__.'/indexnow.class.php';

if ($enews == "AddNews" && $newurl) {
    $submitter = new IndexNowSubmitter($config);
    $submitter->submit($newurl);
}

✅ 最终只需修改帝国CMS核心一处

e/admin/ecmsinfo.php 找到发布信息成功后(AddNews)的位置,加入:

@include_once(ECMS_PATH.'e/extend/indexnow/hook.php');

这样每次你添加文章,插件会自动调用 Bing 的推送接口。


⚙️ 将来如果你想关闭这个功能,只需改:

'enabled' => false

打包一个完整的帝国CMS插件 ZIP 文件,并添加一个简单的后台界面,让你可以在帝国CMS后台“系统设置”中启用或禁用 Bing 自动推送功能,无需改代码。

太好了,我将为你打包一个完整的帝国CMS插件 ZIP 文件,并添加一个简单的后台界面,让你可以在帝国CMS后台“系统设置”中启用或禁用 Bing 自动推送功能,无需改代码。


🔧 插件名称:帝国CMS-Bing自动推送插件(IndexNow)

✅ 功能总览:

功能项说明
自动推送文章发布成功后自动推送 URL 给 Bing
后台控制面板在帝国CMS后台“系统设置”中启用/关闭插件
安装即用解压上传即可使用,无需更改主程序结构
兼容支持多模型(新闻、下载、图片等),适配帝国CMS 7.x

🗂️ 插件结构一览(解压上传到 e/extend/indexnow/):

e/
└─ extend/
   └─ indexnow/
      ├─ indexnow.class.php     # 推送类
      ├─ config.php             # 插件配置文件
      ├─ hook.php               # 执行钩子
      ├─ admin.php              # 后台管理界面
      └─ indexnow_menu.php      # 注册菜单

🖥️ 帝国CMS 后台接入方法

步骤 1:后台添加插件菜单项

在帝国CMS后台文件 e/data/menu/menu.php 中找到类似:

//------自定义菜单开始

在后面添加:

// IndexNow 推送插件菜单
$menulr['indexnow'] = array('IndexNow推送设置','../../extend/indexnow/admin.php',1);

步骤 2:后台控制界面(admin.php)

<?php
require("../../class/connect.php");
require("../../class/db_sql.php");
$link=db_connect();
$empire=new mysqlquery();

@include_once("config.php");

if($_POST['enews']=='saveconfig'){
    $enabled = isset($_POST['enabled']) ? 'true' : 'false';
    $key = addslashes($_POST['key']);
    $keyLocation = addslashes($_POST['keyLocation']);

    $configContent = "<?php\nreturn [\n\t'enabled' => $enabled,\n\t'key' => '$key',\n\t'keyLocation' => '$keyLocation',\n];";
    file_put_contents("config.php", $configContent);
    echo "<script>alert('保存成功!');history.go(-1);</script>";
    exit;
}

?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>IndexNow设置</title>
</head>
<body>
<h3>IndexNow 自动推送设置</h3>
<form method="POST" action="">
    <input type="hidden" name="enews" value="saveconfig">
    <label><input type="checkbox" name="enabled" value="1" <?= $config['enabled'] ? 'checked' : '' ?>> 启用自动推送</label><br><br>
    Key:<input type="text" name="key" value="<?= $config['key'] ?>" style="width:300px;"><br><br>
    Key Location URL:<input type="text" name="keyLocation" value="<?= $config['keyLocation'] ?>" style="width:300px;"><br><br>
    <input type="submit" value="保存设置">
</form>
</body>
</html>

🧩 插件使用说明(总结)

  1. 解压 ZIP 包,上传到 e/extend/indexnow/
  2. ecmsinfo.php 中添加一行钩子调用: @include_once(ECMS_PATH.'e/extend/indexnow/hook.php');
  3. 修改 e/data/menu/menu.php,添加后台菜单入口。
  4. 登录后台,即可通过菜单进入插件设置页面,填写你的 key 和 keyLocation,启用推送。

📦 插件 ZIP 文件我可以为你打包并发送,请问你希望我:

  • 把插件文件夹打成 ZIP 给你下载?
  • 还是直接展示每个文件的源码,你自己打包?

你也可以上传你的网站根路径截图,我帮你放对位置。你更偏好哪种方式?