livedoor PICS WebService Interface を使ってみた

現在書いているプログラム(データベースでごにょごにょ)が、大変単調だけどたまに複雑に絡み合った問題が発生したりする、大変やる気が萎える部分なので、ちょっと気分転換に別のことをしてみた。

livedoorFlickrみたいなの作りたくて作っちゃいました、みたいなlivedoor PICSに、最近流行のAPIが公開された。それがコレPerlだと、CPANからモジュール引っ張ってきてサンプルコードのとおりに書いてやればOKっぽい。

さて、livedoor PICSとマッシュアップさせたら面白げなプログラムがPHPで書かれているので、PHPでアップロードできるようにしたいです。

まずは、livedoor PICS APIAtom API(Atom PP)を使っているので、Atom APIPHPのライブラリを探してみたら、PHP Atom APIというまんまのライブラリを発見。

このライブラリはまだできたばかりなので、ドキュメントが超適当。ひとまず、ライブラリをざっと見た感じをまとめておこう。

このライブラリは、4つの基本的なクラスと、2つの認証用クラスから成っているらしい。クラスが何に対応しているのかのイメージ図を付けてみた。上の方にあるから見て。

  • 基本クラス
    • AtomAPI・・・FeedをGETで読みにいったりするときに使う(っぽい
    • AtomFeed・・・1つのFeed(xmlファイルとか)に対応。内部に複数のAtomEntryを持つ。
    • AtomEntry・・・1つの記事とか、投稿に対応。
    • AtomRequest・・・記事とか、投稿するときに使うっぽい。POST、PUT、DELETEのリクエストを送るのはおそらくこれだろう。POSTは確認済み。
  • 認証用クラス
    • BasicAuth・・・Basic認証
    • WSSE・・・WSSE認証

WSSE認証は、ちょっと癖があるようなので、観測気球さんあたりを参照すべし。livedoor PICSについては、PHP Atom APIの機能を何も考えずに使ったらOKだった。

とりあえず写真をアップロードするスクリプト

set_author('haya');
$entry->set_title(array (
			'title' => 'test pics',
			'xmlns' => 'http://purl.org/atom/ns#',
			));
$entry->set_content(array('type' => 'image/jpg',
			'content' => base64_encode(file_get_contents('ore.jpg')),
			'mode' => "base64" 
			)
			);
// 認証用のオブジェクトを作成
$auth = new WSSE('harg', '*****');

$post = new AtomRequest('POST',
			'http://ws.pics.livedoor.com/atom/harg',
			$auth,
			$entry->to_xml());
// リクエスト実行
$post->exec();
?>

画像とかバイナリをPOSTするときも、XML形式でPOSTするんですね。Atom APIをろくに知らないままやろうとしていたので、まずはそこでつまづいた。
そしてその後、バイナリをXMLにしてPOSTしてもなぜか投稿できない。とりあえず知識が無いのに悩んでもしょうがないので、PHPAtom APIしている何かがないかと探してみると、はてなフォトライフAtom APIだった。そしてはてなフォトライフで探してみたら、ありましたよ、Services_Hatena。どうやら、はてなAPIを使うライブラリをPHPで実装しているらしい。その中のフォトライフの部分を参考にしてみると、バイナリデータをbase64エンコードしていることが判明。早速base64エンコードしてlivedoor PICSにPOSTしてみたら、見事に投稿成功!おつかれさまでした。

で、base64エンコードってなんだっけ、と思って調べてみたら、バイナリデータを送るときに、生バイナリではXMLのようなテキストには載せられないので、そういうときにテキストデータに変換するのがbase64エンコードだそうですよ。また一つ勉強になりますた。

今回アップロードした写真。