#!/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