様々なオンラインブックマークサービスのブックマーク件数を画像ではなくて数値で取得
スポンサードリンク
(2008-3-25 10.00追記)
下のボックスにURLを入れると、いろんなオンラインブックマークでのブックマーク件数が表示されます。
ブックマークの問い合わせは最初の1回だけ行って、その後はキャッシュします。
~~~
Filename: check.cgi
#!/usr/bin/perl
use strict;
use warnings;
use Cache::File;
use CGI;
use Data::Dumper;
use HTML::Template;
use JSON::Syck;
use LWP::Simple;
use LWP::UserAgent;
use utf8;
use XMLRPC::Lite;
binmode STDOUT => ':utf8';
sbm();
sub sbm {
# 初期設定
my $cachedir = 'cache';
my $sbms = {
hatena =>
{
proxy => 'http://b.hatena.ne.jp/xmlrpc',
entry => 'http://b.hatena.ne.jp/entry/',
method => 'bookmark.getCount',
message => 'このエントリーを'
.'はてなブックマークでブックマークしているユーザ数',
},
livedoor =>
{
proxy => 'http://rpc.clip.livedoor.com/count',
entry => 'http://clip.livedoor.com/page/',
method => 'clip.getCount',
message => 'このエントリーを'
.'livedoor Clipでクリップしているユーザ数',
},
pingking =>
{
proxy => 'http://api.pingking.jp/xmlrpc/bookmark',
entry => 'http://pingking.jp/url/',
method => 'getCount',
message => 'このエントリーを'
.'PingKingでブックマークしているユーザ数',
},
yahoo =>
{
proxy => 'http://num.bookmarks.yahoo.co.jp/yjnostb.php?urls=',
regexp => 'ct="(\d+)"',
entry => 'http://bookmarks.yahoo.co.jp/url?url=',
message => 'このエントリーを'
.'Yahooブックマークしているユーザ数',
},
delicious =>
{
proxy => 'http://badges.del.icio.us/feeds/json/url/data?url=',
entry => '',
message => 'このエントリーを'
.'del.icio.usでブックマークしているユーザ数',
},
buzzurl =>
{
proxy => 'http://api.buzzurl.jp/api/counter/v1/json?url=',
entry => 'http://buzzurl.jp/entry/',
message => 'このエントリーを'
.'Buzzurlでブックマークしているユーザ数',
},
fc2 =>
{
proxy => 'http://bookmark.fc2.com/image/users/',
regexp => '/(\d+)\.png',
entry => 'http://bookmark.fc2.com/search/detail?url=',
message => 'このエントリーを'
.'FC2ブックマークしているユーザ数',
},
pookmark =>
{
proxy => 'http://pookmark.jp/count/',
regexp => '/(\d+)$',
entry => 'http://pookmark.jp/url/',
message => 'このエントリーを'
.'POOKMARKでブックマークしているユーザ数',
},
};
# 開始
my $q = CGI->new();
my $url = $q->param('url') || 'http://www.yahoo.co.jp/';
my $counts;
# キャッシュ
my $cache = Cache::File->new(
cache_root => $cachedir,
default_expires => '3600 sec',
);
if ( $cache->exists( $url ) ) { # キャッシュ生きてる?
$counts = eval( $cache->get( $url ) );
}
else { # キャッシュ無効?
my $expiry = 50 + int( rand( 50 ) ).'min';
$counts = { # SBMサービスからブックマーク件数取得
yahoo => get_sbm( 'yahoo', $url ),
hatena => get_sbm( 'hatena', $url ),
delicious => get_sbm( 'delicious',$url ),
fc2 => get_sbm( 'fc2', $url ),
livedoor => get_sbm( 'livedoor', $url ),
pookmark => get_sbm( 'pookmark', $url ),
buzzurl => get_sbm( 'buzzurl' ,$url ),
pingking => get_sbm( 'pingking', $url ),
};
local $Data::Dumper::Terse = 1; # シリアライズ用
local $Data::Dumper::Indent = 0; # シリアライズ用
my $selialize = Dumper( $counts ); # シリアライズ実行
$cache->set( $url, $selialize, $expiry ); # キャッシュ書き込み
}
# キャッシュ処理終わり
$counts->{total} += $counts->{$_} foreach ( keys %$counts );
# ブックマーク数合計
my $html_hash = { # テンプレート差し込み用HTML項目準備
yahoo => sbm_html( 'yahoo' , $url, $counts->{yahoo } ),
hatena => sbm_html( 'hatena' , $url, $counts->{hatena } ),
delicious => sbm_html( 'delicious', $url, $counts->{delicious} ),
fc2 => sbm_html( 'fc2' , $url, $counts->{fc2 } ),
livedoor => sbm_html( 'livedoor' , $url, $counts->{livedoor } ),
pookmark => sbm_html( 'pookmark' , $url, $counts->{pookmark } ),
buzzurl => sbm_html( 'buzzurl' , $url, $counts->{buzzurl } ),
pingking => sbm_html( 'pingking' , $url, $counts->{pingking } ),
total => sbm_html( 'total' , $url, $counts->{total } ),
url => $url,
};
my $tmpl_html = << ' END_OF_HTML';
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" />
<title>
オンラインブックマーク件数チェック
</title>
<meta http-equiv="content-style-type"
content="text/css" />
<link rev="made" href="mailto:aab61120@pop12.odn.ne.jp" />
<link rel="index" href="." />
<style type="text/css">
body {
font-size: 13px;
*font-size: small;
*font: x-small;
}
* {
margin: 0;
padding: 0;
line-height: 1.6;
color: #333;
}
body {
background-color: #fff;
font-family: 'メイリオ',Meiryo,
'MS Pゴシック',sans-serif;
}
input {
font-family: Osaka, 'メイリオ',Meiryo,
'MS Pゴシック',sans-serif;
}
h1 {
font-weight: bold;
font-size: 122%;
margin-bottom: 20px;
}
img {
border: 0;
vertical-align: middle;
}
.posted em {
background-color: #fff0f0;
font-weight: bold;
font-style: normal;
}
.posted em a,
.posted em a:link,
.posted em a:visited,
.posted em a:hover,
.posted em a:active {
color: #f66;
font-weight: bold;
font-style: normal;
}
.posted strong {
background-color: #fcc;
font-weight: bold;
font-style: normal;
display: inline;
}
.posted strong a,
.posted strong a:link,
.posted strong a:visited,
.posted strong a:hover,
.posted strong a:active {
color: red;
font-weight: bold;
font-style: normal;
text-decoration: none;
}
.posted a,
.posted a:link,
.posted a:visited,
.posted a:hover,
.posted a:active {
text-decoration: none;
color: blue;
}
#content {
margin: 20px;
}
div.posted {
margin : 20px;
font-size: 90%;
line-height: 19px;
}
</style>
</head>
<body>
<div id="content">
<h1>
<a href="./">
オンラインブックマーク件数チェック</a
>
</h1>
<form action="check.cgi" method="get">
<p>
<label for="url">アドレス:</label>
<input name="url" id="url" style="width: 80%;"
tabindex="1" accesskey="a"
value="<tmpl_var name="url" escape="html">" />
<input type="submit"
tabindex="2" accesskey="s"
/>
</p>
<div class="posted">
<img src="images/yahoo.gif"
alt="yahoo"
width="16" height="16"
/><tmpl_var name="yahoo">
<br />
<img src="images/hatena.gif"
alt="hatena"
width="16" height="16"
/><tmpl_var name="hatena">
<br />
<img src="images/delicious.gif"
alt="delicious"
width="16" height="16"
/><tmpl_var name="delicious">
<br />
<img src="images/fc2.gif"
alt="fc2"
width="16" height="16"
/><tmpl_var name="fc2">
<br />
<img src="images/livedoor.gif"
alt="livedoor"
width="16" height="16"
/><tmpl_var name="livedoor">
<br />
<img src="images/pookmark.gif"
alt="pookmark"
width="16" height="16"
/><tmpl_var name="pookmark">
<br />
<img src="images/buzzurl.gif"
alt="buzzurl"
width="16" height="16"
/><tmpl_var name="buzzurl">
<br />
<img src="images/pingking.gif"
alt="pingking"
width="16" height="16"
/><tmpl_var name="pingking">
<br />
<img src="images/total.gif"
alt="total"
width="16" height="16"
/><tmpl_var name="total">
</div>
</form>
</div>
</body>
</html>
END_OF_HTML
my $tmpl = HTML::Template->new( scalarref => \$tmpl_html );
$tmpl->param( $html_hash );
print $q -> header(
-type => 'text/html',
-charset => 'utf-8',
);
print $tmpl->output();
return;
# SBMサービスからブックマーク件数取得
sub get_sbm {
my $service = shift;
my $url = shift;
if ( $service eq 'yahoo' ) {
return get_sbm_yahoo( $url );
}
elsif ( $service eq 'delicious' ) {
return get_sbm_delicious( $url );
}
elsif ( $service eq 'buzzurl' ) {
return get_sbm_buzzurl( $url );
}
elsif ( ( $service eq 'fc2' )
|| ( $service eq 'pookmark' ) ) {
return get_sbm_imageicon( $service, $url );
}
else {
return get_sbm_xmlrpc( $service, $url );
}
}
# XMLRPCによるブックマーク件数取得(livedoor,hatena,pingking)
sub get_sbm_xmlrpc {
my $service = shift;
my $url = shift;
my $result = XMLRPC::Lite->proxy( $sbms->{$service}->{proxy} )
->call( $sbms->{$service}->{method}, $url )
->result;
if ( $service eq 'pingking' ) {
return $result->[0]->{ count };
} else {
return $result->{ $url } || 0;
}
}
# Yahooブックマーク件数取得(REST)
sub get_sbm_yahoo {
my $url = shift;
my $content = get( $sbms->{yahoo}->{proxy}.$url );
my $count = 0;
if ( $content =~ m|$sbms->{yahoo}->{regexp}| ) {
$count = $1;
}
return $count;
}
# del.icio.usブックマーク件数
sub get_sbm_delicious {
my $url = shift;
my $data = JSON::Syck::Load( get( $sbms->{delicious}->{proxy}.$url ) );
return $data->[0]->{total_posts} || 0;
}
# Buzzurlブックマーク件数
sub get_sbm_buzzurl {
my $url = shift;
my $data = JSON::Syck::Load( get( $sbms->{buzzurl}->{proxy}.$url ) );
return $data->[0]->{users} || 0;
}
# ブックマーク件数イメージ提供サービスから件数取得
sub get_sbm_imageicon {
my $servce = shift;
my $url = shift;
my $ua = LWP::UserAgent->new();
$ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)');
my $req = HTTP::Request->new('GET', $sbms->{$servce}->{proxy}.$url );
my $res = $ua->simple_request($req);
my $location = $res->header('location');;
my $count = 0;
if ( $location =~ m|$sbms->{$servce}->{regexp}| ) {
$count = 0 + $1;
}
return $count;
}
# ブックマーク User数 HTML生成
sub sbm_html {
my $service = shift;
my $url = shift;
my $count = shift;
my $tag;
my $users = 'users';
$users = 'user' if $count == 1;
$tag = 'em' if $count > 2;
$tag = 'strong' if $count > 9;
my $tag_s = $tag ? "<$tag>" : q();
my $tag_e = $tag ? "</$tag>": q();
my $tmpl_html = << ' END_OF_HTML';
<tmpl_var name="tag_s">
<a href="<tmpl_var name="entry"><tmpl_var name="url" escape="html">"
title="<tmpl_var name="message">"
rel="nofollow" target="_blank">
<tmpl_var name="count"> <tmpl_var name="users"></a
><tmpl_var name="tag_e">
END_OF_HTML
my $tmpl = HTML::Template->new( scalarref => \$tmpl_html);
$tmpl->param(
url => $url,
entry => $sbms->{$service}->{entry},
message => $sbms->{$service}->{message},
tag_s => $tag_s,
tag_e => $tag_e,
count => $count,
users => $users,
);
return $tmpl->output();
}
}
__END__
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2414





![: Amazon.co.jp: プラスティック・メモリーズ 1【完全生産限定版】(イベントチケット優先販売申込券付) [Blu-ray]](/lists/_9/B00VWX66E8.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 2【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66K2.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 3【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6MV0.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 4【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66IO.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 5【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6Y0E.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 6【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX69D6.jpg)


コメントする