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()
その結果がこんな感じである。
何故か画像がうまくアップロード出来ずに一時間程悩む。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()
結果がこちら
と言う事で、無事に画像を投稿する事が出来た。
めでたしめでたし。