indexnow-live.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import requests
  4. import json
  5. import logging
  6. from datetime import datetime, UTC
  7. import time
  8. from urllib.parse import urlparse
  9. import xml.etree.ElementTree as ET
  10. # 配置日志
  11. logging.basicConfig(
  12. level=logging.INFO,
  13. format='%(asctime)s - %(levelname)s - %(message)s',
  14. filename='indexnow-live.log'
  15. )
  16. class IndexNowSubmitter:
  17. def __init__(self):
  18. self.api_endpoint = "https://api.indexnow.org/IndexNow"
  19. self.host = "izbds.com"
  20. self.key = "10494a0749004fd3b5260106760f3d2b"
  21. self.key_location = f"https://{self.host}/{self.key}.txt"
  22. self.sitemap_url = "https://live.izbds.com/sitemap.xml"
  23. self.max_retries = 3
  24. self.retry_delay = 5 # 重试间隔秒数
  25. def get_urls_from_sitemap(self):
  26. """从 sitemap.xml 获取所有 URL"""
  27. try:
  28. response = requests.get(self.sitemap_url, timeout=30)
  29. if response.status_code != 200:
  30. logging.error(f"获取 sitemap 失败: {response.status_code}")
  31. return []
  32. # 解析 XML
  33. root = ET.fromstring(response.content)
  34. # 定义命名空间
  35. ns = {'ns0': 'http://www.sitemaps.org/schemas/sitemap/0.9'}
  36. # 提取所有 URL
  37. urls = []
  38. for url in root.findall('.//ns0:url/ns0:loc', ns):
  39. urls.append(url.text)
  40. logging.info(f"从 sitemap 中获取到 {len(urls)} 个 URL")
  41. return urls
  42. except Exception as e:
  43. logging.error(f"解析 sitemap 时发生错误: {str(e)}")
  44. return []
  45. def validate_url(self, url):
  46. """验证 URL 的有效性"""
  47. try:
  48. parsed = urlparse(url)
  49. return all([parsed.scheme, parsed.netloc])
  50. except:
  51. return False
  52. def submit_urls(self):
  53. # 获取 URL 列表
  54. url_list = self.get_urls_from_sitemap()
  55. if not url_list:
  56. logging.error("未能获取到有效的 URL 列表")
  57. return False
  58. # 验证所有 URL
  59. url_list = [url for url in url_list if self.validate_url(url)]
  60. if not url_list:
  61. logging.error("没有有效的 URL 可提交")
  62. return False
  63. headers = {
  64. 'Content-Type': 'application/json; charset=utf-8'
  65. }
  66. payload = {
  67. "host": self.host,
  68. "key": self.key,
  69. "keyLocation": self.key_location,
  70. "urlList": url_list,
  71. "lastModified": datetime.now(UTC).strftime("%Y-%m-%dT%H:%M:%SZ")
  72. }
  73. for attempt in range(self.max_retries):
  74. try:
  75. response = requests.post(
  76. self.api_endpoint,
  77. headers=headers,
  78. json=payload,
  79. timeout=30 # 添加超时设置
  80. )
  81. logging.info(f"提交尝试 {attempt + 1}/{self.max_retries}")
  82. logging.info(f"状态码: {response.status_code}")
  83. logging.info(f"响应内容: {response.text}")
  84. if response.status_code == 200:
  85. print("成功提交 URL 到 IndexNow!")
  86. logging.info("成功提交 URL 到 IndexNow")
  87. return True
  88. else:
  89. print(f"提交失败,状态码: {response.status_code}")
  90. logging.error(f"提交失败,状态码: {response.status_code}")
  91. if attempt < self.max_retries - 1:
  92. time.sleep(self.retry_delay)
  93. continue
  94. return False
  95. except Exception as e:
  96. print(f"发生错误: {str(e)}")
  97. logging.error(f"发生错误: {str(e)}")
  98. if attempt < self.max_retries - 1:
  99. time.sleep(self.retry_delay)
  100. continue
  101. return False
  102. def main():
  103. submitter = IndexNowSubmitter()
  104. submitter.submit_urls()
  105. if __name__ == "__main__":
  106. main()