# -*- coding: utf-8 -*- import sqlite3 import time import requests import os from datetime import datetime # 数据库所在的真实绝对路径 DB_PATH = '/www/wwwroot/my_api/database.db' SITEMAP_PATH = '/www/wwwroot/myhtml.asia/sitemap.xml' # 根域名与推送秘钥 SITE_DOMAIN = 'https://myhtml.asia' BAIDU_TOKEN = 'COZ4XmrTA1KdhU4C' def generate_and_push_sitemap(): print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 开始生成 Sitemap 并推送到百度...") if not os.path.exists(DB_PATH): print(f"错误:找不到数据库文件!当前指定的路径是: {DB_PATH}") return conn = sqlite3.connect(DB_PATH) cursor = conn.cursor() current_ts = int(time.time()) # 提取有效记录,按生成时间倒序 cursor.execute(''' SELECT url, subdomain, time FROM records WHERE (is_legacy = 1 OR expire_time > ?) AND title NOT LIKE '[APP专属内核]%' ORDER BY id DESC LIMIT 5000 ''', (current_ts,)) rows = cursor.fetchall() conn.close() sitemap_urls = [] push_urls = [] # 使用 replace 方法,彻底向宝塔编辑器隐藏 XML 声明符号,告别一切红线误报 xml_content = '【XML_START】xml version="1.0" encoding="UTF-8"?>\n'.replace('【XML_START】', '\n' # 将主页加进去 sitemap_urls.append(f"{SITE_DOMAIN}/") push_urls.append(f"{SITE_DOMAIN}/") xml_content += f''' {SITE_DOMAIN}/ daily 1.0 \n''' for r in rows: raw_url, subdomain, create_time = r[0], r[1], r[2] if subdomain: final_url = f"https://{subdomain}.myhtml.asia" else: final_url = raw_url # Sitemap 包含所有链接(包含子域名) sitemap_urls.append(final_url) # 主动推送只发根域名下的链接,避免触发 not_same_site 被百度拒绝 if not subdomain: push_urls.append(final_url) date_str = create_time.split(' ')[0] if create_time else datetime.now().strftime('%Y-%m-%d') xml_content += f''' {final_url} {date_str} weekly 0.8 \n''' xml_content += '' # 1. 写入物理 Sitemap 文件 try: with open(SITEMAP_PATH, 'w', encoding='utf-8') as f: f.write(xml_content) print(f"✅ 成功生成 sitemap.xml,共包含 {len(sitemap_urls)} 条链接。") except Exception as e: print(f"❌ 写入 sitemap.xml 失败: {str(e)}") return # 百度单次推送最多接收 2000 条,做安全切割 push_urls = push_urls[:2000] # 2. API 主动推送 (使用 params 传参彻底绕过 & 符号的语法报错) base_api = "http://data.zz.baidu.com/urls" api_params = { "site": SITE_DOMAIN, "token": BAIDU_TOKEN } headers = {'Content-Type': 'text/plain'} push_data = "\n".join(push_urls) try: print(f"🚀 正在向百度推送 {len(push_urls)} 条符合主域名的链接...") res = requests.post(base_api, params=api_params, headers=headers, data=push_data, timeout=15) result = res.json() if res.status_code == 200: print(f"✅ 推送成功!") print(f"🎉 百度实际成功接收: {result.get('success', 0)} 条") print(f"🔋 今日剩余可推送配额: {result.get('remain', '未知')} 条") if 'not_same_site' in result: print(f"⚠️ 因域名不匹配被拒绝: {len(result['not_same_site'])} 条") else: print(f"❌ 推送失败或超额,百度错误信息: {result}") except Exception as e: print(f"❌ 请求发生网络故障: {str(e)}") if __name__ == '__main__': generate_and_push_sitemap()