本帖最后由 68087908 于 2026-1-22 15:21 编辑
一、安装Python项目依赖“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=[429, 500, 502, 503, 504],
- )
-
- 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[i:i + batch_size]
-
- 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
复制代码
四、保存设置,执行查看日志
最下面的两张图片传错了,不知怎的,删不掉了,官方审核可以帮我删掉,如果图片可以删掉,这句话也一起删掉 |
-
-
|