404 motivation not found | t_ishidaのブログ

12月/08

13

Atompubクライアント

まだ作りかけだけど、多分使える。
使って何が有っても知らん

この上にブログ毎のURLを生成ロジックを被せて継承させて使うイメージ。

ブログは、こいつをエンジンとして使う。
エンジンはXML-RPCを使うブログもあるけど、ブログレベルでインターフェースを統一しておき、
ポリモーフィックに使えるようにする。
URL渡したら、ブログインスタンスを返す、ファクトリメソッドを作っておく。

<?php
/************************************
 * Atompubサーバーを使用する為の
 * クライアント
 ***********************************/
require_once 'HTTP/Request.php';
class AtomPubClient {
  private $values = array();
  /************************************
   * セッターを書きたくないらしい
   ***********************************/
  public function __set( $name, $value ){
    $this->values[strtolower( $name )] = $value;
  }

  /************************************
   * ゲッターを書きたくないらしい
   ***********************************/
  public function __get( $name ){
    return $this->vlaues[strtolower($name)];
  }

  /************************************
   * コンストラクタ
   * @param ユーザー名
   * @param パスワード
   ***********************************/
  public function __construct( $user, $passwd ){
    $this->values['user']     = $user;
    $this->values['passwd'] = $passwd;
  }

  /************************************
   * 取得
   ***********************************/
  public function get( $url ){
    return $this->doMethod( $url, null ,HTTP_REQUEST_METHOD_GET );
  }

  /************************************
   * 追加
   ***********************************/
  public function post( $url, $entry ){
    return $this->doMethod( $url,  $entry ,HTTP_REQUEST_METHOD_POST );
  }

  /************************************
   * 更新
   ***********************************/
  public function put( $url, $entry ){
    return $this->doMethod( $url , $entry, HTTP_REQUEST_METHOD_PUT );
  }

  /************************************
   * 削除
   ***********************************/
  public function delete( $url ){
    return $this->doMethod( $url, null, HTTP_REQUEST_METHOD_DELETE );
  }

  /************************************
   * 送信する
   ***********************************/
  public function doMethod( $url, $post = null, $method ){
    $user = $this->values['user'];
    $pass = $this->values['passwd'];
    $created = date("Y-m-d\TH:i:s\Z");   

    //WSSE認証用データの作成
    $nonce = pack('H*', sha1(md5(time())));
    $pass_digest = base64_encode(pack('H*', sha1($nonce.$created.$pass)));
    $wsse = 'UsernameToken Username="'.$user.'", PasswordDigest="'.$pass_digest.'", Created="'.$created.'", Nonce="'.base64_encode($nonce).'"';

    $req = new HTTP_Request();
    $req->addHeader('Accept','application/x.atom+xml, application/xml, text/xml, */*');
    $req->addHeader('Authorization', 'WSSE profile="UsernameToken"');
    $req->addHeader('X-WSSE',$wsse );
    $req->addHeader('Content-Type', 'application/x.atom+xml');
    $req->setMethod( $method );
    $req->setURL($url);
    if( $post ){
      $req->addRawPostData( $post->toXML() );
    }
    $req->sendRequest();
    return $req->getResponseBody();
  }
}

/************************************
 * Atompubサーバーを使用する為の
 ***********************************/
class AtomPubEntry {
  private $values = array();

  /************************************
   * セッターを書きたくないらしい
   ***********************************/
  public function __set( $name, $value ){
    $this->values[strtolower( $name )] = $value;
  }

  /************************************
   * ゲッターを書きたくないらしい
   ***********************************/
  public function __get( $name ){
    return $this->vlaues[strtolower($name)];
  }
  /***********************************
   * コンストラクタ
   * @param title
   * @param content
   ***********************************/
  public function __construct( $title = null, $content = null, $content_type = null, $src_encoding = null ){
    $this->values['title']   = $title;
    $this->values['content'] = $content;
    $this->values['content_type'] = $content_type;
    $this->values['src_encoding'] = $src_encoding;
  }

  /***********************************
   * コンストラクタ
   * @return 出来あがったXML
   ***********************************/
  public function toXML(){
    //XMLデータの作成
    $title      = $this->values['title'];
    $content    = $this->values['content'];
    $created_at = null;
    if( !$this->values['created_at'] ){
      $created_at = date( "Y-m-d\TH:i:s\Z" );
    } else {
      $created_at = $this->values['created_at'];
    }
    $content_type = $this->values['content_type'];

    if( $src_encoding &amp;&amp; !preg_match( '#utf-?8#i', $src_encoding ) ){
      $title  = mb_convert_encoding( $title  , 'utf8', $src_encoding );
      $content= mb_convert_encoding( $content, 'utf8', $src_encoding );
    }

    if( !$content_type &amp;&amp; preg_match( '#<.+?>#', $content ) ){
      $content_type = 'text/html';
      $title   = htmlspecialchars( $title );
      $content = htmlspecialchars( $content );
    }
    return  '<?xml version="1.0" encoding="utf-8"?>'.
                '<entry xmlns="http://purl.org/atom/ns#">'.
                '<title>'.$title.'</title>'.
                '<content type="text/plain">'.$content.'</content>'.
                '<updated>'.$created_at.'</updated></entry>';
  }
}

$ac = new AtomPubClient( 'uid', 'pwd' );

print mb_convert_encoding( $ac->post(
  'http://d.hatena.ne.jp/t_ishida/atom/blog',
  new AtomPubEntry( 'テスト', 'テスト' )
  ) , 'sjis', 'utf8' );

print mb_convert_encoding( $ac->get(
  'http://d.hatena.ne.jp/t_ishida/atom/blog',
  'GET'
  ) , 'sjis', 'utf8' );
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< Magic3解説本の執筆状況とMagic3について

XOOPSモジュール開発方法の覚書(その1:超基本編) >>

Find it!

Theme Design by devolux.org

Tag Cloud