全然気づいてなかったけど、PEAR::Services_Hatenaっていうライブラリがあるんですね。

Services_Hatena

しかもPEARに収録されたのは2006年のこと。

今までWSSEとか自分で実装してましたが、これ使えばそういう煩雑な部分全部省略できますね。
なんというか、まったくもって迂闊でした。


というわけで、この中のServices_Hatena_Bookmarkを使ってブックマークのポストその他をしてみるテスト。

ドキュメント

Docs For Class Services_Hatena_Bookmark
はてなブックマークAtomAPIとは - はてなキーワード




はてなブックマークにポストする

ポストはWSSE認証でログインしたのち、URLとコメントをAPIに渡してやれば完了です。はてなブックマークAtomAPIの仕様上、タイトルは自動取得されポスト時には設定できません。タグはコメントの先頭に「[はてな]」のように付加することでポストすることが出来ます。

サンプルコード

require_once 'Services/Hatena.php';
//setting
$user = 'userName';
$pass = 'password';
//引数に'Bookmark'を与えてインスタンスを作成
$hatena = Services_Hatena::factory('Bookmark');
//ログイン準備
$hatena->hatena_login($user, $pass);
//ブックマークをポスト
$r = $hatena->add_bookmark(
  'http://nplll.com',   //string url
  '[blog]テスト投稿'    //string comment
);
var_dump($hatena->http->getResponseCode()); //201

ポストに成功するとレスポンスコードとして201が返されます。レスポンスには、

$hatena->http

でアクセスすることが出来ます。


なおポストしたページが既にブックマーク済みだった場合、処理は行われません。コメントの上書きも行われないため、コメントの変更は編集で行う必要があります。処理が行われなくても返ってくるレスポンスコードは201です。
このあたりははてなブックマークAtomAPIの仕様です。




ポストしたブックマークを編集する

既にポストしているブックマークに関する情報を編集します。

ブックマークを編集するためにはエントリID(eid/Services_Hatenaではhatena bookmark idと呼称)が必要です。Services_Hatenaにはeidを取得するメソッドはないため、一度ポストしたあとレスポンスに含まれるEditURIを解析するか、他の方法を使用する必要があります(他の方法については後述します)。

ここでは、eidが取得できているものとします。

サンプルコード

require_once 'Services/Hatena.php';
//setting
$user = 'userName';
$pass = 'password';
//引数に'Bookmark'を与えてインスタンスを作成
$hatena = Services_Hatena::factory('Bookmark');
//ログイン準備
$hatena->hatena_login($user, $pass);
//ブックマークを編集
$r = $hatena->edit_bookmark(
  '21302607',                 //string eid
  'テストタイトル',           //string title
  '[blog]テスト投稿編集済み'  //string comment
);
var_dump($hatena->http->getResponseCode()); //200

編集に成功するとレスポンスコードとして200が返されます。




ポストしたブックマークのタイトルを取得する

既にポストしているブックマークのタイトルを取得します。編集と同じくエントリIDが必要です。

サンプルコード

require_once 'Services/Hatena.php';
//setting
$user = 'userName';
$pass = 'password';
//引数に'Bookmark'を与えてインスタンスを作成
$hatena = Services_Hatena::factory('Bookmark');
//ログイン準備
$hatena->hatena_login($user, $pass);
//ブックマークのタイトルを取得
$r = $hatena->get_bookmark(
  '21302607'                 //string eid
);
var_dump($r); //テストタイトル

タイトルの取得に成功するとタイトルが返されます。

対象ページがまだポストされていないか削除されている場合には、エラーが発生する...ことはなく、404ページのタイトル「おさがしのページは見つかりませんでした」が返ります。ブックマークの存在も含めて確認するときには、レスポンスコードをチェックする必要があるでしょう。

$responceCode = $hatena->http->getResponseCode();  //ページが存在しない場合は404が返る




ポストしたブックマークを削除する

既にポストしているブックマークを削除します。編集と同じくエントリIDが必要です。

サンプルコード

require_once 'Services/Hatena.php';
//setting
$user = 'userName';
$pass = 'password';
//引数に'Bookmark'を与えてインスタンスを作成
$hatena = Services_Hatena::factory('Bookmark');
//ログイン準備
$hatena->hatena_login($user, $pass);
//ブックマークを削除
$r = $hatena->delete_bookmark(
  '21302607'                 //string eid
);
var_dump($r); //true

削除に成功するとtrueが、失敗するとfalseが返ります。削除対象が既に削除されていた場合にもtrueが返ります。




Services_Hatena_Bookmarkで定義されている主なメソッドは以上です。
これらを使えば大抵の処理は出来るでしょう。




オマケ(その1):エントリIDをURLから取得する

エントリIDはユーザーではなくURLと結びつけられているので、本来取得するのに認証は必要ないはずなんですが、はてなブックマークAtomAPIには取得するための方法が用意されていません。

取得するには前述したようにEditURIを解析するか、

/atom/edit/XXXX → eid:XXXX

はてなブックマークエントリー情報取得APIを使用する必要があります。

はてなブックマークエントリー情報取得APIとは - はてなキーワード

「はてなブックマークエントリー情報取得API」はエントリの情報をJSON形式で返すAPIですが、その中にeidも含まれています。

サンプルコード

require_once 'HTTP/Client.php';
$client = new HTTP_Client();
$client->get('http://b.hatena.ne.jp/entry/jsonlite/?url=' . urlencode('http://nplll.com'));
$response = $client->currentResponse();
$body = json_decode($response['body'], true);
var_dump($body['eid']); //21302607

過去に誰かによって一度でも登録されたことがあれば、情報が返ります。
もし過去に誰にも登録されたことがなければnullが返ります。




オマケ(その2):自分がブックマークしているかどうかを確認する

多分、次の2段階を踏むことになろうかと思います。

  1. 「はてなブックマークエントリー情報取得API」を利用してeidを取得する。eidが取得できない場合はブックマークしていない。
  2. get_bookmark(eid)メソッドを使ってタイトルを取得する。レスポンスコードが404ならブックマークしていない。200ならブックマークしている。

もちろん、ポストすることだけが目的の場合は、ポスト済みだろうとなんだろうとポストしてしまうという仕様も無くはないと思います。コメントの上書きが出来ないのは諦める、もしくはポストしたあと必ず編集する方向で。