Livedoor BlogにAtompub APIで記事を投稿する

XMLRPCを使用しているブログには以前書いた「XMLRPCでWordpressに投稿する」を応用すると投稿できる。
LivedoorのAtompubはちょっと面倒。

参考:http://d.hatena.ne.jp/soramugi/20111109/1320853307

記事の投稿は参考サイトとほぼ同じで、以下、抜粋(CakePHP使ってます)

App::import('Vendor', 'request2', array('file'=>'HTTP/Request2.php'));

$id = LIVEDOOR_BLOG_ID; /* livedoorID */
$key = LIVEDOOR_BLOG_APIKEY;        /* API Key */
$url = "http://livedoor.blogcms.jp/atom/blog/".$id.'/article';

$title = 'ここにタイトル';
$description = 'ここに本文';
$description2 = 'ここに追記';
$category = 'ここにカテゴリー';
$created = date('Y-m-d\TH:i:s\Z');
$nonce = pack('H*', sha1(md5(time())));
$pass_digest = base64_encode(pack('H*', sha1($nonce.$created.$key)));
$wsse =
            'UsernameToken Username="'.$id.'", '.
            'PasswordDigest="'.$pass_digest.'", '.
            'Nonce="'.base64_encode($nonce).'", '.
            'Created="'.$created.'"';
$rawdata =
            '<?xml version="1.0" encoding="utf-8"?>'.
            '<entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns:blogcms="http://blogcms.jp/-/spec/atompub/1.0/">'.
            '<title>'.$title.'</title>'.
            '<category term="'.$category.'" />'.
            '<blogcms:source>'.
            '<blogcms:body><![CDATA['.$description.']]></blogcms:body>'.
            '<blogcms:more><![CDATA['.$description2.']]></blogcms:more>'.
            '</blogcms:source>'.
            //'<app:control>'.
            //'<app:draft>yes</app:draft>'.
            //'</app:control>'.
            '</entry>';
$headers = array(
                    'X-WSSE: ' . $wsse,
                    'Expect:'
);

try{
    $req = new HTTP_Request2();
    $req->setUrl($url);
    $req->setMethod(HTTP_Request2::METHOD_POST);
    $req->setHeader($headers);
    $req->setBody($rawdata);
    $response = $req->send();
} catch (HTTP_Request2_Exception $e) {
    die($e->getMessage());
} catch (Exception $e) {
    die($e->getMessage());
}

これで、本文、追記、カテゴリーがPHPから投稿できる。
カテゴリーは無ければ作ってくれるみたい。

で、問題は画像。
画像を先にアップしてから、投稿本文にHTMLタグを入れるんだけど、アップが上手く出来なくて四苦八苦。

App::import('Vendor', 'request2', array('file'=>'HTTP/Request2.php'));

$id = LIVEDOOR_BLOG_ID; /* livedoorID */
$key = LIVEDOOR_BLOG_APIKEY;        /* API Key */
$url = "http://livedoor.blogcms.jp/atom/blog/".$id.'/image';

$img_dir = dirname(dirname(dirname(dirname(__FILE__)))).DS.'files'.DS;
$imgfile  = $img_dir.'test001.jpg';
$created = date('Y-m-d\TH:i:s\Z');
$nonce = pack('H*', sha1(md5(time())));
$pass_digest = base64_encode(pack('H*', sha1($nonce.$created.$key)));
$wsse =
            'UsernameToken Username="'.$id.'", '.
            'PasswordDigest="'.$pass_digest.'", '.
            'Nonce="'.base64_encode($nonce).'", '.
            'Created="'.$created.'"';
$imgdata = file_get_contents($imgfile);
$content_type = image_type_to_mime_type(exif_imagetype($imgfile));
$headers = array(
                        'X-WSSE: ' . $wsse,
                        'Content-Type: ' . $content_type,
                        'Expect:'
);

try{
    $req = new HTTP_Request2();
    $req->setUrl($url);
    $req->setMethod(HTTP_Request2::METHOD_POST);
    $req->setHeader($headers);
    $req->setBody($imgdata);
    $response = $req->send();
    $xml = simplexml_load_string($response->getBody());
    $src = $xml->content['src'];
    $thumbnail = $xml->content['thumbnail'];
} catch (HTTP_Request2_Exception $e) {
    die($e->getMessage());
} catch (Exception $e) {
    die($e->getMessage());
}

画像はそのまま送るらしい。投稿で設定した「xml〜」はいらない。
ヘッダーにcontent-typeを指定して、画像ファイルを読み込みバイナリーのまま送る。
戻り値で画像のURLとサムネイルのURLがXMLで返ってくるので、パースして、srcとthumbnailを取得して、記事本文にHTMLで書いて、今度は記事として再投稿するとブログに掲載される。

ちなみに、画像のタイトルは入らないらしい。
ヘッダーに「Slug: ここにタイトル」を付けるのが一般的らしいけど、Livedoorでは受け付けない。

参考:http://www.ibm.com/developerworks/jp/xml/library/x-atompp1/index.html#code13
参考:http://wiki.livedoor.jp/staff/d/API/AtomPub

「Livedoor BlogにAtompub APIで記事を投稿する」への3件のフィードバック

  1. 色々と調べてわからなかったのですがライブドアとかであればタグ機能があるのですがそれの挿入方法わかる方教えて頂けませんでしょうか。

    1. ライブドアのサポートページではタグ付けが出来そうな事が書いてありますが、やり方が分からないというのが現状です。
      タグはカテゴリーの一種になるはずなので、categoryに何かを追加すればタグになると思うのですが、以前試した感じでは上手くできなかったと思います。

      category scheme="urn:tag" term="foo"

      と言うような指定もありますが、出来なかったと思います。

      1. お答え有難う御座います。
        やはり現状使えない感じなんですね。
        有難う御座います。
        なんのタグが使えるかとかなんのタグが使えないかとかって理由はわかりませんが公式には載せないんですね。(^_^;)

API へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)