XML-RPC経由でブログに画像を含んだエントリを投稿する方法
MovableType、Blogger、ココログとかのメジャーなブログは、XML-RPC APIを使うことによってプログラム的にエントリを投稿したりできます。
画像を投稿する関数も用意されているのですが、この二つを組み合わせて使うことによって画像を含んだエントリをプログラム的に投稿することができます。
結構シンプルな感じではありますが、何カ所か躓いた箇所があるので記録のために残しておきます。
プログラムの流れ
- ブログのページ(大抵はトップページ?)からRSDのあるURLを取得する。
- RSDを読み込み、対象のブログがどのAPIに対応しているのか、Blog IDは何か、APIエントリポイントとなるURLはどこなのかをRSDから抜き出す
- 上で得られた情報を基に、そのブログが対応するAPIに沿った形でXML-RPCリクエストを送出する。
- 返事もXMLで帰ってくるので、それを解釈し適切に処理する。
躓いた箇所
blog IDって?
MovableTypeのようなブログスクリプトはスクリプト1つのインストレーションを使って、複数のブログを作成、管理することができますが、こういったブログはXML-RPCのAPIエントリポイントが共通になります。その場合、どのブログに対して処理を行いたいのかという区別をするために各ブログに対して一意に決まるIDが必要になりますが、それがblog IDです。
このblog IDは基本的にはRSDの中に記述があります。ブログの管理画面から参照できるかはブログスクリプト次第だと思うので不明です。
Can't use an undefined value as an ARRAY reference at ...てなエラーメッセージがサーバから帰ってきてしまいます。
送出しているXML-RPCのXML文が、well-formedでないと思います。以下の点を確認してみてください。
- params以下の子要素は全てparamになっていますか?structや他のスカラ要素は、paramsの子要素ではなくてparamの子要素でなくてはいけません。
- struct要素はwell-formedですか?struct要素の持ちうる子要素は複数のmemberだけで、member要素はそれぞれname要素とvalue要素を持っていなければなりません。
- エスケープしなければいけない文字はきちんとエスケープしましたか?送出メッセージはXMLなので、<などの文字はエスケープされていないとXMLの誤解釈の原因になります。
正しいパスワードを入れているはずなのにユーザ認証が通りません。
ブログスクリプトにもよりますが、ブログの管理画面に入るためのパスワードとXML-RPC APIの認証時に使うパスワードが別に用意されている場合があります。これは恐らく、XML-RPCで認証情報を送出する際に平文になっているため危ない、という判断なのだろうとは思いますが…。
画像はどうやって投稿するんですか?
metaWeblog.newMediaObjectメソッドを使って、画像ファイルをまずサーバに送ります。正常に完了すると画像ファイルのアドレスが返ってきますので、そのパスをエントリ内のimgタグで参照してあげます。
参考にしたページ
- XML-RPC 仕様書
- XML-RPC Specificationの日本語訳です。このページを読めば、XML-RPCメッセージがどのような構造になっているべきかが分かります。
- Movable Type で使える XML-RPC API
- MovableTypeマニュアル日本語訳から、XML-RPC API絡みの内容のみを抜粋したもの。各メソッドのシグネチャが分かります。
- RSD(Really Simple Discovery)
- RSDの簡単な説明があります。
- XML Tutorial(英語)
- その名の通り、XMLの解説があります。
- ISO 8601 - Wikipedia
- XML-RPC内での日時表記フォーマットであるISO8601の説明があります。
- XML-RPC: getchallenge: Can't use an undefined value as an ARRAY reference(英語、掲示板)
- 上でも紹介した、ハマってしまうエラーメッセージについてのディスカッションがありました。
TrackBack
TrackBack URL for this entry:
http://www.ppmz.com/cgi-bin/mt/mt-tb.cgi/87