PythonでWordPressに画像付き記事を投稿する

# はじめに

WordPressでブログ記事を書く際に、Pythonで集計したグラフを入れてそのままPythonから画像付き記事を投稿出来ないか調べた備忘録です。

# PythonからWordPressに投稿する方法

2種類方法があるらしいですが、ここでは　Python-wordpress-xmlrpc　を使用しました。

[python-wordpress-xmlrpc](https://python-wordpress-xmlrpc.readthedocs.io/en/latest/overview.html)

# 使用環境
```python
$python -V
Python 3.8.3
```

## インストール

python-wordpress-xmlrpcのインストールはpipでします。
私はAnacondaを使用しているので、本来はcondaでインストールしたいのですが見つかりませんでした。

```python
pip install python-wordpress-xmlrpc
```

# 画像付き記事を投稿するサンプルコード

```python
# import
import os
import datetime

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods import media
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from wordpress_xmlrpc.methods.users import GetUserInfo


def upload_image(in_image_file_name, out_image_file_name):
    if os.path.exists(in_image_file_name):
        with open(in_image_file_name, 'rb') as f:
            binary = f.read()

        data = {
            "name": out_image_file_name,
            "type": 'image/png',
            "overwrite": True,
            "bits": binary
        }

        media_id = wp.call(media.UploadFile(data))['id']
        print(in_image_file_name.split('/')
              [-1], 'Upload Success : id=%s' % media_id)
        return media_id
    else:
        print(in_image_file_name.split('/')[-1], 'NO IMAGE!!')


# Set URL, ID, Password
WORDPRESS_ID = "YourID"
WORDPRESS_PW = "YourPassword"
WORDPRESS_URL = "YourURL/xmlrpc.php"
wp = Client(WORDPRESS_URL, WORDPRESS_ID, WORDPRESS_PW)

# Picture file name & Upload
imgPath = "picture.png"
media_id = upload_image(imgPath, imgPath)

# Blog Title
title = "記事タイトル"

# Blog Content (html)
body = """

<p>本文本文本文本文本文本文本文本文本文本文本文本文本文本文</p>

<h2>見出し</h2>

<figure class="wp-block-image alignwide size-large">
<img src="YourURL/wp-content/uploads/year/month/%s" alt="" class="wp-image-%s"/>
</figure>

""" %(imgPath, media_id)

# publish or draft
status = "draft"

#Category keyword
cat1 = 'category1'
cat2 = 'category2'
cat3 = 'category3'

#Tag keyword
tag1 = 'tag1'
tag2 = 'tag2'
tag3 = 'tag3'

slug = "slug"

# Post
post = WordPressPost()
post.title = title
post.content = body
post.post_status = status
post.terms_names = {
    "category": [cat1, cat2, cat3],
    "post_tag": [tag1, tag2, tag3],
}
post.slug = slug

# Set eye-catch image
post.thumbnail = media_id

# Post Time
post.date = datetime.datetime.now() - datetime.timedelta(hours=9)

wp.call(NewPost(post))
```

# 課題
画像リンクがもっといい書き方があるのではないかと思いますが、改良方法が見つかれば修正します。

# 効果
データをPythonで処理してグラフ作成し、そのままグラフ付き記事にしてWordPressに投稿と自動化できるためとても楽です。これから活用していきたいです。

# 追記：2021/8/8

ご質問をいただきました。ありがとうございます。

Q：これを使って投稿することはできたんですが、なぜかiframeが消えてしまうのですが原因わかったりしますか？

A：試してみましたが、COCOONでは特に問題なくiFrameが表示出来ました。

YouTubeを埋め込んだ例です（藤井風さんのPVを貼らせていただきました！）。
iFrameの埋め込みは下記サイトを参考にさせていただいています。
[WordPressサイトにiFrameコードを埋め込む方法（手動およびプラグインを使用）](https://kinsta.com/jp/blog/wordpress-iframe/)

サイトにある通り、YouTubeはサイトURLを貼り付けても表示できませんでした（上）。
埋め込みコードを取得することで、この方法で記事を投稿しても特に問題なくiFrameが使えるようです（下）。
COCOONでは問題なく表示できることを確認しました。ですのでWordPressテーマによるのかもしれませんが、すいません、原因は分かりません。ご参考までです。

```python
body = """
<iframe src="https://www.youtube.com/watch?v=7s4RmXxcZvM"></iframe>

<iframe width="560" height="315" src="https://www.youtube.com/embed/TcLLpZBWsck" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
"""
```

![スクリーンショット 2021-08-08 10.19.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852498/7d2332ec-0dde-aaa1-b53a-13d6c8f33c2b.png)


# 参考サイト

色々な記事を参考にさせていただきました。ありがとうございます。

- [Pythonでwordpressに自動で投稿する（python-wordpress-xmlrpc）](https://np-sys.com/python%E3%81%A7wordpress%E3%81%AB%E8%87%AA%E5%8B%95%E3%81%A7%E6%8A%95%E7%A8%BF%E3%81%99%E3%82%8B%EF%BC%88python-wordpress-xmlrpc%EF%BC%89/)

- [pythonからWordPressに投稿＆画像のアップロード](https://devlog.hatenablog.jp/entry/20180508/1525791153)

- [PythonでWordPressに投稿、一覧取得](https://qiita.com/wktq/items/65c00d93c3e08100abc9)

- [[python] ワードプレスへの自動投稿](https://ja.wayama.io/article/library/python/006/)