#!/usr/bin/env ruby
# rakuten.rb
# ISBN-search -> detail-parse
# original; isbn2bib.rb for bk1 by takahashi
# ver.0.1 2003.8.27
# ver.0.2 2003.12.22-2004.01.05 新cacheに変更
#ISBNで引いた時の情報・ジャンル情報
#review
#以上、やり残し
if __FILE__ == $0
require 'cookie'
require 'webagent'
require 'cache'
require 'cachebib'
end
class CacheBib_rakuten < CacheBib
attr_accessor :recommend
def initialize ()
super
@shop_id = 'rak'
@url_site = 'http://books.rakuten.co.jp/'
# @affiliate_code = '0005da7d.02b79257'
@affiliate_code = '000ebbff.61c65a2b'
end
#===== ===== parts ===== =====
def word_delivery ()
delivery = ''
flag = false
if !@title.nil? # title-check -> no-info / get-info check
flag = true
if @delivery.nil?
delivery = "ない"
else
if @delivery =~ /1〜3/
delivery = "1〜3日"
elsif @delivery =~ /1〜7/
delivery = "1〜7日"
elsif @delivery =~ /1〜14/
delivery = "1〜14日"
elsif @delivery =~ /在庫確認/
delivery = "取寄"
elsif @delivery =~ /予約受付中/
delivery = "予約受付"
elsif @delivery =~ /予約受付終了/
delivery = "予約終了"
elsif @delivery =~ /品切れ/
delivery = "品切"
elsif @delivery =~ /絶版/
delivery = "絶版"
else
delivery = "?"
end
end
else
message("WAR; maybe data-error, no-title.")
end
return delivery, flag
end
#===== ===== url ===== =====
def url_isbnsearch ()
url = @url_site + "bsearch/RBtitles.jsp?KEY=#{@isbn}"
return url
end
def url_bibinfo ()
url = @url_site + "RBOOKS/NS/CSfLastGenGoodsPage_001.jsp?GOODS_NO=#{@id}"
url = %Q|http://pt.afl.rakuten.co.jp/c/#{@affiliate_code}/?url=#{url}| if !@affiliate_code.nil?
return url
end
#===== ===== parse ===== =====
def parse_isbnsearch ( str )
count = []
str.each{ |line|
if line =~ %r||
count << $1 unless $1.nil?
end
}
if count.uniq.size > 1
message("WAR; ISBN-search hit multi-column. ISBN; #{@isbn}")
end
@id = count.first
return count
end
def parse_bibinfo ( str )
#----- set key and data ------
mode_tbl = {
:title => '■<\/font>サイトマップ',
:author => '著者:',
:publisher => '出版社:',
:isbn => 'ISBN:',
:pubsize => 'サイズ:',
:pubdate => '発行年月:',
:price => '本体価格:',
:delivery => '
'',
:desc => '',
:index => '',
:recommend => '',
:none => ''
# :index => '【目次】<\/font>'
# :genre => '■ジャンル名',
# :reader => '読者対象',
# :delivery => '■発送可能時期',
# :content => '【本の内容】',
# :content2 => '【出版社からのコメント】',
# :review => ' 0
str.shift
end
str.each{|line|
l = line.chomp.chomp("\r").kconv(@insystemKcode)
mode_tbl.each{ |key,keydata|
mode = key if /#{keydata}/mis =~ l
}
if mode != :none
if data[mode]
data[mode] << l
else
data[mode] = l
end
end
}
#----- parse -----
if !data[:title].nil?
if data[:title] =~ /
(.+?)<\/b>/i
@title = $1.gsub(/\s+/,' ').gsub(/<[^>]+>/,'').strip
end
if data[:title] =~ /.+?<\/b>(.+)/i
dat = $1.split('
')
dat.each_index{ |i|
dat[i] = data[i].to_s.gsub(/\s+/,' ').gsub(/<[^>]+>/,'').strip
}
dat.delete('')
@label = dat.pop if dat.size > 0
@series = dat.pop if dat.size > 0
end
# if data[:title].gsub(/\s+/,' ').gsub(/<[^>]+>/,'').strip =~ /#{@title}(.+)/s
# @label = $1.strip
# end
end
if !data[:author].nil?
data[:author] =~ Regexp.new(":(.*)")
@author = $1.gsub(/\s+/,' ').gsub(/<[^>]+>/,'').strip if !$1.nil?
if @author =~ /^(.+)/(.+?)$/s
@author, @translator = $1.strip, $2.strip
end
end
data[:publisher] =~ Regexp.new(":(.*)")
@publisher = $1.gsub(/<[^>]+>/,'').strip if !$1.nil?
data[:isbn] =~ Regexp.new(":(.*)")
@isbn = $1.gsub(/<[^>]+>/,'').strip if !$1.nil?
data[:pubsize] =~ Regexp.new(":(.*)")
@pubsize = $1.gsub(/\s+/,' ').gsub(/<[^>]+>/,'').strip if !$1.nil?
if @pubsize =~ /(.+?)/(.+?p)/s
@pubsize, @page = $1.strip, $2.strip
end
data[:pubdate] =~ Regexp.new(":(.*)")
@pubdate = $1.gsub(/\s+/,' ').gsub(/<[^>]+>/,'').strip if !$1.nil?
data[:price] =~ Regexp.new(":(.*)")
@price = $1.gsub(/\s+/,' ').gsub(/<[^>]+?>/,'').strip if !$1.nil?
data[:delivery] =~ Regexp.new(":(.*)")
@delivery = data[:delivery].gsub(/<[^>]+?>/,'').strip if !data[:delivery].nil?
if @delivery =~ /^(.+)購入/
@delivery = $1.strip
end
if !data[:desc].nil?
data[:desc] =~ %r|(.+?)|
@desc = $1.to_s.gsub(/<[^>]+>/,'').strip if !$1.nil?
end
if !data[:index].nil?
data[:index] =~ %r|(.+?)|mi
@index = $1.to_s.gsub(/<[^>]+>/,'').strip if !$1.nil?
end
if !data[:recommend].nil?
recommend = []
reclist = data[:recommend].split(//)
reclist.shift
reclist.each{ |block|
if block =~ %r|(.+?)|mi
rec = []
dat = $1.strip.split('
')
if dat[0] =~ /GOODS_NO=(\d+)/
rec << $1
end
dat.each_index{ |i|
dat[i] = dat[i].to_s.gsub(/<[^>]+>/, '').gsub(/\s+/, ' ').strip
}
dat.delete('')
rec << dat
recommend << rec
end
}
@recommend = recommend.flatten.join("\t") if recommend.size > 0
end
end
def set_info #===== set book-info(@info) from local-value =====
super
#----- set info add ----- #rakuten独自の情報類
@info["recommend"] = @recommend
end
end
if __FILE__ == $0
p CacheBib_rakuten.new.get_data('4-15-010739-4')
end