日暮途遠(Linux)

Just another WordPress.com site

Bloggerの記事一覧を取得するRubyスクリプト

leave a comment »

lifeLOG + REPOsitory: Blogger で作ったブログの記事一覧を作成する http://logrepo.blogspot.jp/2010/09/blogger.html を参考にさせてもらいました。

HTMLのヘッダ作成部分はコメントアウトで無効にしています。ブログの記事に貼り付けるコピペ用です。

次のようにすると結果出力のコードをクリップボードに格納できます。Linux環境でxselコマンドをインストールしてある必要があります。コマンド名がパッケージ名そのままなのでapt-getでも簡単にインストールできます。

./スクリプトのファイル名.rb | xsel -b

実行属性をつけていない場合
ruby スクリプトのファイル名.rb | xsel -b

#!/環境に応じたrubyへのパス/bin/ruby -w
# -*- coding: utf-8 -*-

# get_titles.rb: get post tiltes from Blogger RSS feed.

require 'net/http'
require 'uri'
require 'rss'

BLOGID = "ブログID"

def get_rss(start_index = 1)
 url = URI.parse('http://www.blogger.com/')
 res = Net::HTTP.start(url.host, url.port) { |http|
 http.get("/feeds/#{BLOGID}/posts/default?alt=rss&start-index=#{start_index}")
 }
 res.body
end

current_post = 0
total_posts = 0

posts = Array.new

# get first page & extract total number of posts.
raw_data = get_rss(1)
/<openSearch:totalResults>(\d+)<\/openSearch:totalResults>/ =~ raw_data
total_posts = Regexp.last_match[1].to_i
rss = RSS::Parser.parse(raw_data, false)
rss.channel.items.each { |item|
 posts.push item
}

current_post += rss.channel.items.length

# get more pages
while current_post < total_posts
 rss = RSS::Parser.parse(get_rss(current_post + 1), false)
 rss.channel.items.each { |item|
 posts.push item
 }

current_post += rss.channel.items.length
end
# construct output HTML page.
=begin
STDOUT.print <<HTML1
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
<title>Blog Posts</title>
</head>
<body>
<p>Total Posts: #{total_posts}</p>
HTML1
=end

STDOUT.print <<BODY1
<div class="list">
<h2>Entry List</h2>
<table style="border="0">
BODY1

item_no = 1
posts.reverse!

posts.each { |item|
 STDOUT.puts "<tr><td style=\"margin-right:10px; background-color: #D8D8D8;\">No:#{item_no}</td><td><a href='#{item.link}'>#{item.title}</a></td></tr>"
 item_no = item_no + 1
}

STDOUT.print <<BODY2
</table>
</div>
BODY2

=begin
STDOUT.print <<HTML2
</body>
</html>
HTML2
=end

Rubyのコードをシンタックスハイライトしていますが、HTMLが含まれるためコピペしただけでは動作しないかもしれないです。ざっと見たところでは問題なさそうですが。

Written by 廣野秀樹

2012年5月21日 @ 12:00 午前

カテゴリー: Ruby

Tagged with , ,

コメントを残す