WordPressへ、Pythonで自動アップロードした画像を、ブログ内で使い、ブログを自動投稿する

画像自動アップロード and ブログ自動投稿

これまでに Python による自動処理をいくつか試してみました。まだやっていないパターンとして、今回は、自動アップロードした画像をブログ内で使用し、そのブログを WordPress へ自動投稿するということをしたいと思います。

画像の準備

これです。ファイル名は "image_auto_upload_test_20210520.png" にします。

画像の自動アップロード

フローは、画像を自動アップロードし、その Response 情報を使って、その画像をブログ内で使い、そのブログを自動投稿するという流れになります。

まずは、画像を自動アップロードし、その Response を情報として残すコードです。

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 がどこに格納されているかというと、それは、response 情報の "source_url" です。

コード内で、media_info['source_url'] で URL を持ってきています。

auto_post_20210520.py


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>[kanren id="566"]'

    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自動投稿テスト(ブログ内画像付き)