M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2008年4月16日 22:56

EDGE Now!外部DBを使いEDGE Now!のRSSを作る

このエントリーをはてなブックマークに追加 mixiチェック

おととい作ったEDGE Now!外部DBは、EDGE Now!で参加者が紹介してくれたURLを、紹介された順番で登録していますので、それを利用すると、RSSができるのではないかと思いました。

というわけで早速スクリプト。

Filename: index.rdf

#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use DBI;
use LWP::UserAgent;
use URI::Escape;
use XML::Simple;
use XML::RSS;
use utf8;
use Encode;
binmode STDOUT => ':utf8';
 
my $q = CGI->new();
my $result = get_data();
my $rss    = rss($result);
if ($ENV{GATEWAY_INTERFACE}) {
    require CGI;
    print CGI::header('text/xml; charset=utf-8');
}
print $rss;
 
exit;
 
 
sub rss {
  my $items = shift;
  my $rss = XML::RSS->new;
  $rss->add_module(
    prefix => 'content',
    uri    => 'http://purl.org/rss/1.0/modules/content/',
  );
  
  $rss->channel(
    title    => 'EDGE Now! 今注目されているサイト',
    link     => 'http://edgenow.jp/',
    description => 'EDGE Now! 今注目されているサイトのRSS',
    language => 'ja',
    dc => {
      publisher    => 'アドビシステムズ株式会社',
      contributor  => 'DTPWiki.jp',
    },
    syn => {
      updatePeriod    => 'daily',
      updateFrequency => '12',
    },
  );
  
  foreach my $item (@$items) {   
      $rss->add_item(
        link  => $item->{'url'},
        title => _escape( decode('utf8',
                                 $item->{'title'}
        ) ),
        description => _escape(
                         decode('utf8',
                                "$item->{'title'} "
                                ."$item->{url}"
        ) ),
        dc => {
          date => _date( $item->{'ctime'} ),
        },
      );
  }
  return $rss->as_string() ;
}
 
sub get_data {
  my $db_path = 'edgenow_sites.db';
  my $dbh = DBI->connect( "dbi:SQLite:dbname=$db_path",
                          "","", {AutoCommit => 0} );
  my $sth  = $dbh->prepare("SELECT * FROM urls "
                          ."ORDER BY id DESC LIMIT 50");
  my $result = $sth->execute() || die $!;
  my $hash;
  while (my $ref = $sth->fetchrow_hashref) {
    push @$hash, $ref;
  }
  $dbh->commit();
  return $hash;
}
 
sub _date {
  my $date = shift;
  $date =~s/\s/T/g;
  $date .= '+00:00';
  return $date;
}
 
sub _escape {
  my $str =shift;
  $str =~s/&/&/g;
  return $str;
}
 
__END__

これは実際にアクセスできます。

http://labo.dtpwiki.jp/edgenow/index.rdf

だいたいSQLiteのDBの扱い方にも慣れてきましたので、次回は、URLを問い合わせると、紹介した人の人数をEDGE Now!に問い合わせして、User数として返すXML-RPCインターフェースをつけてみようと思います。

投稿 大野 義貴 [Web] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2441

コメントする