フォト蔵のRSSからclippへAtomPub経由でインポートしてみる

clippがこっそりアンドキュメントなAPI公開してて、マニュアル書いたら正式にリリースしたいとか言ってるので、その前に同じ会社特権でいじってみました。(一応、日記にかいていい?って聞いたらOKもらいました。)


今回、Feedの読み込みに何つかおうかなーと悩んでたのですが、ZendFrameworkをいじってみたかったのでZend_Feed周りを使ってみました。

clipp api自体は、AtomPub+clippのネームスペースな実装になってるみたいです。

眠たいのでとりあえずソース全文です。

<?php
require_once 'Zend/Feed.php';
require_once 'Zend/Feed/Entry/Atom.php';
require_once 'Zend/Http/Client.php';

try {
$feed = Zend_Feed::import("http://photozou.jp/feed/photo_list/44520/all.xml");
}  catch (Zend_Feed_Exception $e) {
    echo $e->getMessage();
}

$client = new Zend_Http_Client();
$client->setAuth('account@example.com', 'password', Zend_Http_Client::AUTH_BASIC);

// Zend_Feed_Entry_Atom bug http://framework.zend.com/issues/browse/ZF-3418
$client->setHeaders('Content-Type', 'application/atom+xml');

Zend_Feed::setHttpClient($client);

foreach ($feed as $item) {
    $entry = new Zend_Feed_Entry_Atom();
    $entry->{'title'} = $item->title();
    $entry->{'link'}  = $item->link();
    $entry->{'link'}['rel'] = 'related';
    $entry->{'description'} = $item->description();
    $entry->{'description'}['type'] = 'html';
    Zend_Feed::registerNamespace('clipp', 'http://clipp.in/service/ns');
    $entry->{'clipp:imageAddress'} = '';
    $entry->{'clipp:imageAddress'}['href'] = $item->{'media:group'}->{'media:content'}['url'];
    $entry->{'clipp:quote'} = $item->description();
    $entry->{'clipp:quote'}['type'] = 'html';
    $entry->{'clipp:publicity'} = '';
    $entry->{'clipp:publicity'}['value'] = '2'; //プライベート

    try {
      $entry->save('http://clipp.in/service/add');
    } catch(Exception $e) {
      print $e->getMessage();
    }
    break; //自重
}

Feedの読み込みは、

$feed = Zend_Feed::import("http://photozou.jp/feed/photo_list/44520/all.xml");

ここ一行だけですおもったより楽チンでした。

あとは、HTTPClientに認証するためのユーザ名パスワードを入れて(clippのAPIの認証は、Basic認証です。)Zend_Feed_Entry_Atomに値を配置してsaveメソッドを実行するだけです。

わかってみるとえれー簡単でした。(細かくはまりどころはあったのですが・・。)

環境

  • PHP 5.2.5
  • ZendFramework 1.5.2

ちなみに

clipp.in完全招待制ではなくて、申し込むとしばらくするとメールが届くようになっているのでぜひ、お申し込みください。という宣伝エントリ。