Indexing APIとは
最近サイトを開設したのですが、中々インデックスされず、多分自分のサイトに問題があるのでしょうが、一応Indexing APIというのがあり、勉強しておけば便利かなと思いやってみました。
Indexing APIとは、サイトをインデックスしてもらうためのAPIらしく、インデックスされるためには、Googleのクローラーが自サイトを巡回しないとダメなんですが、ボーっとしてると中々来てもらえずサイトを登録してもらえないハメになります。そしてサイトマップを送信したり、URLをフェッチしたりするわけで、大体はそれで間に合うのでしょうが、実はこのIndex APIでリクエストしてクローラーを呼ぶ方が良いらしく、即効性があるらしいです。しかし本来は求人情報などの、いわゆる必要必急(?)の情報のためのシステムで、単にエゴイズムの発露で使用するとペナるかもしれないですが、「皆やってる、やってへんのお前だけ」という感じで、そして「赤信号みんなで渡れば怖くない」といいながら試します。
一応解説しますが、ネット上には沢山の親切な情報があり、車輪の最発明は馬鹿々々しいので、小奇麗にまとめて自分の困ったところを注記します。
流れ
ざっくりと流れを説明しますと、
- サイトをSearch Consoleに登録
- Indexing APIのサービスアカウントを追加
- サービスアカウントをサイト所有者として追加
- 認証&リクエスト用のPythonのライブラリをインストール
- Pythonで認証&リクエスト
サイトをSearch Consoleに追加
まずはサイトをSearch Consoleに追加します。まあこの情報はネットにゴロゴロあり、Googleの手引きに従えば出来るので、細かい説明は要らないでしょう。
少し難しいのはTXTレコードによる認証ですが、参考サイト様が丁寧に解説してくださってるので出来るでしょう!😂結局はドメインサーバーにTXTレコードを追加するのです。この参考サイト様は
- エックスサーバー
- さくらインターネット
- ロリポップ
の解説をしており、Mixhostなら
が参考になります。それ以外は、「<サーバー名> DNS レコード追加」などで調べればわかりますかね。(笑)
ドキュメントを紐解く
次は Indexing API のサービスアカウントの追加なんですが、ここからはGoogleの公式ドキュメントを参考にやります。勿論ドキュメントでわかれば良いです。一応少しかみ砕いて書きたいです。自分はわからなかったので。(笑)
サービスアカウントの作成
まずはサービスアカウントをつくります。これは手順に従うと出来るでしょう。ドキュメントの「サービスアカウントを作成する」をご参照ください。
JSONのファイルが手に入るので、大切に保管ください。
サービスアカウントをサイト所有者として追加
次は、要するに先程作成したサービスアカウントをサイトの所有者として登録します。赤の他人のサイトのインデックスを操作できたら困りますからね。(笑) 次はドキュメントの「お使いのサービス アカウントに所有者ステータスを付与する」をご参照ください。
メールアドレスというのは、サービスアカウントのメールアドレスでJSONファイル内に書いてあります。
ライブラリのインストール
これからブログラムを組んでいくのですが、そのためのライブラリを入手します。無くてもできるなら構いませんが、僕はアクセス認証が良くわからないので、ライブラリの恩恵を授かることにします。(笑) あと、ここからはProgrammer Life さんの記事も参考に進めます。
まず、色々ライブラリがあり環境構築も人それぞれです。ライブラリの解説ではvertualenvでの隔離環境の作成を推奨してますし、Programmer LifeさんはColabというリモート環境でやられてます。僕は面倒ですし、仕事で大規模にやるのではないので、普通に入れました。今回使うのは
- google-api-python-client
- oauth2client
です。
$ pip install google-api-python-client $ pip install oauth2client
では、どんどん行きましょう!
認証&リクエスト
では、ついにコードを書きます。まず、公式ドキュメントのコードをコピペします。
from oauth2client.service_account import ServiceAccountCredentials import httplib2 SCOPES = [ "https://www.googleapis.com/auth/indexing" ] ENDPOINT = "https://indexing.googleapis.com/v3/urlNotifications:publish" # service_account_file.json is the private key that you created for your service account. JSON_KEY_FILE = "service_account_file.json" credentials = ServiceAccountCredentials.from_json_keyfile_name(JSON_KEY_FILE, scopes=SCOPES) http = credentials.authorize(httplib2.Http()) # Define contents here as a JSON string. # This example shows a simple update request. # Other types of requests are described in the next step. content = """{ \"url\": \"http://example.com/jobs/42\", \"type\": \"URL_UPDATED\" }""" response, content = http.request(ENDPOINT, method="POST", body=content)
これで十分ですが、少し改造します。
from oauth2client.service_account import ServiceAccountCredentials import httplib2 import json SCOPES = [ "https://www.googleapis.com/auth/indexing" ] ENDPOINT = "https://indexing.googleapis.com/v3/urlNotifications:publish" def get_client(json_file): credentials=ServiceAccountCredentials.from_json_keyfile_name(json_file,scopes=SCOPES) return credentials.authorize(httplib2.Http()) def update(client,url): content ={ "url":url, "type": "URL_UPDATED" } content=json.dumps(content) #response,content = return client.request(ENDPOINT, method="POST", body=content) if __name__ == "__main__": JSON_KEY=<JSONファイルのパス> url="<登録したいURL>" client=get_client(JSON_KEY) print(client) res,content=update(client,url) if res.status // 100 == 2: print("OK!") else: print(content)
実行して、上手くいけば「OK!」と表示されるはずです。
エラーの場合、Programmer Lifeさんがおっしゃるのは
- 403 : Index APIを有効化する必要あり。
- 400 : JSONのバックスラッシュが不要。
が原因の場合もあるらしいです。Index APIの有効化は
- サービスアカウントのページを開く
- 検索窓で「Indexing API」と検索
- Indexing APIをクリックし、「有効」でなければ、「有効化」ボタンを押す。
でいけるらしいです。JSONは大丈夫だと思います。
応用の構想
今回は筆者の無気力と怠惰により基本的なことのみを書きました。一応、これを使って
- 複数のURLを一括で登録
- URLのリストのファイルを読み込む
- REST APIで記事やカテゴリーページを検索し登録
なども出来ると思います。REST APIと組み合わせて登録は気力が湧けば書きたいです。簡単に出来るはずですが。(笑)
まとめ
今回はIndexing APIを使いました。世の中には色々なものがあるものですね!常々、どの話題にも参考になるサイトがあって感動します。拙いながらこうして記事を書くと、ゴミのように溢れるネット記事の一つ一つが、膨大な労力と気遣いの産物であることに気付きました。僕の書いたブログもネットの海を漂流する一ゴミ記事にすぎないでしょうが、何気ない誰かのサイトで救われたことがあるように、自分のサイトが誰か一人でも救えたら良しとします。読んで頂きありがとうございました。お疲れさまでした😂
コメント