読者です 読者をやめる 読者になる 読者になる

モノノフ日記

普通の日記です

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

work php

今まで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