68087908 发表于 2026-1-20 16:42:37

用宝塔面板创建bing搜索的indexnow

本帖最后由 68087908 于 2026-1-22 15:21 编辑

一、安装Python项目依赖“requests”,命令如下:pip3 install requests演示如下:



二、创建Python文件到目录“/www/wwwroot/IndexNow”,并取名为“IndexNow.py”,文件内容如下

文件中21、23、24行,改为自己的,

import requests
import xml.etree.ElementTree as ET
from datetime import datetime
import time
import logging
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
      logging.FileHandler('indexnow.log'),
      logging.StreamHandler()
    ]
)

# 配置参数
SITEMAP_URL = "你自己的SiteMap文件.xml(不带序号的那个索引文件)"
INDEXNOW_API = "https://api.indexnow.org/indexnow"
HOST = "你自己的网站域名"
KEY = "你自己的IndexNow API Key"
KEY_LOCATION = f"https://{HOST}/{KEY}.txt"

def create_session_with_retries():
    """创建带重试机制的session"""
    session = requests.Session()
   
    # 配置重试策略
    retry_strategy = Retry(
      total=3,
      backoff_factor=1,
      status_forcelist=,
    )
   
    adapter = HTTPAdapter(max_retries=retry_strategy)
    session.mount("http://", adapter)
    session.mount("https://", adapter)
   
    return session

def fetch_and_submit_sitemap_urls(sitemap_url, is_root=True):
    """读取并提交单个sitemap文件中的URL"""
    try:
      logging.info(f"正在处理网站地图: {sitemap_url}")
      
      # 创建带重试机制的session
      session = create_session_with_retries()
      
      # 设置请求头
      headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
            'Accept-Encoding': 'gzip, deflate',
            'Connection': 'keep-alive',
      }
      
      response = session.get(sitemap_url, headers=headers, timeout=30)
      response.raise_for_status()
      
      root = ET.fromstring(response.content)
      namespace = {'ns': 'http://www.sitemaps.org/schemas/sitemap/0.9'}
      
      # 如果是sitemap索引文件
      sitemaps = root.findall('ns:sitemap', namespace)
      if sitemaps and is_root:
            logging.info(f"发现 {len(sitemaps)} 个子sitemap文件")
            for sitemap_elem in sitemaps:
                loc = sitemap_elem.find('ns:loc', namespace)
                if loc is not None:
                  # 递归处理每个子sitemap,立即提交
                  fetch_and_submit_sitemap_urls(loc.text, is_root=False)
                  # 添加延迟避免请求过于频繁
                  time.sleep(2)
      else:
            # 处理普通sitemap文件中的URL
            urls = []
            for url_elem in root.findall('ns:url', namespace):
                loc = url_elem.find('ns:loc', namespace)
                if loc is not None:
                  urls.append(loc.text)
            
            if urls:
                logging.info(f"从 {sitemap_url} 获取到 {len(urls)} 个URL")
                # 立即提交这些URL
                submit_to_indexnow(urls)
            else:
                logging.warning(f"从 {sitemap_url} 未获取到任何URL")
               
    except Exception as e:
      logging.error(f"处理网站地图 {sitemap_url} 失败: {e}")

def submit_to_indexnow(url_list, batch_size=100):
    """分批提交URL到IndexNow"""
    headers = {
      'Content-Type': 'application/json; charset=utf-8'
    }
   
    total_submitted = 0
    for i in range(0, len(url_list), batch_size):
      batch = url_list
      
      payload = {
            "host": HOST,
            "key": KEY,
            "keyLocation": KEY_LOCATION,
            "urlList": batch
      }
      
      try:
            # 创建带重试机制的session
            session = create_session_with_retries()
            
            response = session.post(INDEXNOW_API, json=payload, headers=headers, timeout=30)
            if response.status_code == 200:
                logging.info(f"成功提交 {len(batch)} 个URL")
                total_submitted += len(batch)
            else:
                logging.warning(f"提交失败,状态码: {response.status_code}, 响应: {response.text}")
      except Exception as e:
            logging.error(f"提交过程中发生错误: {e}")
      
      # 添加延迟避免请求过于频繁
      time.sleep(1)
   
    logging.info(f"从当前sitemap总共提交 {total_submitted} 个URL")

def main():
    logging.info("开始执行IndexNow提交任务")
    start_time = datetime.now()
   
    try:
      fetch_and_submit_sitemap_urls(SITEMAP_URL)
      end_time = datetime.now()
      duration = end_time - start_time
      logging.info(f"IndexNow提交任务完成,总耗时: {duration}")
    except Exception as e:
      logging.error(f"任务执行失败: {e}")

if __name__ == "__main__":
    main()

三、计划任务~添加任务,设置好自己想要重复执行的时间。脚本内容如下:
python3 /www/wwwroot/IndexNow/IndexNow.py


四、保存设置,执行查看日志


最下面的两张图片传错了,不知怎的,删不掉了,官方审核可以帮我删掉,如果图片可以删掉,这句话也一起删掉
页: [1]
查看完整版本: 用宝塔面板创建bing搜索的indexnow