mixiの日記のバックアップを取ってみる

広告

この前の証券ランキングはソースコードを貼ると崩れたけど、これは上手く貼れるようなのでネタにしてみます。

mixiの日記のバックアップを取る

最近、iPhoneを買ったもので、mixiをiPhoneで快適に使うソフト作りたいなあなんて思っています。その関連で、mixiの日記をゴリゴリする練習をしてみました。今回はXPathの練習です。XPathを使うとhtmlから欲しい部分だけ取り出すことが簡単になります。XPathは自分で書いてもいいけど、FirefoxのアドオンにFirebugというのがあるので、それを使うと簡単です。

firebug

FirebugでDOMツリーっていうのかな、それを見ていくと該当の部分が青く反転するので、必要な場所を絞り込んでいきます。最後に、右クリックをして「XPathをコピー」を選んでやると、XPathを入手できます。

xpath

ソースコード中のsearchでXPathを探しています。この謎の文字列がXPathというわけです。

#!/usr/local/bin/ruby -Ku
require 'rubygems'
require 'mechanize'
require 'nokogiri'

# 簡易待ち付きget
def get(url)
	sleep(10)
	$agent.get(url);
	$agent.page.encoding = "UTF-8"
end

#変数
owner_id = 自分のID(他人でもできるらしい)
diary_url = "http://mixi.jp/list_diary.pl?id=#{owner_id}"

# mixiのトップページにアクセス
$agent = WWW::Mechanize.new
$agent.get("http://mixi.jp/")
$agent.page.encoding = "UTF-8"

# ログイン
$agent.page.form_with(:name => "login_form" ) do |f|
	f.field_with(:name => 'email').value = "ログインメアド"
	f.field_with(:name => 'password').value = "パスワード"
	f.click_button
end

# 日記トップを取得
get(diary_url)
diary = $agent.page.search('/html/body/div[2]/div/div[3]/div[3]/div[2]').to_s
diaries = diary.scan(/<li>.*?¥"(.*?)¥".*?¥"(.*?)¥".*?li>/)

diaries.each do |d|
	each_diary = "http://mixi.jp/#{d[0]}"
	puts "#{d[1]}を処理"
	Dir::mkdir(d[1])
	Dir::chdir(d[1])

	get(each_diary)
	diary_list = $agent.page.search('//*[@id="bodyMainAreaMain"]').to_s
	entrirs = diary_list.scan(/<dt>.*?¥"(view_diary.*?)¥">(.*?)</)

	entrirs.each do |e|
		entry_url = "http://mixi.jp/#{e[0]}"
		get(entry_url)
		contents = $agent.page.search('//*[@id="bodyMainAreaMain"]').to_s
		f = open(e[1] + ".html",'w')
		f.puts "<html>"
		f.puts "<head>"
		f.puts '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'
		f.puts "</head>"
		f.puts "<body>"		
		f.puts contents
		f.puts "</body>"
		f.puts "</html>"
		f.close
	end

	Dir::chdir("../")
end


やっぱ正規表現使っているところは崩れているなぁ。ここは単にURLとかタイトルを取り出しています。

あとはHTMLタグ書き出しあたりも消えてる。mechanizeを使うとUTF-8がデフォルトになるらしい(正確にはnokogiriというHTMLパーサの仕様)ので、HTMLをそのまま書き出すと文字化けします。UTF-8のヘッダを捏造してやって、バックアップ完了かな。

追記

「<」とか「>」とかバックスラッシュを全角に置き換えたところ、化けは収まりました。

mixiにはAPIがあるので、そっちを使った方がよいかも知れません。

追記2

バグというのは結構あるもんで、ファイル名に”/”が混じると止まるため、それをgsubで置換しないといけません。

広告