私は毎週更新している [資産運用の週次報告] はその週の「本文の一部」「画像ファイル」「リンクURL」を差し替えて手動で更新しています。ある程度の型が決まっているため更新作業自体は30分ほどで終了できるのですが、今回その作業を自動化する方法をステップに分けて紹介して行きます。
以前「 Pythonを使ってWordpressに自動投稿 」を行うためにWP REST APIの準備とPythonコードを紹介しました。

本記事では「 Pythonを使ってWordPressに画像をupload 」する方法をコード付きで紹介したいと思います。
はじめに
WordPressで[資産運用の週次報告]のページのように実用的な自動投稿を実現するため本記事を含めて5つのステップに分けて解説していきます。
- PythonとWordPressを連携して記事の下書き投稿する
- PythonでWordPressに画像を追加 (本記事)
- PythonでWordPressに複数の画像を一括で追加
- PythonとJinja2でWordPress投稿記事を編集 (本文・画像追加・ギャラリー)
- REST APIでHTML文とアイキャッチ画像を設定して投稿する
各ステップの流れを一つの流れに整理すると以下のフロー図で示すことができ、本記事で紹介する範囲は黄色ハイライトした箇所です。複数の記事にまたがるとどの内容を見ているかを見失ってしまいやすいので、適宜このフローチャートを確認してください。

◆ Mac OS
◆ Python 3
◆ JupyterLab
◆ WordPress ver. 5.8
WP REST API とは
「WP REST API」とは、通常であれば直接WordPressのサイト・アプリ上で記事の作成・投稿を行なっていたものをPythonなどWordPress外のシステムを用いてサイト情報の読み取り、投稿の追加などを「REST API」で行うWordPress用のプラグインが「WP REST API」です。
WordPress 4.7から標準実装になったためver.4.7以降であればすぐに使えます。
「WP REST API」が何か概要がわかったところで以下から実際に自動投稿を行うための準備とコードを紹介します。
アプリケーションパスワードを発行
「WP REST API」を使用することで記事の投稿が出来ますが、外部から誰でも投稿が出来てしまうとセキュリティ上問題です。そのため、記事の投稿にはその都度「認証」が必要となります。
「WP REST API」で今回は「アプリケーションパスワード」を発行することでセキュリティ対策を行います。
プラグインを使用しない方法
WordPressの画面左側のアイコン一覧から「ユーザー」→「プロフィール」を押したのちに、下へスクロールした箇所にある「アプリケーションパスワード」の項目があることを確認します。「新しいアプリケーションパスワード名」に任意の名前を入力し、新しいアプリケーションパスワードを追加ボタンを押すと20文字のパスワードが生成されます。

WordPressのVer.によっては上記の「アプリケーションパスワード」が表示されない場合もあるため、その際には以下の方法で対応ください。
プラグイン「Application Password」を使用する方法
プラグインとしてApplication PasswordをWordPressにインストールします。
WordPressの画面左側のアイコン一覧から「プラグイン」→「新規追加」を押したのちに、右上の検索バーに「Application Password」と入力して出てきた以下のプラグインをインストール・有効化をしてください。

「ユーザー」→「プロフィール」画面で「Application Passwords」の項目が存在することを確認して投稿者権限を有するユーザ名を入力後、「Add User」ボタンを押し生成されるパスワードを控えておきます。
Pythonでコードの準備
それではいよいよPythonで外部からWordPressの投稿ができるか確認して見ましょう。まず初めにブログのURL, User名と上の章で確認したアプリケーションパスワードを設定します。以下に示す関数の中の9~11行目のコード中で”要変更”と書いてある項目をupdateしてください。
# URL, User, Password設定 MY_URL: str = "要変更https://hoge-hoge.com" MY_USER: str = "要変更user" MY_APP_PASSWORD: str = "要変更abcd efgh ijkl mnop qrst uvwx"
User名は「ユーザー」から確認することができます。

前回紹介した「記事の自動投稿」と異なり今回の関数はメディアファイルのuploadのみですのでPythonで実行した結果いきなり記事を公開してしまうわけではないので安心して動作確認を行なってください。
import requests
from urllib.parse import urljoin
import os
import json
# def設定: WordPressのメディアにファイルをupload
def wp_upload_path_media(filepath):
# URL, User, Password設定
MY_URL: str = "要変更https://hoge-hoge.com"
MY_USER: str = "要変更user"
MY_APP_PASSWORD: str = "要変更abcd efgh ijkl mnop qrst uvwx"
url = urljoin(MY_URL, 'wp-json/wp/v2/media/')
file_path = filepath
# print('filepath: ' + file_path)
filename = filepath[41:] # 数字はfilepathに応じて変更すること
# print('filename: ' + filename)
f = open(file_path, 'rb')
image_data = f.read()
f.close()
headers = {
'Content-Type': 'image/png',
'Content-Disposition': 'attachment; filename=' + filename,
}
res = requests.post(
url,
data=image_data,
headers=headers,
auth=(MY_USER, MY_APP_PASSWORD),
)
media_info = res.json()
# print(json.dumps(media_info, indent=4)) # uploadステータス(不要な場合はコメントアウト)
media_id = media_info['id'] # アップロードした画像のID
media_url = media_info['source_url'] # アップロードした画像のURL
# 後にmedia情報を取得するためにlistとして各種情報を取得
media_info_list = [filename, file_path, media_id, media_url]
return [filename, file_path, media_id, media_url]
filename」「パス名 file_path」「メディアID media_id」「メディアURL media_url」を取得します。16行目の
filename = filepath[41:] # 数字はfilepathに応じて変更することの41は私の環境での数字でありフォルダ名や構成に応じて数字を変更する必要があります。ここではメディアファイルのuploadのために参照したパスfilepath の最後にファイル名が入ります(以下の例だとxxx.png)。ファイル名が始まるちょうどの文字数をカウントして設定します。
/Users/mark/Jupyter Lab/50_Blog/99_other/xxx.png
「メディアID
media_id」「メディアURL media_url」を取得するには33行目で作成したmedia_info中から情報を抜き出す必要があります。現在は34行目はコメントアウトされておりますが、このコメントを外してprint()で実行した結果が以下に示されております。このようにmedila_infoの中には様々な情報が入っていてここから必要な情報を取り出します。1つ目の“id"にはこのアップロードしたメディアファイルのID番号が示されております。真ん中あたりにメディアURLの情報が
"source_url"に示されています。
{
"id": 4585,
"date": "2022-07-15T07:23:13",
"date_gmt": "2022-07-14T22:23:13",
"guid": {
"rendered": "https://life100create.com/wp-content/uploads/2022/07/test.png",
"raw": "https://life100create.com/wp-content/uploads/2022/07/test.png"
},
"modified": "2022-07-15T07:23:13",
"modified_gmt": "2022-07-14T22:23:13",
"slug": "test-2",
"status": "inherit",
"type": "attachment",
"link": "https://life100create.com/test-2/",
"title": {
"raw": "test",
"rendered": "test"
},
"author": 1,
"comment_status": "open",
"ping_status": "closed",
"template": "",
"meta": {
"spay_email": ""
},
"permalink_template": "https://life100create.com/?attachment_id=4585",
"generated_slug": "test-2",
"yoast_head": "<!-- This site is optimized with the Yoast SEO plugin v17.4 -
<< 中略 >>
"alt_text": "",
"media_type": "image",
"mime_type": "image/png",
"media_details": {
"width": 427,
"height": 273,
"file": "2022/07/test.png",
"sizes": {
"medium": {
"file": "test-300x192.png",
"width": 300,
"height": 192,
"mime_type": "image/png",
"source_url": "https://life100create.com/wp-content/uploads/2022/07/test-300x192.png"
},
<< 省略 >>
35, 36行目でこれらの情報を取り出しております。
media_id = media_info['id'] # アップロードした画像のID
media_url = media_info['source_url'] # アップロードした画像のURL
Pythonを使ってWordPressに画像をupload 実行結果
それでは実際に上記のコードを実行してみましょう。uploadするファイルはご自身で用意し以下のパス名は適宜変更してください。私は以下の「test.png」を用意しました。

wp_upload_path_media('/Users/mark/Jupyter Lab/50_Blog/99_other/test.png')
実行結果
関数として定義したコードを実行すると、投稿が無事に追加された場合には以下のlistが返され、「ファイル名 filename」「パス名 file_path」「メディアID media_id」「メディアURL media_url」が取得できました。
['test.png', '/Users/mark/Jupyter Lab/50_Blog/99_other/test.png', 4588, '<a href="https://life100create.com/wp-content/uploads/2022/07/test.png" target="_blank" rel="noopener" data-mce-href="https://life100create.com/wp-content/uploads/2022/07/test.png">https://life100create.com/wp-content/uploads/2022/07/test.png</a>']

次のステップに向けて

今回は「 Pythonを使ってWordPressに画像をupload 」を実行するため、「WP REST API」の準備と「pythonのコード」を紹介しました。
この段階ではまだWordPressの自動投稿で実用的な段階ではありませんが、まず第一ステップとしてPythonとWordPressを繋げることができました。
WordPressで[資産運用の週次報告]のページのように実用的な自動投稿を実現するためのステップは以下の通りです。
- PythonとWordPressを連携して記事の下書き投稿する
- PythonでWordPressに画像を追加 (本記事)
- PythonでWordPressに複数の画像を一括で追加
- PythonとJinja2でWordPress投稿記事を編集 (本文・画像追加・ギャラリー)
- REST APIでHTML文とアイキャッチ画像を設定して投稿する
次回は、「Pythonを使ってWordPressに複数の画像を一括で追加」する方法について紹介したいと思います。



コメント