2007年 03月27日(Tue) [長年日記]
_ [Webサイト][mixi][ruby]get_mixi_new_diary_rss.rb
Pragger触ってたら仕事が進まない。
それはともかく。PRaggerプラグイン Mixi新着日記プラグインというのがあったので、これをもとにしてRSS出力させてみる事にした。
最初はget_mixi_new_diary.rb→get_html.rb→custom_feed.rb→save_rss.rbとやればいいのかな、とか思ってたんだけど、良く考えるとmixiにget_htmlなんて出来ないYo!
しかもcustom_feed.rbもイマイチ使い勝手が悪いし。という事でget_mixi_new_diary.rbをベースにcustom_feed.rbあたりの処理までやってしまうものを作ってみようという事に。
- get_mixi_new_diary_rss.rb
def get_mixi_new_diary_rss(config, data)
require 'rubygems'
require 'mechanize'
require 'kconv'
require 'rss/maker'
# require 'logger'
username = config['user_id']
password = config['password']
agent = WWW::Mechanize.new {|a|
# a.log = Logger.new('access.log')
# a.log.level = Logger::DEBUG
}
page = agent.get('http://mixi.jp/')
form = page.forms[0]
form.fields.find {|f| f.name == 'email'}.value = username
form.fields.find {|f| f.name == 'password'}.value = password
form.fields.find {|f| f.name == 'next_url'}.value = '/home.pl'
page = agent.submit(form, form.buttons.first)
if /url=([^"])"/ =~ page.body
link = 'http://mixi.jp' + $1.to_s
agent.get(link)
end
data = []
diarylist = agent.get('http://mixi.jp/new_friend_diary.pl')
diarylist.links.each do |link|
diaryurl = link.href # => 'view_diary.pl?id=12345&owner_id=2345'
if /view_diary.pl\?id/ =~ diaryurl
item = ""
page = agent.get(diaryurl)
body = page.body.toutf8
comment = []
body.gsub(Regexp.new("<td CLASS=h12>(.*?)</td>",Regexp::MULTILINE)) do
comment << $1
end
name = []
body.gsub(Regexp.new("show_friend\.pl.id=\\d+\">(.*?)</a>",
Regexp::MULTILINE)) do
name << $1
end
i = 1
mydescription = comment[0]
name.each do |n|
mydescription += "<br>--<br>[#{n}]"
mydescription += "<br><br>#{comment[i]}<br>--<br>"
i += 1
end
item.instance_eval do
@description = mydescription
def description
@description
end
end
body =~ Regexp.new("<title>(.*?)</title>",Regexp::MULTILINE)
mytitle = $1
item.instance_eval do
@title = mytitle
def title
@title
end
end
body =~ Regexp.new("<td ALIGN=center ROWSPAN=2 NOWRAP
WIDTH=95 bgcolor=#FFD8B0>(\\d{4}).+?(\\d{2}).+?(\\d{2}).+?(\\d{2})
.+?(\\d{2})</td>",Regexp::MULTILINE)
mydate = Time.parse($1 + $2 + $3 + ' ' + $4 + $5 + '00')
item.instance_eval do
@date = mydate
def date
@date
end
end
mylink = 'http://mixi.jp/' + diaryurl
item.instance_eval do
@link = mylink
def link
@link
end
end
data << item
end
end
return data
end
本文はともかくコメントはどうしようか迷った挙句、適当に区切りをいれてみた。ソース自体もかなり適当。
- config.yaml
- module: get_mixi_new_diary_rss
config:
user_id: ID
password: PASS
- module: save_rss
config:
filename: mixi.rdf
link: http://mixi.jp/new_friend_diary.pl
title: mixi最新日記RSS
RSS自体はBasic認証がかけられるところに出力した方が良いと思われる。
[ツッコミを入れる]