記事を一括でインデックス申請 – REST APIとIndexing API を組み合わせる

どうも

どうも、み・な・さ・ま!こんちくわ!さて、今回も全国の中年引きニートの皆さまのため、若年引きニートのわたくしが、恐らく有益だろう情報を、パッと見の雑さと裏腹にそれなりの労力をかけて書き連ねていきます。

まとめてインデックス申請したい

以前の記事で、PythonからIndexing APIを使ったのですが、今回はその応用でWordpress の Rest API を活用して、ブログ内の記事を一括でインデックス申請したいと思います!😍

流れ

  • REST APIの導入
  • REST APIから記事リンクの取得
  • Indexing APIでリクエスト

REST APIの導入

wordpressのサイドバーにて、「プラグイン -> 新規追加」から検索窓で「REST API」と打てばひょいっと出てくるので、インストールして有効化。

REST APIで記事リンクの取得

ここからは、ドキュメントを参考に進めます。細かいことはドキュメントを見ればわかります。

WP REST API v2 Documentation
Documentation for version 2.0 of the WP REST API.

記事のデータを取得

まずは記事のデータを取ります。細かいことはこちらに全て載っています。

WP REST API v2 Documentation
Documentation for version 2.0 of the WP REST API.

では早速コードを貼って解説します。

import requests
import urllib.parse as up
import json

GET_POSTS_PATH="wp-json/wp/v2/posts"
HEADERS={'User-Agent': 'Mozilla/4.5 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4517.159 Safari/537.36'}

def getPosts(url,page=1,params={}):
    params["page"]=page
    url=up.urljoin(url,GET_POSTS_PATH)
    res=requests.get(url,headers=HEADERS,params=params)
    if res.status_code // 100 != 2:
        return
    for data in json.loads(res.text):
        yield data

引数

引数 意味
url ブログのURL
page 取りたいページ
params REST APIにリクエストする際の引数。ドキュメントを参照。

paramsとはREST APIにリクエストする際の引数で、色々あるのですが、主なものを挙げると

引数 意味
per_page データの数
search 検索文字列。ブログ内の検索窓に打つときと同じように返る。
offset オフセット。何番目から始めるか。
categories カテゴリーID
orderby 並び順。 author,date,id,rand,…… など。

categoriesのカテゴリーIDとは、「ゲーム、ブログ、…」のようなカテゴリー名ではなく、数字の番号なんで、一工夫必要です。少し具体的にいえば、REST APIのカテゴリー検索でとります。

試す

一応試します。さっきのつづき🤩

url="https://torino2019.com/fanzacapa/"
for data in getPosts(url):
    print(data)

ピピピピピピ……

'id': 1612997243, 'date': '2022-03-12T18:10:48', 'date_gmt': '2022-03-12T09:10:48', 'guid': {'rendered': 'https://torino2019.com/fanzacapa/2022/03/12/%e7%b6%9a%e3%83%bb%e7%b4%a0%e4%ba%ba%e5%a8%98%e3%80%81%e3%81%8a%e8%b2%b8%e3%81%97%e3%81%97%e3%81%be%e3%81%99%e3%80%82-vol-30-%e3%80%90mgs%e3%81%a0%e3%81%91%e3%81%ae%e7%89%b9%e5%85%b8%e6%98%a0%e5%83%8f/'}, 'm ...............
        :
        :
        :

 

記事リンクの取得

data["link"]

でとれます。

url="https://torino2019.com/fanzacapa/"
for data in getPosts(url): 
  link=data["link"]
  print(link)

じ、じ、じ、… 実行!

https://torino2019.com/fanzacapa/2022/03/12/%e7%b6%9a%e3%83%bb%e7%b4%a0%e4%ba%ba%e5%a8%98%e3%80%81%e3%81%8a%e8%b2%b8%e3%81%97%e3%81%97%e3%81%be%e3%81%99%e3%80%82-vol-30-%e3%80%90mgs%e3%81%a0%e3%81%91%e3%81%ae%e7%89%b9%e5%85%b8%e6%98%a0%e5%83%8f/
       :
       :
       :

インデックスのリクエスト

前の記事をご覧ください。

PythonでIndexing APIを使う
Indexing APIとは 最近サイトを開設したのですが、中々インデックスされず、多分自分のサイトに問題があるのでしょうが、一応Indexing APIというのがあり、勉強しておけば便利かなと思いやってみました。 Indexing...

まとめる

import urllib.parse as up
import requests
import json
import time
from myutil import site
from oauth2client.service_account import ServiceAccountCredentials
import httplib2
import json
import urllib.parse as up

GET_POSTS_PATH="wp-json/wp/v2/posts"

def getPosts(url,page=1,params={}):
  params["page"]=page
  url=up.urljoin(url,GET_POSTS_PATH)
  res=requests.get(url,headers=site.HEADERS,params=params)
  if res.status_code // 100 != 2:
    return
  for data in json.loads(res.text):
    yield data

SCOPES = [ "https://www.googleapis.com/auth/indexing" ]
ENDPOINT = "https://indexing.googleapis.com/v3/urlNotifications:publish"
META_ENDPOINT="https://indexing.googleapis.com/v3/urlNotifications/metadata"

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)
  return client.request(ENDPOINT, method="POST", body=content)
def updates(client,urls):
  for url in urls:
    update(client,url)

def get_meta(client,url):
  endpoint=META_ENDPOINT+"?url="+url
  return client.request(endpoint, method="GET")

if __name__ == "__main__":
  url="https://torino2019.com/fanzacapa/"
  JSON_FILE=r"C:\Users\tetsu\Downloads\phrasal-faculty-287800-e3434667778b.json"
  client=get_client(JSON_FILE)
  for data in getPosts(url):
    link=data["link"]
    res,content=update(client,link)
    print(content)
    time.sleep(1)
updates(client,map(lambda data:data["link"],getPosts(url)))

の方がシュッとしてるかも。どこか無理してる感はありますが。(笑)

おわりに

実は他にエロブログを運営してるのですが、というかこのブログは運営というほどではないですが(笑)、大規模なせいか質が悪いのか中々インデックスされず、裏ワザ的にこの方法を試すと、すぐにインデックされました。(笑) 多分 Indexing APIは多少の技術と根気が要るので、それで選別してるんですかね。😋まあお疲れさまでした。お役に立てば幸いです。

コメント

タイトルとURLをコピーしました