pythonでWordPressに投稿する時に躓いた所

ブログをやっていると、同じようなことを繰り返したりすることがある。
そして、画像付きで投稿したい。

最近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行で書かないとエラーが出る。

こんなときはかぎ括弧{}で、やるのかなとやってもうまくいかない。

調べてみると、括弧にも種類・役割があって

()

[]

{}

へえ~。

それぞれ違うんだ。
全然意識してなかったなぁ。

参考はこちら

Pythonで長い文字列を複数行に分けて書く

投稿時間がずれる

夜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)

とした。

同じ型で演算しないといけないので
型の意識は大変重要。

本件で本当に痛感した。

下記は公式の抜粋

datetime 基本的な日付型および時間型

『オブジェクト指向』と呼ぶそうで。

体験して、言われて、ようやく
これがオブジェクト指向か

と気付かされました。

画像の投稿が出来ない(解決!!)

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!!’)

よく見かけるこんな感じの関数。

要は、

  1. 画像データがあったら(exist)
  2. バイナリで読んで(rb)
  3. データを指定して(date=)
  4. 画像をアップロードして、IDを取得

そんな感じ。

これ実行すると、uploadのところで「fault 500」のエラーが出るんです。

Fault: <Fault 500: ‘ファイル ******* に書き込めませんでした (このファイルタイプをアップロードする権限がありません。)。’>

fault 500はサーバー側の問題ってことまで突き止めたのですが
レンタルサーバーの権限だとかはちょっと一筋縄ではいかなそう。。。

もう少し調査しつつも、見切りをつけて
REST APIを使う方法に切り替える予定。

はたしてどうなることやら。

無事解決

ubuntuというLinux系のOSを使っているが
画像ファイルに拡張子がないのが問題だった。

windowsだと、当たり前に付いているが
Linuxではないようで。

ダウンロードした画像のファイル名に
+”.png”
としてあげたら、ちゃんとアップロードしました。

\(^o^)/

コメント

タイトルとURLをコピーしました