人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

●質問者: whiterdev
●カテゴリ:コンピュータ インターネット
✍キーワード:PHP URL はてなブックマーク はてなブックマークAtomAPI エラー
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● ぱこち
ベストアンサー

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

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

<?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"? が出てこなくなるまで何度も取得する必要があると思います。

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

◎質問者からの返答

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

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

どうやら

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

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

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

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

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

勘違いだったようです。

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ