PerfumeのオフィシャルブログはRSSが出力されていません。日々更新をチェックしにいくのもアミューズにお願いするのも面倒だったので、自分のサーバでRSSフィードを生成・提供するようにしました。
配信するのはタイトルとURLのみで、ファンクラブ会員限定コンテンツである本文の配信は行いません。
http://perfume.yurufuwa.jp/blog_feeds/このフィードは、オープンソースのCMS「Radiant CMS」と、Radiant CMSのテンプレート上で直接Rubyコードを実行できるようにするエクステンション「Back Door」を使って生成しています。
http://www.radiantcms.org/http://backdoor.rubyforge.org/■処理の流れ
- Radiant CMSがRSSリーダーからのHTTPリクエストを受け、該当するテンプレートの処理を開始。
- Back Doorによりテンプレート内のRubyコードが実行される。オフィシャルブログのHTMLを取得、必要な情報を切り出しRSS生成。
- Radiant CMSが生成されたRSSを返す。
■実装
<レイアウト「XML Feeds」作成>
Content-typeを「text/xml」として以下の内容のレイアウトを作成します。
<r:content />
<スニペット「tag_perfume_blog_feed」定義>
テンプレート中で「perfume_blog_feed」というタグでRSSを生成できるようにします。タグにするのは、複数のフィード(のっち、かしゆか、あ〜ちゃん、スタッフの各ブログ)を生成する際にRubyコードを使い回せるようにするためです。
<r:tag name="perfume_blog_feed">
require 'rubygems'
require 'hpricot'
require 'rss'
require 'open-uri'
require 'cgi'
FETCH_URL = tag.attr['url']
FEED_TITLE = tag.attr['title']
FEED_LINK = tag.attr['url']
FEED_DESCRIPTION = tag.attr['title']
# 指定されたURLのコンテンツを取得し、Stringとして返す。
def get_html(url)
result = ''
open(url) {|f| result = f.read}
end
# HTMLからblogエントリーのタイトル、URL、更新日付を取得しHashのArrayとして返す。
#
# Hashのキー: :url => blogエントリのURL, :title => タイトル, :date => 更新日付
def extract_blog_entries(html)
result = []
doc = Hpricot(html)
doc.search("div.box_cont_01").search('h4').search('a').each do |e|
url = CGI::unescape(e['href'].sub(/.*set_ref__=http%3a%2f%2f/, "http://")).gsub(/&sid=[^&]*/, "")
date = Time.parse(e.search('span').inner_html.gsub(/\./, "/"))
title = CGI::unescapeHTML(e.inner_html.gsub(/<span.*/, ''))
result.push({:url => url, :title => title, :date => date})
end
return result
end
# extract_blog_entriesで戻された情報からフィードを生成する
def generate_feed(blog_entries)
rss = RSS::Maker.make("2.0") do |maker|
maker.channel.title = FEED_TITLE
maker.channel.link = FEED_LINK
maker.channel.description = FEED_DESCRIPTION
blog_entries.each do |entry|
item = maker.items.new_item
item.title = entry[:title]
item.link = entry[:url]
item.date = entry[:date]
item.dc_date = entry[:date]
end
end
result = rss.to_s
end
html = get_html(FETCH_URL)
if html != nil then
blog_entries = extract_blog_entries(html)
xml = generate_feed(blog_entries)
end
xml
</r:tag>
<RSS出力用テンプレート作成>
以下の内容のテンプレートを作成します。下記はあ〜ちゃんのブログ(
http://www.amuse.co.jp/perfume/blog/a-chan/)のフィードの例です。
<r:snippet name="tag_perfume_blog_feed" /><r:perfume_blog_feed url="http://www.amuse.co.jp/perfume/blog/a-chan/" title="Perfume A-CHAN BLOG" />
テンプレートの「slug」はRSSっぽく「a-chan.xml」などとします。レイアウトは、前述の手順で作成した「XML Feeds」を適用します。
以上で完了です。

Radiant CMSでは一定時間コンテンツがキャッシュされます。キャッシュが有効である間は、何度アクセスしても実際にはフィード生成処理は行われずキャッシュが使用されます。HTML取得先のサーバへの負荷が軽減されるので好都合です。
Radiant CMSでレスポンスキャッシュの有効期限を変更する:
http://vividtone.seesaa.net/article/94905361.html
posted by maeda at 12:10| 島根 ☀|
Comment(3)
|
TrackBack(0)
|
ソフトウェア
|

|