読者です 読者をやめる 読者になる 読者になる

ゆーすけべー日記

はてなBlogってどーなの!?

エントリーリストにはてブ件数を表示する、オンテナにはてブ件数表示機能追加

エントリー一覧のように複数のリンクが貼ってあるページがあって、それぞれのリンクにはてなブックマークされている件数を表示させるっていうのを2種類の方法で試してみた。 試す対象は、奥出研究室メンバーのBlog/日記の更新情報をお届けする「オンテナ」。 オンテナの最新記事リストには登録されいているBlogの記事最新100件がリンクされているので、 それぞれのリンクについて被はてなブックマーク件数を表示させる。

まず最初に考え付いた方法は、はてなブックマーク件数取得APIをPerlから操って、表示するにはAjaxを使うという方法。これはAjaxの勉強も兼ねて。で、実際に作ってできたんだけど、よくよく調べてみたら「ブックマーク数を画像で取得する API」なるものを使った方がcgiをたたかない分、格段に表示が早いし簡単なので結局そちらを採択。というわけで、オンテナにはてブ件数を表示させることができました。

はてブ

でもAjaxのプログラムせっかく書いたので以下に公開。Ajaxのプログラムは初めてだったのでJavaScriptでてこずった。。。リファクタリング必要やね。

hatebu_count.cgi Perlプログラム

#!/usr/bin/perl

use strict;
use XMLRPC::Lite;
use CGI;
use JSON;

my $q = new CGI;
my $uri = $q->param('uri');
my $EndPoint = 'http://b.hatena.ne.jp/xmlrpc';
my $obj;

#$uri = "http://yusukebe.com/";
if ($uri eq ''){
  $obj = {
    count => '',
    name => 'error'
  }
}else{
  $uri =~ s!http://b.hatena.ne.jp/entry/!!;
  my $map = XMLRPC::Lite
    ->proxy($EndPoint)
    ->call('bookmark.getCount', $uri)
    ->result;
  $obj = {
    count => $map->{$uri},
    name => $uri
  }
}

print $q->header(-content_type => "text/javascript",
                  -charset => "utf-8");
print objToJson($obj);

hatebu_count.js

function get_hatebu_count(uri) {
  var params = 'uri=' + encodeURI(uri);
  var cgi_url = './hatebu_count.cgi';
  var myAjax = new Ajax.Request (
    cgi_url,
    {
    method: 'get',
    parameters: params,
    onComplete: showResponse
    });
}

function showResponse(req, json) {
  eval("var ret = " + req.responseText);
  if(ret.count>0){
    
    var tag = '';
    if (ret.count >= 5) {
      tag = 'strong';
    } else if (ret.count >= 3) {
      tag = 'em';
    }
    var anchor = document.createElement('a');
    anchor.setAttribute('href', 'http://b.hatena.ne.jp/entry/' + ret.name);
    anchor.setAttribute('target', '_blank');
    var text = ret.count + ' users';
    anchor.appendChild(document.createTextNode(text));
    
    var element;
    if (tag == '') {
      element = anchor;
    } else {
      element = document.createElement(tag);
      element.appendChild(anchor);
    }
    var oldElement = getElement(ret.name);
    oldElement.firstChild.nodeValue = '';
    oldElement.style.display = "inline";
    oldElement.setAttribute('id','hatebu-count');
    oldElement.appendChild(element);
  }
}

function trigger(){
  var els =  document.getElementsByName('hatebu_count');
  for(var i=0;i<els.length;i++){
    get_hatebu_count(els.item(i).firstChild.nodeValue);
  }
}

function getElement(uri){
  var els =  document.getElementsByName('hatebu_count');
  var el;
  for(var i=0;i<els.length;i++){
    if(els.item(i).firstChild.nodeValue == uri){
      el = els.item(i);
      break;
    }
  }
  return el;
}

以下のようにspanでもなんでもいいからnameもしくはid属性にhatebu_countを持つオブジェクトの中にURLを書いたHTMLを用意して、hatebu_count.jsとprototype.jsをHTMLで読み込んで、trigger()を実行すれば動くはずです。

<html>
  <head>
  <link rel="stylesheet" href="">http://kamawada.com/~yusuke/yusukebe/archives/files/060829/hatebu_count.css" type="text/css" />
  <script type="text/javascript" src="">http://kamawada.com/~yusuke/yusukebe/archives/files/060829/prototype.js">
  <script type="text/javascript" src="">http://kamawada.com/~yusuke/yusukebe/archives/files/060829/hatebu_count.js">
</head>
<body>
<p>
  <a href="#" onclick="trigger(); return false;">
  はてブ数ゲット
  </a>
</p>
<ul>
  <li><span name="hatebu_count" id="hatebu_count">http://yusukebe.com/
  <li><span name="hatebu_count" id="hatebu_count">http://www.google.co.jp/
  <li><span name="hatebu_count" id="hatebu_count">http://www.yahoo.co.jp/
  <li><span name="hatebu_count" id="hatebu_count">http://www.yahooooooo.co.jp/
</body>
</html>

以下動いているサンプル。時間差で表示が変わるのがAjaxならではで気持ちいい。ちなみに、こちらの記事を多いに参考にさせていただきました→[戯] はてなブックマーク件数を blog に貼り付けるウィジェット

参考書籍

Ajaxイン・アクション Ajaxイン・アクション
  • Dave Crane Eric Pascarello Darren James 柏原 正三 株式会社はてな 網代 淳 星 睦
  • インプレス 大型本 (2006/06/09)
  • Amazonで詳しくみる
改訂第3版 JavaScriptポケットリファレンス Pocket reference 改訂第3版 JavaScriptポケットリファレンス Pocket reference
  • 古籏 一浩
  • 技術評論社 単行本 (2003/05/24)
  • 売り上げランキング: 51,942
  • おすすめ度: 4.67
  • Amazonで詳しくみる