はてなブックマークAtomAPIの使い方


はてなブックマークAtomAPIとPHPをつかって自分のはてなブックマークした、
ページのURLを取得しようと考えています。

http://thinkit.co.jp/article/1112/1?page=0,0

などを参考にしているのですがうまくいきません(404エラーが帰ってくる)

PHPを使ってはてなブックマークAtomAPIを使うサンプルなどがありましたら教えて下さい、

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2011/08/04 18:03:59
  • 終了:2011/08/11 18:05:04

ベストアンサー

id:pacochi No.1

ぱこち回答回数247ベストアンサー獲得回数1122011/08/05 13:16:57

私のところでは、以下のようなコードで取得できています。

(普段使っているコードを回答用に少し簡略化しました。)

<?php

mb_internal_encoding("UTF-8");

$username = 'はてな ID';
$password = 'パスワード';
$url = 'http://b.hatena.ne.jp/atom/feed';

# WSSE 認証用
$created = date('c');
$nonce = sha1(md5(time()), true);
$nonceEnc = base64_encode($nonce);
$passwordDigest = base64_encode(sha1($nonce . $created . $password, true));

$opts = array(
 'http' => array(
  'method' => 'GET',
  'timeout' => 30,
  'max_redirects' => 1,
  'header' => implode("\r\n", array(
   'Authorization: WSSE profile="UsernameToken"', 
   'Content-type: application/x.atom+xml',
   "X-WSSE: UsernameToken Username=\"{$username}\", PasswordDigest=\"{$passwordDigest}\", Nonce=\"{$nonceEnc}\", Created=\"{$created}\""
  ))
 )
);

$context = stream_context_create($opts);
$fp = fopen($url, 'rb', false, $context);

if (!$fp) exit("{$url} にアクセスできません。");

$body = stream_get_contents($fp);
fclose($fp);

# 取得した XML を表示しておしまい
header('Content-type: application/xml; charset=UTF-8');
exit($body);

?>

WSSE 認証の部分を書く際に参考にしたのは確かこちらのページだったと思います。

はてなの AtomAPI に脆弱性あり!? - あらびき日記

私の書いたものは自分のところ (PHP5) でしか使わないので、date や sha1 の辺りを PHP5 向けに書き直しています。

あと、当然といえば当然なのですが、公式のドキュメントを参照しながら書いた覚えがあります。(PHP のサンプルコードは載っていません。)

(余談ですが、この書き方でブックマーク追加などを行いたい場合、PHP5.3 以上じゃないとできなかった気がします。)


質問者さんが参考にしたところのような書き方をする場合、以下のコードで取得できました。

auth_wsse.php には ID とパスワードを記入しています。

<?php

mb_internal_encoding("UTF-8");
error_reporting(E_ALL & ~E_DEPRECATED); # PHP5.3 以降用
require_once 'HTTP/Request.php';
require_once 'auth_wsse.php';

$url = 'http://b.hatena.ne.jp/atom/feed';

$req = new HTTP_Request($url);
$req->setMethod(HTTP_REQUEST_METHOD_GET);
set_auth_wsse($req);
if (PEAR::isError($req->sendRequest())) exit('通信エラーが発生しました');

$code = $req->getResponseCode();
if ($code != 200) exit("エラーが発生しました:コード = ${code}\n");

$resp = trim($req->getResponseBody());
# 取得した XML を表示しておしまい
header('Content-type: application/xml; charset=UTF-8');
exit($resp);

?>

404 エラーになる原因は分かりませんでした。こちらでは、アクセス先の URL を間違えたりしない限り、404 エラーは出ませんでした。


以下返信を受けての追記です。 (2011.8.5 14:45)


>自分がブックマークしているすべてのページを取得できる方法

フィードはいっぺんに 20件ずつしか取得できないようなので、 http://b.hatena.ne.jp/atom/feed?of=20 のように取得開始位置を 20 刻みで指定しながら、XML 内に <link rel="next"~ が出てこなくなるまで何度も取得する必要があると思います。

連続でアクセスするとはてなのサーバも大変だと思うので、ちょっとお休みの時間をはさみつつ取得して下さい。

id:whiterdev

回答ありがとうございます。

下の方のサンプルコードで最近ブックマークしたURLをXMLで取得できました。

どうやら

$url = 'http://b.hatena.ne.jp/atom/feed’;

$url = 'http://b.hatena.ne.jp/atom/edit’;

にしていたため、404エラーが出たようです。

上記のURLにGETでなげることで、

自分のブックマークしているすべてのページを取得できると思っていたのですが、

勘違いだったようです。

自分がブックマークしているすべてのページを取得できる方法がありましたら

ご教授お願いいたします、。

2011/08/05 14:12:57
  • id:pacochi
    返信ありがとうございます。回答に追記しましたのでご覧下さい。
    (人力検索はてなは、今のところ回答へ追記した時にメール通知が飛ばないようなので、コメントで追記の旨をお知らせしました。)
  • id:whiterdev
    遅れましたが 回答ありがとうございました。
    参考にしてやってみたいと思います。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません