- 1. 概要
- 2. クラス作成
- 3. 初期化
- 4. 更新通知
1. 概要
いよいよ、「Google Indexing API」を使ってみます。
2. クラス作成
「GoogleIndexing.py」というソースを作成して、下記を記述します。
import json
from google.oauth2 import service_account
from googleapiclient.discovery import build
class GoogleIndexing:
def __init__(self, key_file_path):
self.scopes = ["https://www.googleapis.com/auth/indexing"]
self.credentials = service_account.Credentials.from_service_account_file(key_file_path, scopes=self.scopes)
self.service = build("indexing", "v3", credentials=self.credentials)
def notify(self, url, action_type="URL_UPDATED"):
"""
action_type: "URL_UPDATED" (新規/更新) または "URL_DELETED" (削除)
"""
body = {"url": url, "type": action_type}
try:
result = self.service.urlNotifications().publish(body=body).execute()
print(f"Google Indexing Sent: {url} ({action_type})")
return True
except Exception as e:
print(f"Google Indexing Error: {url} - {e}")
return False
3. 初期化
初期化と言うか、「Google Indexing API」を使えるようにします。
呼び出し側で。下記を記述します。
import GoogleIndexing
google = GoogleIndexing.GoogleIndexing(file_path)
「file_path」には、「Google Cloud コンソール」で、プロジェクトで作成したアカウント鍵ファイルのパスを設定します。
4. 更新通知
では、いよいよ、更新の通知を。
実は、「Bing Webmater Tools - IndexNow」の対応を行ったときに、サイトで作成・更新・削除を行ったページの「URI」を抽出するソースは作成済です。
そのソースを記述したプログラムは、1日1回「cron」で起動する仕組みも組んでいます。
後は、抽出したページを送信する仕組みを作成します。
ただし、「Google Indexing API」では、1日 200件までしか受け付けてくれないそうなので、200件を超える場合、次の日に持ち越す必要があります。
下記のテーブルを作成して。
Column | Type | Collation | Nullable | Default
---------+---------+-----------+----------+---------
uri | text | | not null |
deleted | boolean | | |
Indexes:
"google_pkey" PRIMARY KEY, btree (uri)
いったん、このテーブルにためておいて。
一回の処理につき、最大 200件 抽出して送り、送ったものからテーブルを削除するようにします。
送信部分を下記のように記述します。
# Google API 出力
targets = db.getForGoogle()
sent_uris = []
for item in targets:
action = "URL_DELETED" if item['deleted'] else "URL_UPDATED"
# API送信
if google.notify(item['uri'], action_type=action):
sent_uris.append(item['uri'])
else:
# 429エラー(制限超え)などが起きたらその時点でループを抜けるのが安全
break
# 成功したものだけ DB から消す
db.delForGoogle(sent_uris)
テーブルへ登録する箇所は、割愛しています。
登録済のテーブルからデータをひろってくるメソッドを呼び出しているのが「db.getForGoogle()」です。
「item['uri']」に、対象の「URI」が入っていて、削除の場合は「item['deleted']」が「true」になっています。
(「新規作成」は、「更新」で送ればいいらしい)
送信に成功したものをリストしていって、「db.delForGoogle()」でテーブルから削除します。
更新に関しては、試験済です。
|
|