tetero
@tetero (tetero)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

pythonでスクレイピングしてWordPressの自分のサイトに自動投稿したい

解決したいこと

pythonでスクレイピングしてWordPressの自分のサイトに自動投稿したい


発生している問題・エラー

下記の参考サイトのコードを打つと
Response [403]
が返ってくる。

下記のサイトで解決しました!
[WordPress]WP REST APIを使おうとすると403(Forbidden Access)エラーになる

しかし、今度は
Response [401]
が返ってくるようになりました。。

WordPressのRESTAPIでアプリケーションパスワードの認証がとおらないなら

こちらのサイトにあるように下記のコードをhtaccessに追記しましたが、まだ401が出てきます。。。
RewriteRule .* - [E=RE> RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]


参考サイト

[Python]WordPressの自動投稿をしてみた


該当するソースコード



# Pythonのお勉強 No.4 WordPressの自動投稿
import requests
import urllib
from bs4 import BeautifulSoup
from datetime import datetime

# スクレイピング対象
url = 'https://news.google.com/search'
keyword = "香川真司 OR 久保建英"
params = {'hl':'ja', 'gl':'JP', 'ceid':'JP:ja', 'q':keyword}

# WordPress接続情報
WP_URL = 'https://xxxx.com'
WP_USERNAME = 'userName'
WP_PASSWORD = 'xxxx xxxx xxxx xxxx xxxx xxxx'

# WordPress新規投稿関数
def post_article(status, slug, title, content, category_ids, tag_ids, media_id):

   # REST APIを使うための認証情報
   user_ = WP_USERNAME
   pass_ = WP_PASSWORD
   # 投稿記事情報
   payload = {"status": status,                     #ステータス 公開:publish, 下書き:draft
              "slug": slug,                         #URLスラッグ
              "title": title,                       #タイトル
              "content": content,                   #内容
              "date": datetime.now().isoformat(),   #投稿日時
              "categories": category_ids,           #カテゴリー
              "tags": tag_ids}                      #タグ
   if media_id is not None:
       payload['featured_media'] = media_id         #アイキャッチ画像

   # 記事の新規投稿を行う
   res = requests.post(urllib.parse.urljoin(WP_URL, "wp-json/wp/v2/posts"),     #"wp-json/wp/v2/posts"にPostすると新規投稿になる
                       json=payload,                                            #投稿する記事の内容を設定する
                       auth=(user_, pass_))                                     #ユーザ、パスワードを設定する
   return res

# スクレイピング対象のURLにリクエスト
res = requests.get(url, params=params)
soup = BeautifulSoup(res.content, "html.parser")

# レスポンスからh3階層のニュースを1件抽出する
h3_entry = soup.select_one(".xrnccd")

# ニュースのリンク先URLを取得し、整形してフルパスの<a>タグを作る
h3_link = h3_entry.select_one("h3 a")["href"]
h3_link = urllib.parse.urljoin(url, h3_link)
content = '<a href="' + h3_link + '">' + h3_link + '</a>\n'

# 記事を下書き投稿する
post_article('draft',
             'WordPress-New-Post',
             '【動作確認】WordPress自動投稿',
             content,
             category_ids=[2],
             tag_ids=[5,6],
             media_id=759)

確認したいこと

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
WordPress接続情報
WP_URL = 'https://xxxx.com'
WP_USERNAME = 'userName'
WP_PASSWORD = 'xxxx xxxx xxxx xxxx xxxx xxxx'
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

これを自分のに変えたんですが下記の画像の箇所のものを当てはめています。
WP_PASSWORDはApplication Passwordsで生成されたものをこちらに入れています。

合っていますでしょうか?

スクリーンショット 2021-02-02 16.17.02.png

スクリーンショット 2021-02-02 16.23.18.png


自分で試したこと

  1. Application Passwordsで生成したパスワード、もう一度生成しなおしましたが同じ結果でした。
  2. セキュリティ系のプラグインは今回使用しているApplication Passwordsだけでした。
  3. WordPressにログインして新規投稿する(タイトル、本文のみ)の動作確認をしたいのですが、一番シンプルな形はこれなのかな?というコードにしてみました。下記にのでご覧いただきたいです。これだとまだ一度にたくさんのことを実行してるコードになっていますでしょうか?また、不必要であったり必要なところが抜けていたら教えて頂けますでしょうか?
  4. print(res.text)を入れてみました!ニュース記事的なものがたくさん取れているようでした。
# Pythonのお勉強 No.4 WordPressの自動投稿
import requests
import urllib
from bs4 import BeautifulSoup
from datetime import datetime


# WordPress接続情報
WP_URL = 'xxxxxxxxx'
WP_USERNAME = 'xxxxx'
WP_PASSWORD = 'xxxxxxxxxxxxxx'

# WordPress新規投稿関数
def post_article(status, slug, title, content, category_ids, tag_ids, media_id):

   # REST APIを使うための認証情報
   user_ = WP_USERNAME
   pass_ = WP_PASSWORD
   # 投稿記事情報
   payload = {"status": status,                     #ステータス 公開:publish, 下書き:draft
              "slug": slug,                         #URLスラッグ
              "title": title,                       #タイトル
             }                      #タグ
   if media_id is not None:
       payload['featured_media'] = media_id         #アイキャッチ画像

   # 記事の新規投稿を行う
   res = requests.post(urllib.parse.urljoin(WP_URL, "wp-json/wp/v2/posts"),     #"wp-json/wp/v2/posts"にPostすると新規投稿になる
                       json=payload,                                            #投稿する記事の内容を設定する
                       auth=(user_, pass_))                                     #ユーザ、パスワードを設定する
   return res
print(res.text)


# 記事を下書き投稿する
post_article('draft',
             'WordPress-New-Post',
             '【動作確認】WordPress自動投稿',
             content,
             category_ids=[2],
             tag_ids=[5,6],
             media_id=759)
0

No Answers yet.

Your answer might help someone💌