ブログをやっていると、同じようなことを繰り返したりすることがある。
そして、画像付きで投稿したい。
最近Pythonを勉強し始めたので
ブログと連携できないかと調べたら、同じことを考える人はいるもので。
これはチャンスと自分もやってみることに。
【環境】
Conoha Wingのレンタルサーバーを使ってます。
当ブログはwordpressを使っています。
pythonはgoogle colaboratoryで実行しています。
- レンタルサーバーはConoha Wing。
- WordPressでブログ作成。
- PythonのコードはGoogleColaboratoryで逐次実行。
途中からubuntu環境に切り替えてコーディング
python 3.8.10です。
試したこと
これは「Python WordPress 自動投稿」で検索
REST APIだと、どうもプラグインが必要らしい。
wordpress側での操作を出来るだけ少なくしたかったので
REST APIを使う方法ではなく
wordpress xmlrpcの方で挑戦した。
トラブルの連続
何をしても、つまづき連続でした。
つまづき1 記事が投稿されない。
ずっと 403 forbiddenが表示されるので
色々調べていたところ。
原因はwordpress側のセキュリティの問題
海外アクセス制限の中にある
XML-RPC APIのチェックを外す事。

つまづき2 本文の出力がうまく出来ない。
pythonコードはネットのよさそうなのをコピーしたので
投稿記事の本文は
post.content=”ここに本文を書く”
となっていることが多い。
このダブルコーテーションの中に
list形式を記述したところで
list変数を文字で表示するだけなんですよね。
当然っちゃ当然だけど、何故か引っかかる。
それが駆け出しプログラマー。
つまづき3 長い本文が書けない。
post.contentに投稿記事の本文を記入するが
pythonコードを1行で書かないとエラーが出る。
こんなときはかぎ括弧{}で、やるのかなとやってもうまくいかない。
調べてみると、括弧にも種類・役割があって
()
[]
{}
へえ~。
それぞれ違うんだ。
全然意識してなかったなぁ。
参考はこちら
投稿時間がずれる
夜11時に投稿したのに、翌朝8時の予約投稿と表示されることに気づく。
よくよく考えると9時間ズレってロンドンを基準にするあれじゃね?
ってことで調べたら、やはりタイムゾーンでした。
datetimeライブラリの宣言とかがよくわからないままコーディングしているので
何度もattribute errorを食らう。(属性エラー)
これを機にちゃんとimport周りを調べることにした。
タイムゾーンに関しても、ネットから取ってきた。
原因はimport部分
時間差を計算するために
①from datetime import datetime
②datetime – datetime.timedelta(hours=9)
としていたので、datetimeと書くと
①が採用されて
datetime.datetimeと書いたことになる。
(抜粋の3個目)
timedeltaはdatetimeの中の事であるので
import datetime
datetime.datetime.now() – datetime.timedelta(hours=9)
とした。
同じ型で演算しないといけないので
型の意識は大変重要。
本件で本当に痛感した。
下記は公式の抜粋

『オブジェクト指向』と呼ぶそうで。
体験して、言われて、ようやく
これがオブジェクト指向か
と気付かされました。
画像の投稿が出来ない(解決!!)
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!!’)
よく見かけるこんな感じの関数。
要は、
- 画像データがあったら(exist)
- バイナリで読んで(rb)
- データを指定して(date=)
- 画像をアップロードして、IDを取得
そんな感じ。
これ実行すると、uploadのところで「fault 500」のエラーが出るんです。
Fault: <Fault 500: ‘ファイル ******* に書き込めませんでした (このファイルタイプをアップロードする権限がありません。)。’>
fault 500はサーバー側の問題ってことまで突き止めたのですが
レンタルサーバーの権限だとかはちょっと一筋縄ではいかなそう。。。
もう少し調査しつつも、見切りをつけて
REST APIを使う方法に切り替える予定。
はたしてどうなることやら。
無事解決
ubuntuというLinux系のOSを使っているが
画像ファイルに拡張子がないのが問題だった。
windowsだと、当たり前に付いているが
Linuxではないようで。
ダウンロードした画像のファイル名に
+”.png”
としてあげたら、ちゃんとアップロードしました。
\(^o^)/
コメント