PythonでWordPressに自動アップロードした画像を記事で使い、その記事を自動投稿する

これまでにPythonによるWordPressの自動処理をいくつか試してみました。

まだやっていないパターンとして、これをやってみようと思います。

  • 画像を自動アップロードする。
  • その画像を記事内で使う。
  • 作成した記事を自動投稿する。

画像の準備

記事内で使用する画像はこれです。ファイル名は “image_auto_upload_test_20210520.png” にします。

画像を自動アップロードする

画像を自動アップロードし、そのレスポンスから画像に付与された情報を返すコードです。

# auto_upload_20210520.py
import requests
from urllib.parse import urljoin
import os
import json

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

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

    f = open(file_path, 'rb')
    image_data = f.read()
    f.close()

    filename = os.path.basename(file_path)
    print(filename)
    headers = {
        'Content-Type': 'image/png',
        'Content-Disposition': 'attachment; filename=' + filename,
    }

    res = requests.post(
        url,
        data=image_data,
        headers=headers,
        auth=(user, password),
        )
    media_info = res.json()
    print(json.dumps(media_info, indent=4))
    return media_info

記事内で画像を使い、記事を自動投稿する。

画像をPOSTしたときのレスポンスから画像のURLを取得し、それを記事内で使用するというコードです。

自動アップロードした画像のURLは source_url に格納されています。コードでは media_info[‘source_url’] でURLを持ってきています。

※サンプルコードが読みづらいので、一部省略しています。

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

import auto_upload_20210520

def wp_post(media_info):
    url_base = 'https://kamiki.blog/'
    url = urljoin(url_base, 'wp-json/wp/v2/posts/')

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

    content = 'これは自動投稿テストです。<br>'
    content += '自動アップロードした画像をブログ内で使用します。<br>'
    content += '<img src="' + media_info['source_url'] + '"><br>'
    content += '下記記事参照。<br>※ここ一部省略します。'

    post = {
        'title': 'WordPress自動投稿テスト(ブログ内画像付き)',
        'status': 'publish', # draft(下書き), publish(公開)
        'slug': 'wordpress-auto-post-test-with-image', # パーマリンク
        'categories': 5, # カテゴリID
        'date': datetime.now().isoformat(),
        'content': content,
    }

    res = requests.post(
        url,
        json=post,
        auth=(user, password),
        )
    print(res)
    return

if __name__ == '__main__':
    filename = 'image_auto_upload_test_20210520.png'
    file_path = os.path.join(os.getcwd(), filename)
    media_info = auto_upload_20210520.wp_upload_media(file_path)
    wp_post(media_info)

自動投稿の結果

こちらが自動投稿記事です。

WordPress自動投稿テスト(ブログ内画像付き) WordPress自動投稿テスト(ブログ内画像付き)