エンジニアリングとお金の話

都内で働くエンジニアの日記です。

【技術】wordpressにxmlrpcで画像を投稿する際の注意点

【SPONSORED LINK】

wordpressのxmlrpcを使って画像を投稿しようとしたら、ハマッてしまったのでメモ。

wordpressのxmlrpcで画像を投稿する際は、wp.uploadFileメソッドを使用すれば可能である。なお、wp.uploadFileメソッドの引数は以下の通りとなっている。

Parameters

  • int blog_id
  • string username
  • string password
  • struct data
    • string name
    • string type
    • base64 bits
    • bool overwrite

ここで注目したいのがbits項目である。型がbase64と書かれていたので、以下のプログラムにて投稿を行った。

import xmlrpclib
import base64

def main():
    #事前設定
    server_url="http://127.0.0.1/wp/xmlrpc.php"
    blog_id="myblog"
    username="userid"
    password="passwd"

  #投稿ファイルをバイナリで読み込み、base64エンコード
    file=open("d:\\work\\cat.jpg","rb")
    file_enc=base64.b64encode(file.read())
    file.close()

  #エントリポイントを作成
    server=xmlrpclib.ServerProxy(server_url)
  #データを投稿
    entry_id=server.wp.uploadFile(
        blog_id,
        username,
        password,
        {
            'name':"test.jpg",
            'type':"image/jpeg",
            'bits':file_enc,
            'overwrite':True
        }

    )

if __name__ == '__main__':
    main()

その結果がこんな感じである。
f:id:hatakazu93:20120717211114j:plain
何故か画像がうまくアップロード出来ずに一時間程悩む。google先生で調べてみると、海外のサイトで同様の事象について質問が挙がっていた。pythonは海外のサイトの方が情報量が豊富である。

wordpress - wp.uploadFile xmlrpc from python encode base64 - Stack Overflow

つたない英語力で読んでいくと、どうもbase64モジュールのb64encodeメソッドでエンコードしているのがいけないらしく、xmlrpclibモジュールのBinalyメソッドでエンコードするのが正解みたい。
と言う事で早速プログラムを修正してみた。

import xmlrpclib

def main():
    #事前設定
    server_url="http://127.0.0.1/wp/xmlrpc.php"
    blog_id="myblog"
    username="userid"
    password="passwd"

  #投稿ファイルをバイナリで読み込み、xmlrpclib.Binaryでエンコード
    file=open("d:\\work\\cat.jpg","rb")
    file_enc=xmlrpclib.Binary(file.read())
    file.close()

  #エントリポイントを作成
    server=xmlrpclib.ServerProxy(server_url)
  #データを投稿
    entry_id=server.wp.uploadFile(
        blog_id,
        username,
        password,
        {
            'name':"test.jpg",
            'type':"image/jpeg",
            'bits':file_enc,
            'overwrite':True
        }

    )

if __name__ == '__main__':
    main()

結果がこちら
f:id:hatakazu93:20120717213204j:plain
と言う事で、無事に画像を投稿する事が出来た。
めでたしめでたし。