- 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」のページに、個別で登録した際に表示される。

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