2009年08月26日

backup_raku.rb

#!/usr/bin/ruby
######################################
#
# Backup of Rakuten Blog
#
# 2009/08/19 Yasuki
#
######################################

# targetUrlは、本プログラムが最初に取得するブログエントリ
# です。このURLを起点として、「次へ>>」というリンクをたどり、
# 最後までブログエントリを自動で取得します。
targetUrl="http://plaza.rakuten.co.jp/ffr31mr/diary/200506060000/"

# blogの作者名を入れてください。
blogAuthor="yasuki"

# 画像を保存するローカル側のディレクトリ名を入れてください
imageDir="images"

# 画像へのリンクをローカルに保存したファイルに変更するかしない
# かを選択します。
# 0-->変更しない
# 1-->変更する
imageLinkUpdate=0

# ダウンロードするファイルが重複していたときの動作をきめます。
# 0-->ファイル重複があったら上書き
# 1-->ファイル重複があったら停止
imageFileDuplicateCheck=0

###################################################
# 以下は、変更しないでください。
###################################################
require 'kconv'
require 'hpricot'
require 'open-uri'
require 'date'

# 本文、コメント、トラックバックに共通にもっている
# 項目をクラス定義
class BlogItem
def initialize()
@date=nil
@body=nil
end
def setDate( str_date )
@date=Date.strptime(str_date, "%B %d, %Y")
end
def setBody( body )
# body=body.gsub("---","===")
@body=body
end
def getDate
printf("DATE: %s\n",@date.strftime("%m/%d/%Y %H:%M:%S"))
end
def getBody
printf("BODY:\n%s\n",@body)
end
end

# トラックバックのクラス定義
class Trackback < BlogItem
def initialize()
@pingtitle=nil
@pingurl=nil
@pingblogname=nil
end

def setPingTitle( str_title )
@pingtitle=str_title
end
def setPingUrl( str_url )
@pingurl=str_url
end
def setPingBlogName( str_name )
@pingblogname=str_name
end
def getPingTitle()
printf("TITLE: %s\n",@pingtitle)
end
def getPingUrl()
printf("URL: %s\n",@pingurl)
end
def getPingBlogName()
printf("BLOG NAME: %s\n",@pingblogname)
end
def getAll()
printf("-----\n")
printf("PING:\n")
getPingTitle()
getPingUrl()
printf("IP:\n")
getPingBlogName()
getDate()
getBody()
end
end

# コメントのクラス定義
class Comment < BlogItem
def initialize()
@commauthor=nil
end
def setCommAuthor( str_author )
@commauthor=str_author
end
def getCommAuthor
printf("AUTHOR: %s\n",@commauthor)
end
def getAll()
printf("-----\n")
printf("COMMENT:\n")

getCommAuthor()
printf("EMAIL:\n")
printf("IP:\n")
printf("URL:\n")
getDate()
printf("SECRET: 0\n")
printf("PASS:\n")
getBody()
end
end

# ブログエントリのクラス定義
class Entry < BlogItem
def initialize()
@title=nil
@author=nil
@category=nil
end
def setTitle( str_title )
@title=str_title
end
def getTitle
printf("TITLE: %s\n",@title)
end
def setAuthor( str_author )
@author=str_author
end
def getAuthor
printf("AUTHOR: %s\n",@author)
end
def setCategory( str_category )
@category=str_category
end
def getCategory
printf("PRIMARY CATEGORY: %s\n",@category)
printf("CATEGORY: %s\n",@category)
end
def getAll()
printf("--------\n")
getTitle()
printf("STATUS: Publish\n")
printf("CONVERT BREAKS: 0\n")
printf("ALLOW COMMENTS: 1\n")
printf("ALLOW PINGS: 1\n")
getAuthor()
getCategory()
getDate()
printf("-----\n")
getBody()
printf("-----\n")
printf("EXTENDED BODY:\n")
printf("\n")
printf("-----\n")
printf("EXCERPT:\n")
printf("\n")
printf("-----\n")
printf("KEYWORDS:\n")
printf("\n")
end
end

# Arrayクラスに複数要素取得のメソッドを追加定義
class Array
def every(&block)
arity = block.arity
return self.each(&block) if arity <= 0

i = 0
while i < self.size
yield(*self[i, arity])
i += arity
end
self
end
end

# hpricotの検索で、大文字小文字を区別しない
# by http://d.hatena.ne.jp/tech-kazuhisa/20090618/1245337521
class Hpricot::Elem
def attributes
if raw_attributes
raw_attributes.inject({}) do |hsh, (k, v)|
hsh[k.downcase] = Hpricot.uxs(v) #hashのkeyを小文字に変換
hsh
end
end
end
end

# targetUrlを要素に分割
targetArray=targetUrl.split("/")
targetHost=targetArray[2]
targetId=targetArray[3]
targetEntry=targetArray[4]+"/"+targetArray[5]

# imagesを保存するディレクトリの有無確認
if !FileTest.exist?(imageDir) then
Dir::mkdir(imageDir)
end

# エントリの取得ループ開始
e=Entry.new
loop {
nextUrl=nil
doc = Hpricot( open(targetUrl).read ) # Get Blog Entry
#
# Get Next Link
#
(doc/:a).each do |link|
if ( "#{link.inner_html}".index(">>") ) then
nextUrl="http://" + targetHost + "#{link[:href]}"
targetUrl=nextUrl
end
end
#
# Author is constant
#
e.setAuthor(blogAuthor)
#
# Get Title
#
(doc/:meta).each do |meta|
if ("#{meta[:content]}" != "text/html; charset=EUC-JP" ) then
e.setTitle(Kconv.kconv("#{meta[:content]}",Kconv::UTF8))
end
end
#
# Get Date of Blog Entry
#
blogdate=doc.search("b").first
blogdate=blogdate.to_s[3..((blogdate.to_s).length-5)]
e.setDate(blogdate)
#
# Get Categoly
#
cate=doc.search("div.cate_list").inner_html
cate=Kconv.kconv(cate,Kconv::UTF8)
cate=cate[2..cate.index("]").to_i-2]
e.setCategory(cate)
#
# Get Blog Body
#
body=doc.search("div.lo")[0].inner_html
body=Kconv.kconv(body,Kconv::UTF8)
end_body=body.index("<div align=\"right\">").to_i
body = body[2..end_body-1]
#
# Get Image Files
#
body=Hpricot(body)
imagefile=""
filename=""
body.search("img").each do |im|
imagefile=im.attributes["src"]
if imagefile.index("image.space.rakuten.co.jp") then
ifn=imagefile.split("/")
filename=imageDir + "/" + ifn[ifn.length-1].to_s
if (filename[filename.length-4..filename.length]=="jpeg" or filename[filename.length-3..filename.length]=="jpg") then
open(imagefile) do |jp|
#
# image fileの上書きを禁止する
if imageFileDuplicateCheck==1 then
if FileTest.exist?(filename) then
printf("image file exist.(%s)\n",im)
exit
end
end
File.open(filename, "wb") do |fp|
fp.write(jp.read)
end
end
#
# 画像リンクをダウンロードしたローカルファイルに指定しなおす
if imageLinkUpdate==1 then
b=body.to_html
b[b.index(imagefile),imagefile.length]=filename
body=Hpricot(b)
end
end
end
end
#
# 最終的な本文をオブジェクトに保存
#
e.setBody(body.to_html)
#
# Get Comments
#
ci=0
commArray=Array.new
cbody=doc.search("/html/body").inner_html.to_s
cbody=Kconv.kconv(cbody,Kconv::UTF8)

while (cbody.include?("<!-- bbs -->")) do
c=Comment.new
startComment=cbody.index("<!-- bbs -->")
endComment=cbody.index("<!-- /bbs -->")
comm=Hpricot(cbody[startComment..endComment+13])

commTitle=comm.search("/table/tr/td")[0].inner_text.strip
commAuthor=comm.search("/table/tr/td")[1].inner_text.strip
c.setCommAuthor(commAuthor)

comm.search("div.lo").each do |commBody|
commBody=commBody.inner_html
end_body=commBody.index("<div align=\"right\">").to_i
commBody=commBody[0..end_body-1].strip

dateStart=commBody.rindex("(")
dateEnd=commBody.rindex(")<br />")
commDate=commBody[dateStart+1..dateEnd-1]

c.setDate(commDate)
c.setBody(commTitle+"\n"+commBody)
end
commArray[ci]=c

cbody=cbody[endComment+14..cbody.length]
ci += 1
end
#
# Get Trackback
#
pingArray=Array.new
pbody=doc.search("/html/body").inner_html.to_s
pbody=Kconv.kconv(pbody,Kconv::UTF8)

pi1=0
if (pbody.include?("<a name=\"trackback\">")) then
startTrackback=pbody.index("<a name=\"trackback\">")
endTrackback=pbody.rindex("<!-- \/Center Column -->")

ping=Hpricot(pbody[startTrackback..endTrackback-13])

ping.search("/table/tr/td").every do |pingTitle,pingBlogName|
p=Trackback.new
pT=Hpricot(pingTitle.to_s)
pBN=Hpricot(pingBlogName.to_s)
p.setPingTitle(pT.search("a").inner_text)
p.setPingBlogName(pBN.search("a").inner_text)
p.setPingUrl(pT.search("a.href"))
pingArray[pi1]=p
pi1 += 1
end

pi2=0
ping.search("div.lo").each do |pingBody|
pingBody=pingBody.inner_html
pingArray[pi2].setBody(pingBody)

dateStart=pingBody.rindex("(")
dateEnd=pingBody.rindex(")")
pingDate=pingBody[dateStart+1..dateEnd-1]
pingArray[pi2].setDate(pingDate)

pi2 += 1
end


pbody=pbody[endTrackback+14..pbody.length]
end

# Output Blog Entry of MT Format
e.getAll()

#
# If the entry have comments?
# then output comments
if ( ci>0 ) then
commArray.each do |i|
i.getAll()
end
end

#
# If the entry have trackback?
# then output trackbacks
if ( pi1>0 ) then
pingArray.each do |i|
i.getAll()
end
end

#
# Is a final entry?
if (nextUrl==nil) then
break
end
}


sylphide_ffr31mr at 22:39コメント(5)トラックバック(0)programing  

トラックバックURL

コメント一覧

1. Posted by ray ban sunglass   2010年05月23日 14:17
1 Of course, what a great site and informative posts, I will add backlink – bookmark this site? Regards, Reader.
2. Posted by tour guides in St.Petersburg   2011年08月30日 14:05
1 私は長すぎる前にブログを開始していないて、このウェブサイト上であなたが提供する知識は、途方もなく私を助けている。あなたの全体の時間&仕事をありがとう。
3. Posted by デカdurabolinを購入する   2011年10月18日 01:07
1 私はここで読んで有益なの一人一人を非常に感謝しています。私は最も確かに人々とあなたのサイトについてのフレーズを分散します。乾杯。
4. Posted by SLT-A65   2011年11月18日 07:11
1 事前と幸運に感謝します! : )
5. Posted by buy anabolics   2011年11月18日 19:56
1 あなたは本当にインターネット上で最高のブログの一つのためにトーナメントに参加する必要があります。私はこのブログをお勧めしますよ!

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
プロフィール

やすき

月別アーカイブ
  • ライブドアブログ