pythonを使って、投稿用の画像をアップロードをサボろうと、いや、自動化しようとしてみましたところ、定番のエラーが発生しましたので解決方法をここに記します。ぽちぽち作業って案外めんどくさいから自動化って大事ですよねー。
pythonで画像をアップロード:XML-RPC
pythonで画像をアップロードするにはXML-RPCを使います。
コードを載せるのはなんか気恥ずかしいですが、以下の感じ。
import xmlrpc.client#画像データを作成
img_data = {
‘name’:’filename.jpg’, #ファイル名
‘type’:’image/jpeg’, #画像種類
‘bits’: imgfile #アップロードする画像ファイルの実体
}
#アップロードするサーバー情報
DOMAIN = “input domain url”
BLOG_ID = “input blog ID”
USERNAME = “input user name”
PASSWORD = “input password”
#いざアップロード
proxy = xmlrpc.client.ServerProxy(DOMAIN)
proxy.metaWeblog.newMediaObject(BLOG_ID, USERNAME, PASSWORD, img_data)
だがエラー!Fault 220
こんなエラーが出力されました。何でしょう…ネットで調べてもこのエラーは載ってないし…
読んでみるとファイルタイプ「.」に「’’」は許されてません的な?でもファイル名にそんな文字使ってないし、ファイルの中身の話かしらん…
原因は画像ファイルがBase64でエンコードされてなかったから
空ファイルをアップロードしてみたら、空ファイルがアップロードできてたので、どうやらファイルの中身が悪いみたい。んで調査を進めていくと…どうやらアップロードしているファイルの送信に問題があるみたいで、アップロードできる形式にエンコードする必要がありました。その名もBase64。
Base64とはバイナリデータをテキストに変換してくれるやつで、生データでなくASCII文字列になるみたい。つまりはバイナリをアップロードしようとした時、中に「’」的な物が入っていて怒られていたのかしら。
修正コード
import xmlrpc.client
import base64#画像データを作成
img_data = {
‘name’:’filename.jpg’, #ファイル名
‘type’:’image/jpeg’, #画像種類
‘bits’: base64.b64encode(imgfile) #アップロードする画像ファイルをBase64でエンコード
}
#アップロードするサーバー情報
DOMAIN = “input domain url”
BLOG_ID = “input blog ID”
USERNAME = “input user name”
PASSWORD = “input password”
#いざアップロード
proxy = xmlrpc.client.ServerProxy(DOMAIN)
proxy.metaWeblog.newMediaObject(BLOG_ID, USERNAME, PASSWORD, img_data)
まとめ
色々と組んでみると、いちいち新しいエラーが発生してくれます。それをクリアしていくことでやれることが増えていくので、プログラミングって楽しいですね!
コメント