WordPressへ、Pythonで画像を自動アップロードする

メディアを自動アップロードしたい

アイキャッチ付きの記事を自動投稿するときに、メディアを WordPress にアップロードしておく必要があります。記事が自動投稿なら、メディアも自動アップロードしたくなります。そこで、Python でやってみました。

WP REST API Handbook を見ましたが、これだけで実装できる人はいないような内容になっていました。
REST API Handbook Media

最も参考になったサイトは stackoverflow にありました。
How to upload images using wordpress REST api in python?

画像を用意する

最終的にはアイキャッチ付きの記事を自動投稿したいので、アイキャッチ画像を用意しました。ファイル名は "eyecatch_auto_post_test_20210518.png" にしました。

自動アップロードの実装

いきなりコードになりますが、こうです。アプリケーションパスワードを使いますが、わからない方はこの記事をご覧ください。

WordPressへ、Pythonではじめての自動投稿
auto_upload.py


import requests
from urllib.parse import urljoin
import os
import json

def wp_upload_media():
    url_base = 'https://kamiki.blog/'
    url = urljoin(url_base, 'wp-json/wp/v2/media/')

    user = 'xxx' # ユーザー名
    password = 'xxx' # アプリケーションパスワードで発行したパスワード

    filename = 'eyecatch_auto_post_test_20210518.png'
    file_path = os.path.join(os.getcwd(), filename)
    print(file_path)
    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=(user, password),
        )
    res_dict = res.json()
    print(json.dumps(res_dict, indent=4))
    unique_id = res_dict['id'] # アップロードした画像のID
    return

if __name__ == '__main__':
    wp_upload_media()

実行後、メディアライブラリを見ると、アップロードができていることが確認できます。

アップロードしたメディアの扱い方

メディアを POST し、そのメディアを記事に使うには POST したときの response 情報が必要になります。アップロードした画像に配布される ID を res から変数に保存しておきます。それが、上のコードの unique_id という変数です。