ブクマのサジェストつくってみた(重い。。。)

ブクマのサジェストつくってみた(重い。。。)をはてなブックマークに追加 ブクマのサジェストつくってみた(重い。。。)をdel.icio.usに追加 Yahoo!ブックマークに登録 ブクマのサジェストつくってみた(重い。。。)をGoogle Bookmarksに追加 ブクマのサジェストつくってみた(重い。。。)をtwitterにポスト
というわけで、作ってみました。
私はpost2sbmでdeliciousとtwitterとはてなに対していっぺんにブックマークをポストしているのですが、今見てるページはどんなタグでブックマークされているのかなー?とかいう機能をつけてみたい!というとこから作ってみました(クライアント側は作ってないです)。
タグの集計までは結構さくさくいくのですが、欲が出てその先のそのタグを付けた人は、他に同じタグでどんなページをブクマしているのか?ってのも欲しくなって、これを実装したらアホみたいに重くなりました。
PHPで実装しているのですが、ちょっといろいろダメだろこれ的なところが沢山ありそうです。XMLパーサはサーバがPHP4だからそういう作りになっちゃいました。PHP5になればsimpleXMLとかが使えるらしいのですがよくわからん。
クライアントのグリモンとかubiquityコマンドはまだ手つかずなのですが、もしかしたら全部クライアントでやった方が体感早いのかもしれません。そうなったらそうなったでそうする。

gigazineのページを渡すとこんな感じで返してくる。ブックマークレットにすると↓な感じ。

javascript:void(location.href="http://mojalog.com/mojascript/hatena.php?p="+encodeURI(location.href))

とりあえずやってみたかったのは、
・ブクマしようとしているページをはてブのRSSからひろう。
・で、タグを集計する
・タグの嵩みが多い順にソートする
・そのタグを付けたユーザのブクマRSSを拾う。
・このページをブックマークしているユーザはこんなタグで他のこんなページもブックマークしてますよ的な表示をさせてあわよくば*あとで読むタグを付けながら一緒にブクマできるようなインターフェイスを設ける
てことをやりたい。恥ずかしながらソースを載せてみる(股間を隠しry)。ここは普通こうすんだろJK的な事があったら教えてほしいです><(←><ってやると優しく教えてくれるらしいよってvipに載ってた)(うそ)

<?php
$targetUrl = $_GET[ "p" ];
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_detect_order('ASCII,JIS,UTF-8,EUC-JP,SJIS');
class xml {
var $parser;
var $refTag;
var $suggestUser;
var $curData;
var $keyList;
var $suggestList;
var $urlList;
function xml(){
$this->keyList = array();
$this->suggestList = array();
$this->urlList = array();
$this->suggestUser = "";
$this->curData = "";
$this->parser = xml_parser_create( 'UTF-8' );
xml_set_object( $this->parser, $this );
xml_set_element_handler( $this->parser, "TagOpen", "TagClose" );
xml_set_character_data_handler( $this->parser, "CData" );
}
function parse( $data ){
xml_parse( $this->parser, $data );
}
function TagOpen( $parser, $tag, $attributes ){
$this->refTag = $tag;
}
function CData( $parser, $cdata ){
if( strcmp( $this->refTag, "TITLE" ) == 0 ){
$this->suggestUser = trim( $cdata );
}
if( strcmp( $this->refTag, "DC:SUBJECT" ) == 0 || strcmp( $this->refTag, "LINK" ) == 0 ){
$this->curData .=  $cdata;
}
}
function TagClose( $parser, $tag ){
if( strcmp( $tag, "DC:SUBJECT" ) == 0 ){
$this->keyList[ $this->curData ] = ( isset( $this->keyList[ $this->curData ] ) )
? $this->keyList[ $this->curData ] + 1
: 1;
$this->suggestList[ $this->curData ] = ( isset( $this->suggestList[ $this->curData ] ) )
? $this->suggestList[ $this->curData ] . ',' . $this->suggestUser
: $this->suggestUser;
}
if( strcmp( $tag, "LINK" ) == 0 ){
$this->urlList[ $this->curData ] = $this->suggestUser;
}
if( strcmp( $tag, "DC:SUBJECT" ) == 0 || strcmp( $tag, "LINK" ) == 0 || strcmp( $tag, "TITLE" ) == 0 ){
$this->curData = "";
}
$this->refTag = "";
}
function getSuggestList(){
return $this->suggestList;
}
function getKeyList(){
return $this->keyList;
}
function getUrlList(){
$ary = $this->urlList;
$this->urlList = array();
return $ary;
}
}
$suggestList = array();
$keyList = array();
require_once( 'HTTP/Request.php' );
$req =& new HTTP_Request( "http://b.hatena.ne.jp/entry/rss/" . $targetUrl );
$req->setMethod( HTTP_REQUEST_METHOD_GET );
if ( !PEAR::isError( $req->sendRequest() ) ) {
$res = $req->getResponseBody();
$xml_parser = new xml();
$xml_parser->parse( $res );
$suggestList = $xml_parser->getSuggestList();
$keyList = $xml_parser->getKeyList();
unset( $xml_parser );
}
$req->clearPostData();
arsort( $keyList );
header('Content-Type: text/xml');
$xml =<<< EOD
<?xml version="1.0" encoding="UTF-8" ?>
<itemlist>
EOD;
echo $xml . "\n";
$loopCount = 0;
while( list( $key, $val ) = each( $keyList ) ) {
echo "<elem>\n";
echo "<tagname>" . htmlspecialchars( $key ) . "</tagname>\n";
$usersList = split( ",", $suggestList[ $key ] );
$userBkm =& new HTTP_Request( "http://b.hatena.ne.jp/" . $usersList[ rand( 1, count( $usersList ) -1 ) ] . "/rss?tag=" . urlencode( $key ) );
$userBkm->setMethod( HTTP_REQUEST_METHOD_GET );
if ( !PEAR::isError( $userBkm->sendRequest() ) ) {
$res = $userBkm->getResponseBody();
$xml_parser = new xml();
$xml_parser->parse( $res );
$tempList = $xml_parser->getUrlList();
$nLoopCount = 0;
while( list( $nkey, $nval ) = each( $tempList ) ) {
$nLoopCount++;
if( $nLoopCount < 2 ){
continue;
}
echo "<suggest>\n";
echo "<title>" . htmlspecialchars( $nval ) . "</title>\n";
echo "<link>" . htmlspecialchars( $nkey ) . "</link>\n";
echo "</suggest>\n";
}
unset( $xml_parser );
}
$userBkm->clearPostData();
echo "</elem>\n";
$loopCount++;
if( $loopCount >= 3 ) break;
}
echo "</itemlist>";
?>

コメントをどうぞ