Archive for the ‘Social Networking’ Category

’Save This Page’ Button - Yahoo!ブックマークに対応

Thursday, June 7th, 2007

del.icio.usはてなブックマーク に引続き、Yahoo!ブックマーク に対応。下記を参考に、登録ボタンと登録数表示の両方をとりつけてみた。

登録数表示の JavaScript コードのスタイルが若干古め?な感じなので、ちょっと困ってしまった。登録数を表示するには、表示したい箇所に

<script type="text/javascript" src="http://num.bookmarks.yahoo.co.jp/ybmno.php"></script>

を入れればよいことになっている。ブラウザでロードすると、この script タグは、以下を返してくるが、

document.write('<a href="http://bookmarks.yahoo.co.jp/url?url=http%3A%2F%2Fblog.shimazu.org%2Farchives%2F117">1')

いきなり HTML に書き込んでいるのに加え、a タグの閉じタグがなく自分で付け足すほかなし、といった感じでプログラム制御がとてもしづらい感じになってしまっている。せめて登録数だけ返すとか、id 指定に基づき既存の HTML タグに値を入れ込むとか、JSONP とか、表示と分離された実装が望ましいように思う。

結局、以下のようなコードを記事テンプレートに書き、

<a href="http://bookmarks.yahoo.co.jp/action/post"
onclick="window.open(); return false;">
Add to Yahoo! Bookmarks</a>
<span id="yahoobookmarks">
<script type="text/javascript" src="http://num.bookmarks.yahoo.co.jp/ybmno.php">
</script>
</a></span>

※一部省略
※あらかじめ span タグは display:none; を指定

JavaScript 外部ファイルには(若干回りくどい)以下コードを追加した。

(function(){
var E = YAHOO.util.Event;
var D = YAHOO.util.Dom;
// snip
E.addListener(this, 'load', function(){
	var a = D.get('yahoobookmarks').childNodes[1];
	var i;
	if( a && (i=parseInt(a.innerHTML)) ) {
		a.innerHTML = i + (i==1?'user':'users');
		D.setStyle('yahoobookmarks','display','inline');
	}
});
})();

過去の関連記事:

追記(2007/06/08):
同僚 T 氏からいただいた指摘を受け、JavaScript コードを若干修正。

‘Save This Page’ 件数表示の実装

Saturday, May 19th, 2007

今回の 表示機能 の実装は、

  • del.icio.us・はてブ の API をたたき、JSONP (JSON with Padding) 形式のデータを出力する Ruby スクリプト
  • JSONP 形式データを受け取り、整形・表示する JavaScript

の 2 つから構成される。実装にあたり、以下を参考にさせていただいた。

以下、個別にまとめておく。

はてなブックマーク の API をたたくスクリプト

はてなの場合、自分のブログに被ブックマーク数を表示する にあるような簡単な方法があるが、画像形式で表示され、デザインの調整がきかないことから、XML-RPC で API をたたく方法をとった。作成した getHatenaBookmarkCount.rbx の内容は以下のとおり。

#!/usr/bin/ruby -w
require 'cgi'
require 'xmlrpc/client'
require 'json/pure'

cgi = CGI.new
print cgi.header("type"=>"text/html")
end_point = 'http://b.hatena.ne.jp/xmlrpc'

url = cgi.params['url'][0] ? cgi.params['url'][0] : ""
callback = cgi.params['callback'][0] ? cgi.params['callback'][0] : nil

unless url =~ /^http:\\/\\/blog\\.shimazu\\.org\\//
	exit
end

urls = [ url ]
client = XMLRPC::Client.new2(end_point)
begin
	result = client.call('bookmark.getCount', *urls)
rescue XMLRPC::FaultException => e
	data = { 'error'=>e.faultCode, 'detailed'=>e.faultString }
	print data.to_json
	exit
end

data = [ { 'url'=>url, 'total_posts'=>result[url] } ]
if callback
	print callback ,'(', data.to_json ,')'
else
	print data.to_json
end

Ruby XMLRPC はてなブックマーク件数取得API というその名もずばりな参考資料があったので、それをベースにしている。

Ruby の json ライブラリは JSON implementation for Ruby から取得でき、rubygems でのインストールも可能。C で書かれたバージョン (json) と Pure Ruby のバージョン (json_pure) があるが、なぜか Debian GNU/Linux (Sarge) に前者 (json) がインストールできず、代わって後者 (json_pure) をインストールした。

del.icio.us の API をたたくスクリプト

del.icio.us / help / json / url にあるとおり、del.icio.us では普通に JSONP 形式の API が提供されてはいるものの、URL の指定に MD5 の暗号化が必要とのこと。Paul Johnson’s implementation of MD5 in JavaScript という凄腕ライブラリはあるものの、クライアント(ブラウザ)での処理は極力減らしたいので、MD5 処理する Ruby スクリプトをはさむかたちとした。作成した getDeliciousCount.rbx の内容は以下のとおり。

#!/usr/bin/ruby -w
require 'cgi'
require 'digest/md5'
require 'open-uri'

cgi = CGI.new
print cgi.header("type"=>"text/html")

api = 'http://badges.del.icio.us/feeds/json/url/data?hash='

url = cgi.params['url'][0] ? cgi.params['url'][0] : nil
callback = cgi.params['callback'][0] ? cgi.params['callback'][0] : nil

unless url =~ /^http:\\/\\/blog\\.shimazu\\.org\\//
	exit
end

request = api + Digest::MD5.hexdigest(url)
response = OpenURI.open_uri(request).read.chomp!

if callback
	print callback ,'(', response ,')'
else
	print response
end

出力結果

両者いずれも URL と callback 関数名 をパラメータ指定して、JSONP 形式のデータを出力するようになっている。出力例は以下のとおり(わかりやすくするため整形済み)。

例:getDeliciousCount?url=http://blog.shimazu.org/archives/95&callback=getDeliciousResponse

getDeliciousResponse([{
	"hash":"f021170bb35f553b70b7f392412babe4",
	"top_tags":{},"url":"http://blog.shimazu.org/archives/95",
	"total_posts":1
}])

例:getHatenaBookmarkCount?url=http://blog.shimazu.org/archives/89&callback=getHatenaBookmarkResponse

getHatenaBookmarkResponse([{
	"url":"http:\/\/blog.shimazu.org\/archives\/89",
	"total_posts":1
}])

なお、http://blog.shimazu.org/ で正規表現をかけているのは、http://blog.shimazu.org/ 以外のドメインでの利用を制限するため( XMLHttpRequest ではないので、クロスドメインでのアクセスが普通にできてしまうがそれを抑える目的)。

JSONP 形式データを受け取る JavaScript

データを受け取る処理を getcount.js としてまとめた。

function getDeliciousResponse(data){
if(!data||!data[0]||!data[0].total_posts){return false;}
var str = data[0].total_posts + (data[0].total_posts==1?'user':'users');
document.getElementById('delicious').innerHTML = '<a href="http://del.icio.us/url/' + data[0].hash + '">' + str + '</a>';
}
function getHatenaBookmarkResponse(data){
if(!data||!data[0]||!data[0].total_posts){return false;}
var str = data[0].total_posts + (data[0].total_posts==1?'user':'users');
document.getElementById('hatenabookmark').innerHTML = '<a href="http://b.hatena.ne.jp/entry/' + data[0].url + '">' + str + '</a>';
}
var el_delicious = document.createElement('script');
el_delicious.src = '/utils/getDeliciousCount?url=' + location.href + '&callback=getDeliciousResponse';
document.getElementsByTagName('head')[0].appendChild(el_delicious);
var el_hatena = document.createElement('script');
el_hatena.src = '/utils/getHatenaBookmarkCount?url=' + location.href + '&callback=getHatenaBookmarkResponse';
document.getElementsByTagName('head')[0].appendChild(el_hatena);

’Save This Page’ 件数表示

Sunday, May 13th, 2007

以前取り付けた ’Save This Page’ Button に「このページは何件ブックマークされているか」を表示させる仕組みをつけてみた。今回も del.icio.usはてなブックマーク の両方に対応している。

savebutton.png

目に見えるものはたったこれだけなのに、実装にやたら時間がかかってしまった。実装方法などについては、追ってまとめることにする。

追記
‘Save This Page’ 件数表示の実装 に実装詳細を記載。

‘Save This Page’ Button

Monday, February 26th, 2007

テーマばらばら、読者層不明、PVいまいち、というあまり(なんら?)取り柄がなさそうなこのブログだけど、とはいえ興味ある方には使っていただきたいので、利便性向上ということで、’Save This Page’ Button をつけてみた。del.icio.usはてなブックマーク に対応している。

以下ページを参考にさせていただいた。

del.icio.us ではテストを行ったが、はてなは行ってない。はてな使ったら負けかなと思っている

Flickr badge

Sunday, September 3rd, 2006

flickr_badge.jpgFlickr badge をはってみる。時々みかけるこの badge、どうやって導入するんだろう?としばらく探してたら、WP のヒント:flickr の写真をブログに にあるとおり、Flickr 自身が提供しているとのことで、まさに灯台下暗し。最初っから Flickr 探しときゃよかったんだ。

How To Get The Most Out of Flickr にあるとおり、blog 連携機能の一環として、badge が提供されているみたい。set や tag の絞込みとか、ランダム表示・一部拡大表示とかいろいろできて、結構芸が細かい。

VOX をためす

Monday, August 28th, 2006

vox.gifMovable Type の開発元、Six Apart が最近リリースした VOX をためしてみる。

Movable Type の会社がつくっただけあって出来がよい。しかも、カスタマイズを前提とした Movable Type とことなり、セットアップのカンタンさを大事にしてるみたいで、何も手を加えずともすでに完成度が高し。

SNS的要素を加味してるらしく友人の更新状況もカンタンにみられるっぽいけど、海外版だからか、サーバが重いのが難点。URL には意図した綺麗さがあるけど、開発言語はやはり Perl なんだろうか。