Bing Webmater Tools - IndexNow - まとめて送信

クラウディア 
1. 概要
2. テキストファイル
3. データベース
4. json で送信

1. 概要

 この辺で、「IndexNow」で紹介されている段取りと、構成が変わってきてしまいました。  前ページでは、1つの「URL」を1つずつ送信する方法について、記述していますが、まとめて送信することもできるそうです。  本ページは、下記のサイトを参考にさせていただきました。
IndexNow の登録・更新リクエストを python で自動で投げる」
「GitHub - lazarinastoy/indexnow-api-python: Submit your URLs from a JSON file export from Oncrawl to IndexNow API」
「indexing - Indexnow protocol POST request with JSON on PYTHON
 で、参考サイト通りに、コーディングしてやってみようと思うのですが。  どれもこれもうまくいかない。  ひとつは、「Python」のモジュールが、わたしの環境にインストールできませんでした。  ひとつは、実行時にエラーになる。  ひとつは、結果に「200」(OK)が返ってきたのですが、数日待っても、「Bing」に反映されない。

2. テキストファイル

 うまくいかないので、いずれまとめて送信は考えるとして、「Bing」の方から、更新が発生しているのに、「IndexNow」に登録していないじゃないの、やんやん言われるので。  前ページで、うまくいった方法をある程度、自動化してみようと思います。  こういうケースは、「Pyrhon」が一番。  こんなソースを書きました。

import os
import requests

key = 'ここにキーを書いているのです'

with open('ファイル名') as file:
  for line in file:
    posttext = 'https://www.bing.com/indexnow?url='+ line.rstrip(os.linesep) +'=url-change&key=' + key
    response = requests.get(posttext, headers={"Content-Type": "application/json"})
    print(line.rstrip(os.linesep), response)
 6 行目に記述しているファイル名は、テキストファイルです。  このテキストファイルの中に、「IndexNow」で処理してもらいたい「URI」を1行ずつ記述しておきます。  それで、実行すると、見事に登録してくれました。

3. データベース

 実は、サイトのデータを、「RSS」「ATOM」のために、データベースに出力しています。  レコードが、大雑把にこんな感じ。
 内容   型   備考 
インデックス integer
URI text
ドキュメント text
タイトル text
更新日時 time stamp
説明 text
コンテンツ内容 text

 全コンテンツいれているつもりなので、とりあえず、「URI」を指定して、そのツリーの配下を送信したい。
 全部送信できたら、更新日時を見て、更新されたコンテンツを送信するように・・・。

 てことで。
 下記のようなソースを書きました。


import psycopg2
import requests
import sys

key = 'ここにキーを書いているのです'

def select(prefix):
  try:
    ## データベースへ接続
    connection = psycopg2.connect("host=ホスト名 port=ポート番号 dbname=データベース名 user=ユーザ名 password=パスワード")

    ## クライアントプログラムのエンコードを設定(DBの文字コードから自動変換してくれる)
    connection.set_client_encoding('utf-8')

    cursor = connection.cursor()

    sql = "SELECT uri FROM テーブル名 WHERE uri LIKE '"+ prefix + "%' ORDER BY uri"

    cursor.execute(sql)

    results = cursor.fetchall()

    ## カーソルをとじて データベース切断
    cursor.close()
    connection.close()
    return results

  except Exception as ex:
    print(ex)
    exit()

if len(sys.argv) < 2:
  print('パラメータに uri を指定してください')
  exit()

listURI = select(sys.argv[1])

for item in listURI:
  uri = item[0]
  posttext = 'https://www.bing.com/indexnow?url='+ uri +'=url-change&key=' + key
  response = requests.get(posttext, headers={"Content-Type": "text/plain"})
  print(uri, response)
 これを。

python /パス/ファイル名.py URI
 で、起動すると、指定した「URI」以下をリストして、「IndexNow」へ送信します。  うまいこと、動いてくれます。

4. json で送信

 さて、参考サイトにあるもので、なんとか「json」形式で送信できないものかとやってみたのですが。  おそらく、「IndexNow の登録・更新リクエストを python で自動で投げる」のものが、一番簡単に見えるし、うまくいってるっぽい。  少しいじって、こんなソースにしました。

import json
import os
import psycopg2
import requests
import sys

key = 'ここにキーを書いているのです'

data = {
  "host": "freebsd.sing.ne.jp",
  "key": key,
  "keyLocation": "https://freebsd.sing.ne.jp/"+ key +".txt",
  "urlList": [ URIの列挙 ],
}

json_data = json.dumps(data)

response = requests.post(
  "http://api.indexnow.org/",
  data=json_data,
  headers={"Content-Type": "application/json"}
  )
print(response)   # 200ならok
 13行目の「URI の列挙」と書いてある部分は、前項もしくは、前々項のように、テキストファイルなり、データベースなりから、「URI」の文字列をリスト形式で取得します。  これ、実行すると、「200」が返ってくるので、決してエラーになるわけではありません。  わからないのが、19行目を「http://api.indexnow.org/」にしても「https://www.bing.com/」にしても「200」は返ってくるのですが。  「Bing Webmater Tools」の「IndexNow」のページに、個別で登録した際に表示される。
「Bing Webmater Tools」-「IndexNow」

 って、とこにリストされないのです。
 それが、とても不安なのですよ。
 この不安を解消する方法は、ないものかしら?

audiobook.jp
AbemaTV 無料体験
アフィリエイトのアクセストレード