プラスター業務日記 - プログラム(php,VC++などなど)やサーバ設定(Ubuntu Linux)などをメモがわりに書き残します。

AtomPub で Livedoor ブロブに投稿

by なお (読完時間:推定 7分2秒|画像は1枚)

LivedoorAtomPub(Atom Publishing Protocol 以下 AtomPub) の実装の勉強がてら WordPress の記事のサマリ部分だけを Livedoor ブログに投稿したいなぁ~と思いプラスター業務日記分室ってのに自動でPOSTしてます。

一番の鬼門は WSSE認証部分でこれさえ突破し認証が通れば後は規定の XML フォーマット形式でPOSTするだけです。

Atom Publishing Protocol とは

Publishing = 出版 ですから AtomPub を使用するとウェブ上のコンテンツを編集、追加、参照、削除などをアプリケーションレベルの通信プロトコルで実現できます。AtomPub プロトコルは HTTP ベースの通信プロトコルで、RESTのアーキテクチャスタイルに準拠している。また、通信でやり取りされるフォーマットは「Atom配信フォーマット」ベースのXML文書となっています。
以下 Livedooor の XML です。

<?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>
<category term="プラスター業務日記" />
<blogcms:source>
<blogcms:body><![CDATA[本文]]></blogcms:body>
<blogcms:more><![CDATA[続きを読む…]]></blogcms:more>
</blogcms:source>
</entry>

AtomPub で Livedoor ブロブに投稿を行うプログラム

今回は cURL を使って POST を行います。
ブログの記事投稿用のエンドポイントの URL は

http://livedoor.blogcms.jp/atom/blog/Livedoor id/article

となります。

  $livedoor_id = "plustarblog";  /* livedoorID */
  $api_key     = "********";   /* API Key */

  $atomapi_url =
    'http://livedoor.blogcms.jp/atom/blog/'.
    $livedoor_id.
    '/article';

  $created = date('Y-m-d\TH:i:s\Z');
  $nonce = pack('H*', sha1(md5(time())));
  $pass_digest = base64_encode(pack('H*', sha1($nonce.$created.$api_key)));
  $wsse =
    'UsernameToken Username="'.$livedoor_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['.$text.']]></blogcms:body>'. // ← 本文
    '<blogcms:more><![CDATA['.$text_more.']]></blogcms:more>'. // ← 続きセパレータ以降の文章
    '</blogcms:source>'.
    '</entry>';

  $headers =array(
    'X-WSSE: ' . $wsse,
    'Expect:'
  );

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $atomapi_url);
  curl_setopt($ch, CURLOPT_HEADER, false);
  curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS,$rawdata);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $res = curl_exec($ch);
  curl_close($ch);

WSSE認証

WSSE認証は単に投稿者を確認して安全に通信を行うための約束事です。
仮にパスワードを平文で通信を行なって第三者に漏れた場合大変なことになります。

  $created = date('Y-m-d\TH:i:s\Z');
  $nonce = pack('H*', sha1(md5(time())));
  $pass_digest = base64_encode(pack('H*', sha1($nonce.$created.$api_key)));
  $wsse =
    'UsernameToken Username="'.$livedoor_id.'", '.
    'PasswordDigest="'.$pass_digest.'", '.
    'Nonce="'.base64_encode($nonce).'", '.
    'Created="'.$created.'"';

ここで生成した WSSE認証文字列をヘッダに積んで通信を行います。

  $headers =array(
    'X-WSSE: ' . $wsse,
    'Expect:'
  );
  curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);

参考

Atom
API/AtomPub

RESTful Webサービス

RESTful Webサービス

著者/訳者:Leonard Richardson Sam Ruby

出版社:オライリー・ジャパン( 2007-12-21 )

定価:¥ 4,104

単行本 ( 480 ページ )

ISBN-10 : 4873113539

ISBN-13 : 9784873113531


2 Responses to AtomPub で Livedoor ブロブに投稿