はてなダイアリーAtomPubをPHPで使う

はてなダイアリーAtomPubを使ってみた。PEARの中にもServices_Hatenaや、Do You PHP はてなの"mixiのあしあとAPI"の使い方を参照にしつつ。
Service_Hatenaはダイアリーの対応はまだの様だったので勉強がてら、PHP5専用で一から書いてみた。

<?php
require_once('HTTP/Request.php');
class HatenaDiaryStore{
  private $hatenaid;
  private $hatenapw;

  public function __construct(){
  }

  public function __set($name, $value){
    switch($name){
      case "hatenaid": $this->hatenaid = $value; break;
      case "hatenapw": $this->hatenapw = $value; break;
     }
  }

  public function postNewEntry($title, $body){
    $reqxml = sprintf('<?xml version="1.0" encoding="utf-8"?><entry xmlns="http://purl.org/atom/ns#"><title>%s</title><content type="text/plain">%s</content></entry>',
      $title,
      $body
    );

    $this->postNewEntryWithXml($reqxml);
  }

  public function postNewEntryWithXml($xml){
    $url = sprintf("http://d.hatena.ne.jp/%s/atom/blog", $this->hatenaid);	// Hatena diary collection URL
    $wsseval = $this->getWsseHeaderValue();

    // HTTP Request start.
    $httpreq = new HTTP_Request($url);
    $httpreq->setMethod(HTTP_REQUEST_METHOD_POST); 
    $httpreq->addHeader('X-WSSE', $wsseval); 
    $httpreq->addRawPostData($xml);

    if (PEAR::isError($httpreq->sendRequest())) {
      throw new Exception("http request error");
    }

    if($httpreq->getResponseCode() != 201){
      throw new Exception("bad request published");
    }
  }

  private function getWsseHeaderValue(){
    $created = gmdate('Y-m-d\TH:i:s\Z');
    $nonce   = base64_encode(sha1(mt_rand()));
    $pwdigest  = base64_encode(pack('H*', sha1($nonce.$created.$this->hatenapw)));

    $xwsseval = sprintf(
      'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"',
      $this->hatenaid,
      $pwdigest,
      $nonce,
      $created
    );

    return $xwsseval;
  }
}

$title = "てすと";
$body  = <<<EOF
気分転換でごにょごにょ中。あは。
-テスト...テスト...ただいまテスト...
-RSSリーダ購読されている方、ご了承ください。
EOF;

$hatena = new HatenaDiaryStore();
$hatena->hatenaid = "hideack";
$hatena->hatenapw = "*******";
$hatena->postNewEntry($title, $body);
?>

意外とあっさり書けてびっくり。
先日から投稿してる「今日のひとことたち」は、はてなハイクのフィードを一日の終わり近くに読み取って、
このスクリプトで自動的に投稿させていたり...。ま、他の方法でごにょごにょしてもできそうですが。