sycnnj
发布于 2026-02-09 / 31 阅读
1
1

Google 自动化收录 Indexing API 一键推送脚本

关键词组:

  • 中文: Google Indexing API, Python 3.14, 腾讯云新加坡, 自动化 SEO, 宝塔面板, 站点地图推送, 网站收录优化。

  • English: Google Indexing API, Python 3.14, Tencent Cloud Singapore, Automated SEO, BT Panel, Sitemap Push, Website Indexing Optimization.

内容摘要:

针对 Google 搜索流量匮乏、收录缓慢的痛点,本文提供了一套基于 2026 年最新 Python 3.14 环境的 Google Indexing API 自动化推送方案。文章深度解析了从 Google Cloud 控制台凭据获取到腾讯云新加坡 VPS 环境部署的全流程,并附带了具备“增量识别”功能的自动化脚本。通过该方案,博主可实现文章发布即推送,极大缩短 Google 爬虫发现新内容的周期,是提升站点 E-E-A-T 权重的重要实战手段。


一、 为什么在 2026 年你必须主动“推”给 Google?

搞过运维和 SEO 的朋友都知道,现在的搜索引擎环境早已不是“酒香不怕巷子深”的年代。特别是 Google,虽然它的爬虫(Googlebot)极其强大,但面对海量的互联网碎片信息,如果你的站点权重不高,新文章可能在 Sitemap 里躺了半个月都没人理。

目前主流的 IndexNow 协议虽然好用,但遗憾的是,Google 到现在还没正式支持它。如果你想让 Google 快速收录你的 5,000 字甚至 8,000 字的长文大作,唯一的官方绿色通道就是 Google Indexing API

在这篇教程里,我会结合苏阳目前的腾讯云新加坡 VPS 环境,利用最新的 Python 3.14 技术栈,手把手教你搭建一套“一次部署,终身受益”的自动收录系统。


二、 环境前置条件判定

在动手之前,请确保你的“武器库”里已经准备好以下配置:

  1. 服务器环境:腾讯云新加坡 VPS(建议 2C4G 或以上),系统已安装宝塔面板。

  2. 编程环境:已手动编译安装 Python 3.14.3 及其配套的 pip3.14

  3. 站点地图:你的 Halo 博客已经正常生成 sitemap.xml

  4. Google 权限:拥有一个正常的 Google 账号,用于访问 Google Cloud Console 和 Search Console。


三、 第一阶段:获取 Google Cloud 凭据(最关键的“通行证”)

很多技术方案失败,往往不是因为代码写错了,而是 Google Cloud 的权限没配对。请严格执行以下步骤:

1. 创建 Google Cloud 项目

前往 Google Cloud Console。点击顶部项目选择框,点击“新建项目”,起名 My-Index-Project

2. 启用 Indexing API

在搜索框输入 "Indexing API",点击进去,点击那个硕大的蓝按钮 “启用”。如果不启用,你的代码跑一万遍也会报 403 错误。

3. 创建服务账号 (Service Account)

  • 在左侧菜单选择 “API 和服务” > “凭据”

  • 点击顶部 “创建凭据” > “服务账号”

  • 名称建议叫 google-pusher

  • 核心步骤:在“角色”里,选择 “项目” > “所有者 (Owner)”。不要选那些只读权限,否则无法下发推送指令。

4. 生成 JSON 密钥文件

  • 在服务账号列表里找到刚才创建的账号,点击右侧的三个点或点击进入账号,选择 “密钥 (Keys)” 选项卡。

  • 点击 “添加密钥” > “创建新密钥”,选择 JSON 格式。

  • 下载后的文件,请重命名为 service_account.json。这就是你的密钥,请像保护密码一样保护它。

5. 在 Google Search Console (GSC) 授权

这是 90% 的人会漏掉的一步。

  • 登录你的 GSC 后台

  • 找到你的域名 https://blog.xxx.com

  • 进入 “设置” > “用户和权限”

  • 点击“添加用户”,填入你刚才服务账号的邮箱地址(在 JSON 文件里的 client_email 字段)。

  • 权限必须选“拥有者”。注意,不是“完整”权限,必须是“拥有者”。


四、 第二阶段:一键部署自动化环境

为了方便操作,我将代码整合为一键写入模式。请通过 SSH 登录你的腾讯云新加坡 VPS,直接粘贴以下整块命令。

这段脚本不仅能推送,还具备“记忆功能”:它会记录已经推送过的 URL,下次运行时只推送新文章,绝不浪费 Google 每天 200 次的免费额度。

Bash

# 1. 进入工作目录(如果不存在则创建)
mkdir -p /www/wwwroot/google_push && cd /www/wwwroot/google_push

# 2. 自动检测并安装缺失依赖
echo "🔍 正在检查并安装 Python 依赖..."
/usr/bin/pip3.14 install httpx google-auth requests -i https://pypi.tuna.tsinghua.edu.cn/simple

# 3. 写入全量 Python 推送脚本
cat << 'EOF' > push_monitor.py
import os
import asyncio
import httpx
import xml.etree.ElementTree as ET
from google.oauth2 import service_account
from google.auth.transport.requests import Request

# --- 配置区 ---
BASE_DIR = "/www/wwwroot/google_push"
KEY_FILE = os.path.join(BASE_DIR, "service_account.json")
SITEMAP_URL = "https://blog.oool.cc/sitemap.xml"
HISTORY_FILE = os.path.join(BASE_DIR, "pushed_history.txt")

class GoogleAutomator:
    def __init__(self):
        self.scopes = ["https://www.googleapis.com/auth/indexing"]
        self.endpoint = "https://indexing.googleapis.com/v3/urlNotifications:publish"

    def get_token(self):
        """ 获取 OAuth2 令牌,自动处理依赖校验 """
        if not os.path.exists(KEY_FILE):
            return None
        creds = service_account.Credentials.from_service_account_file(KEY_FILE, scopes=self.scopes)
        creds.refresh(Request())
        return creds.token

    async def get_urls(self):
        """ 异步解析 Sitemap """
        async with httpx.AsyncClient(timeout=30.0) as client:
            try:
                r = await client.get(SITEMAP_URL)
                root = ET.fromstring(r.content)
                ns = {'s': 'http://www.sitemaps.org/schemas/sitemap/0.9'}
                return [n.text for n in root.findall(".//s:loc", ns)]
            except:
                return []

    async def run(self):
        token = self.get_token()
        if not token:
            print("❌ 错误:未发现 service_account.json 或认证失败")
            return

        all_urls = await self.get_urls()
        pushed = set()
        if os.path.exists(HISTORY_FILE):
            with open(HISTORY_FILE, "r") as f:
                pushed = {line.strip() for line in f}

        new_urls = [u for u in all_urls if u not in pushed]
        if not new_urls:
            print("☕ 今日暂无新文章更新。")
            return

        print(f"🚀 准备推送 {len(new_urls)} 条新链接...")
        count = 0
        for url in new_urls[:200]: # Google 每日配额 200
            async with httpx.AsyncClient() as client:
                resp = await client.post(self.endpoint, 
                    headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"},
                    json={"url": url, "type": "URL_UPDATED"})
                if resp.status_code == 200:
                    print(f"✅ 成功: {url}")
                    with open(HISTORY_FILE, "a") as f: f.write(url + "\n")
                    count += 1
                await asyncio.sleep(1)
        print(f"🏁 推送任务结束,本次成功推送 {count} 条。")

if __name__ == "__main__":
    asyncio.run(GoogleAutomator().run())
EOF

# 4. 设置每天凌晨 3:00 的 Cron 定时任务
(crontab -l 2>/dev/null | grep -v "push_monitor.py"; echo "0 3 * * * /usr/bin/python3.14 /www/wwwroot/google_push/push_monitor.py >> /www/wwwroot/google_push/cron_log.txt 2>&1") | crontab -

echo "🎉 部署完成!"
echo "👉 请确保 service_account.json 已在目录:/www/wwwroot/google_push/"

五、Win11 本地测试/部署指南

如果你想在本地 PC 上进行调试,请遵循以下步骤:

  1. 环境前置:安装 Python 3.10+。

  2. 安装依赖: 打开 PowerShell 或 CMD,执行: pip install httpx google-auth requests

  3. 脚本适配

    • 将代码中的 BASE_DIR 修改为你的本地路径(如 D:/google_push)。

    • service_account.json 放在该目录下。

  4. 运行: 在 VS Code 终端输入 python push_monitor.py 即可查看推送结果。

六、 避坑指南:实战中的主观心得

在腾讯云和新加坡环境部署这套系统时,我踩过几个坑,建议你直接跳过这些“学费”:

  1. 路径脱敏与安全:不要把 service_account.json 放在任何 Web 公开目录下。上面的脚本我已经强制把它锁在了 /www/wwwroot/google_push,这里是无法通过浏览器直接访问的,确保了你的 Google Cloud 项目安全。

  2. 配额陷阱:Google Indexing API 默认每天只有 200 次免费配额。如果你的站点有几千篇文章,第一次运行脚本时,它只会推最前面的 200 条。别着急,每天推一次,几天就补齐了。

  3. Python 别名冲突:在宝塔面板里,系统默认的 python 命令可能指向的是 2.7 或 3.7 版本。所以我脚本里强行指定了 /usr/bin/python3.14,这能保证你辛苦编译的高版本环境派上用场。

  4. IP 干净度:如果你发现推送频繁报 403 错误,排除权限问题后,检查一下你的新加坡 VPS 是不是因为滥用被 Google 标记了。不过腾讯云新加坡的 IP 段通常比较干净,实测表现非常稳定。

  5. 📢 实战避坑:为什么你的 Google Indexing API 频报 403 错误?

    在部署 Google Indexing API 自动化推送的过程中,即便代码逻辑 100% 正确,开发者也常会遇到 403 Permission Denied 的报错。结合本次在“E路领航”博客的实战经历,总结出以下三大核心“天坑”:

    1. “管家”与“门禁”的逻辑断层: 在 Google Cloud 创建服务账号(Service Account)只是拿到了“身份证”;你必须去 Google Search Console (GSC) 的“设置 -> 用户和权限”中,手动将该服务账号邮箱添加为 “拥有者 (Owner)”。注意:选“完整”权限是无效的,API 强制要求“拥有者”身份。

    2. 网域资源与网址前缀的迷思: 如果你在 GSC 中只验证了 oool.cc 这种“网域资源”,API 的权限继承有时会失效。最稳妥的解决办法是手动添加一个“网址前缀”资源(如 https://blog.oool.cc/),并针对该特定前缀再次授权。

    3. 隐形的运行环境依赖: 在使用高版本 Python(如 3.14)时,虽然我们习惯用 httpx 处理异步请求,但 google-auth 库在刷新令牌时默认调用的是 requests 传输层。如果系统中缺失 requests 库,脚本会在认证阶段直接崩溃并报 ModuleNotFoundError

    避坑总结:SEO 自动化不仅是代码的博弈,更是对 Google 权限体系颗粒度的深度理解。


七、 速查附录

任务

指令/路径

手动测试推送

python3.14 /www/wwwroot/google_push/push_monitor.py

查看推送历史记录

cat /www/wwwroot/google_push/pushed_history.txt

检查定时任务日志

tail -f /www/wwwroot/google_push/cron_log.txt

查看密钥文件

/www/wwwroot/google_push/service_account.json


七、 总结

通过这套方案,我们利用 Python 3.14 的高性能异步处理能力,完美解决了 Google 收录被动、缓慢的尴尬。这种全量、增量混合推送逻辑,不仅符合 Google E-E-A-T 的规范,也极大节省了我们作为站长的运维精力。

既然底层的“搬砖”工作已经交给了 AI 和脚本,你现在需要做的,就是静下心来写出更多具备行业深度的 8,000 字长文。


本文首发于 E路领航 (blog.oool.cc),转载请注明出处


评论