PythonでWordPressに画像(メディアファイル)をアップロードしてみる

wp_rest_api+python+media

今回はWP REST APIのMedia APIを使ってワードプレスにメディアファイル(画像とか動画とか)をPythonでアップロードしてみる回。

前回の記事投稿と組み合わせればいろいろはかどるのでは?と期待。ではいざプログラミング。

本日の実験内容(目次)
(スポンサーリンク)

実験環境(バージョン情報)

Python: 3.8.7
WordPress: 6.0

WordPressのアプリケーションパスワードの準備

こちらの記事を参考にアプリケーションパスワードを設定してください。

Pythonでメディアファイルをアップロードするプログラムを作成

「ブログのURL/wp-json/wp/v2/media」という感じのURLをPOSTするらしい。

Postのパラメータとして認証情報とアップロードしたいファイルのバイナリデータを詰め込んでなげるみたい。
あと、ヘッダーに「Content-Type」、「Content-Disposition」が必要だった。

ちょっとがんばってファイルの拡張子でContent-Typeを切り替えて設定するようにしてみた。
足りないのがあったら勝手に追加して使ってください。

import os
import requests

# ブログのURL
blog_url = 'https://ブログのURL'

# WordPressのユーザー名
api_user = 'ユーザー名をここに入力'

# アプリケーションパスワード
api_password = 'アプリケーションパスワードをここに入力'

# アップロードするファイルパス
file_path = 'upload-test.png'

# Content-Typeの指定
file_name = os.path.basename(file_path)
file_extention = file_name.split('.')[-1].lower()
if file_extention in ['jpg', 'jpeg']:
    contentType = 'image/jpg'
elif file_extention == 'png':
    contentType = 'image/png'
elif file_extention == 'gif':
    contentType = 'image/gif'
elif file_extention == 'bmp':
    contentType = 'image/bmp'
elif file_extention == 'mp4':
    contentType = 'movie/mp4'
else:
    print(f'not supported [{file_extention}]')
    exit()

# リクエストのヘッダー情報
post_header = {
    'Content-Type': contentType,
    'Content-Disposition': f'attachment; filename="{file_name}"'
}

# ローカルのファイルのバイナリデータを読み込む
with open(file_path, 'rb') as f:
    img_bytes = f.read()

# Media APIのURL
post_api_url = f'{blog_url}/wp-json/wp/v2/media'

# メディアのアップロード
response = requests.post(post_api_url, headers=post_header, data=img_bytes, auth=(api_user, api_password))
res_json = response.json()

# アップロードされたメディアのIDを表示
print(res_json['id'])

実行する環境に合わせて以下の変数を変更して実行してください。
blog_url :記事を投稿したいブログのURL
api_user :ログインしているワードプレスのユーザー名
api_password:作成したアプリケーションパスワード
file_path :アップロードするファイルのパス(フルパス、相対パスどっちでも)

プログラムを実行するとメディアライブラリにファイルが追加される。

アップロードしたファイル名がメディアのタイトルになるみたい。

メディアのタイトルとかスラッグとかの情報も一緒に登録できたらいいんだけど、自分が試した限りではできなかったので追加されたメディアIDを使ってもう1回RESTAPIにリクエストをなげて情報を更新する必要がある。

同時にできるやり方知っている人いたらコメントください。

(スポンサーリンク)

メディアファイルの情報を更新

「ブログのURL/wp-json/wp/v2/media/メディアID」という感じのURLをPOSTすると更新できる。
POSTのパラメータにメディアの情報や認証情報を渡す。

メディアの項目についてはMedia API Referenceのスキーマを見てください。

ちなみにメディアIDはワードプレス管理画面の「メディア」⇒「ライブラリ」で
画像をクリックして編集画面を開いた時のURLで確認できる。
「xxxxx/wp-admin/post.php?post=999&action=edit」

import requests

# ブログのURL
blog_url = 'https://ブログのURL'

# WordPressのユーザー名
api_user = 'ユーザー名をここに入力'

# アプリケーションパスワード
api_password = 'アプリケーションパスワードをここに入力'

# メディアファイルのID
media_id = 0

# 更新するメディアの情報
post_data = {
    'title': 'アップロードテストファイル',
    'slug': 'updload-test001',
}

# Media APIのURL
post_api_url = f'{blog_url}/wp-json/wp/v2/media/{media_id}'

# メディア更新リクエスト
response = requests.post(post_api_url, json=post_data, auth=(api_user, api_password))

# レスポンスがどんな感じか表示
res_json = response.json()
print(res_json)

実行する環境に合わせて以下の変数を変更して実行してください。
blog_url :記事を投稿したいブログのURL
api_user :ログインしているワードプレスのユーザー名
api_password:作成したアプリケーションパスワード
media_id :更新したいメディアファイルのID

プログラムを実行するとメディアファイルが更新された。

まとめ

とりあえずメディアファイルの自動アップロードができた。
つぎはなにをしよう?

wp_rest_api+python+media

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

本日の実験内容(目次)