モノノフ日記

普通の日記です

PHPからはてなのAtomAPIを使ってみた

今までRESTのAPIしか使ったことがなかったので勉強がてらAtomAPIを触ってみました。

とりあえずはてなフォトライフへ画像をPOSTする関数を作ってみました。WSSE認証って何?ってレベルだったので苦戦しまくりでした。下記のサイトを参考にしています。

下のコードでPOSTに成功したところです。HTTP_Requestを使えば簡単にできるみたいですね。はてブやダイアリーも似たような感じなリクエストでいじれると思うので色々触ってみようと思います。

<?php

require_once 'HTTP/Request.php';

function postImage($account, $password, $img, $title)
{
    $handle = fopen($img, 'rb');
    $contents = stream_get_contents($handle);
    fclose($handle);
    $jpegdata = base64_encode($contents);

    $created = date('Y-m-d\TH:i:s\Z');
    $nonce = pack('H*', sha1(md5(time())));
    $pass_digest = base64_encode(sha1($nonce.$created.$password, true));

    $wsse = 'UsernameToken Username="'.$account.'", PasswordDigest="'.$pass_digest.'", Created="'.$created.'", Nonce="'.base64_encode($nonce).'"';

    $rawdata = '&lt;entry xmlns="http://purl.org/atom/ns#">'.'&lt;title>'.$title.'&lt;/title>'.'&lt;content mode="base64" type="image/jpeg">'.$jpegdata.'&lt;/content>'.'&lt;/entry>';

    $url = 'http://f.hatena.ne.jp/atom/post';

    $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(HTTP_REQUEST_METHOD_POST);
    $req->setURL($url);
    $req->addRawPostData($rawdata);
    $res = $req->sendRequest();
    if(PEAR::isError($res))
        return $res;
}

?>

参考にしたサイトにHeader名が「XWSSE」とハイフンが無かったのでそこで嵌ってました(;^ω^)あと、作ってる途中に気づいたんですがPEAR::Services_Hatenaモジュールがあるらしいですorz