ゼットログ

よしなしごとを記す

はてなブックマークAtomAPIを使う

まずは必要最低限のコードをPHPで書いてみた。コードについて変なところがあったらコメントをお願いします。

「ブックマークする」の画面をまねる

ブックマークするための情報を登録する。bmk.phpという名前にしよう。

<html>
<head>
<title>Set the Bookmark</title>
<META http-equiv="Content-Type" content="text/html;charset=Shift_JIS">
</head>
<body>
<?php
$href_data = $_REQUEST["href_data"];
$title = $_REQUEST["title"];

print "<FORM name="form1" method="post" action="setbmk.php">";
print "TITLE : ";
print "<INPUT type="text" name="title" value="" . $title . ""><br>";
print "URL : ";
print "<INPUT type="text" name="href_data" value="" . $href_data . ""><br>";
print "<INPUT type="submit" value="add url">";
print "</FORM>";
?>
</body>
</html>

AtomAPIを発行する

上のファイルのFORMタグで指定しているsetbmk.phpを書く。

<?php
require_once('HTTP/Request.php');

$username = 'xxx';
$password = 'yyy';
$url = 'http://b.hatena.ne.jp/atom/post';
$title = $_POST['title'];
$href_data = $_POST['href_data'];

$http = new HTTP_Request();
$wsse = getWSSE($username, $password);
$rowPostData = getRowPostData($title , $href_data);
$http->addHeader('Accept', 'application/x.atom+xml, application/xml, text/xml, */*');
$http->addHeader('Authorization', 'WSSE profile="UsernameToken"');
$http->addHeader('X-WSSE', $wsse);
$http->addHeader('Content-Type', 'application/x.atom+xml');
$http->setMethod(HTTP_REQUEST_METHOD_POST);
$http->setURL($url);
$http->addRawPostData($rowPostData);
if (!PEAR::isError($http->sendRequest())) {
	//ブックマークする前のページへ戻る
	header("HTTP/1.1 301 Moved Permanently");
	header("Location: $href_data");

}

function getRowPostData($title, $href_data) {
    $rowPostData =
	'<?xml version="1.0" encoding="utf-8"?>' .
	'<entry xmlns="http://purl.org/atom/ns#">' .
  	'<title>' . $title . '</title>' .
  	'<link rel="related" type="text/html" href="' . $href_data . '" />' .
  	'<summary type="text/plain"></summary>' .
	'</entry>';

    return $rowPostData;
}

function getWSSE($username, $password) {
     $nowtime = date('Y-m-d\TH:i:s\Z');
     $nonce = pack('H*', sha1(md5(time())));
     $digest = base64_encode(pack('H*', sha1($nonce . $nowtime . $password)));
     $wsse = 'UsernameToken Username="' . $username.'", PasswordDigest="'. $digest .'", Nonce="'. base64_encode($nonce) .', Created="'.$nowtime.'"';

     return $wsse;
}
?>

ブックマークレット

これをブラウザのお気に入りに忍ばせておく。そして、上記二つのファイルをどこかのサーバーにアップすればOK。
これはポップアップで画面が開かないタイプ。

javascript:window.location='http://youreserver_name/bmk.php?href_data='+escape(location.href)+
'&title='+escape(document.title);

とりあえず、できた

あとはいくつか機能を追加してみよう。WebAPIっておもしろいなぁ。いろいろ遊べそう。
参考にさせていただいたサイトはトラックバックURLに。ありがとうございます。