#!/usr/bin/env ruby # kinokuniya.rb ver.0.3 2002.4.7-2002.4.27, 2003.1.20 require 'net/http' require 'cgi' #require 'simpleuri' #require 'webagent' class CacheBib_kinokuniya < CacheBib attr_accessor :isbn attr_accessor :flag_review #, :affiliate_code attr_accessor :url_site attr_accessor :title, :author, :publisher, :pubdate, :price, :desc attr_accessor :image, :limage, :translator attr_accessor :e_title, :e_author, :title_kana,:sizetype, :genre, :series attr_accessor :size, :sizetype attr_accessor :reviews, :reviewlist attr_accessor :insystemKcode, :outputKcode, :messageKcode def initialize () super @reviews = Array.new() @flag_review = true @url_site = 'http://bookweb.kinokuniya.co.jp/' @insystemKcode = 3 #sjis #1-jis,2-euc,3-sjis @outputKcode = 2 #euc @messagetKcode = 3 #sjis end #===== ===== parts ===== ===== def word_delivery () delivery = '' flag = false # title-check -> no-info / get-info check if !@title.nil? flag = true if @delivery.nil? delivery = "‚È‚¢" else delivery = @delivery if @delivery =~ /‚S/s delivery = "4“ú" elsif @delivery =~ /•iØ‚ê‚Ìꇂ¨Žæ‚èŠñ‚¹/s delivery = "ŽæŠñ?" elsif @delivery =~ /û”/s #parse-error delivery = "ŽæŠñ" else delivery = '?' end end else message = "WAR; maybe data-error, no-title." @stderr.puts message.kconv(@messageKcode) end return delivery, flag end #===== ===== url ===== ===== def url_bibinfo () url = @url_site + "guest/cgi-bin/wshosea.cgi?W-ISBN=#{@isbn.delete('-').upcase}" return url end #===== ===== parse ===== ===== def parse_bibinfo (str) #----- set key and data ------ mode_tbl = { :title => '˜a‘Ѓf[ƒ^ƒx[ƒXŒŸõŒ‹‰Ê', # + title_kana + series :e_title => '\[Œ´‘–¼F', # + e_author :image => '', :stock => '
', # + delivery + nip_cd :author_comment => '\[BOOK’˜ŽÒЉîî•ñ\]' # :review => '/ data_title = $'.strip end if data_title =~ /([^>]+?)<\/small>/m @title_kana = $1 data_title = $'.strip @title_kana.strip! @title_kana.gsub!(/\s+/s, ' ').to_s.strip! end if data_title =~ /(.+?)([^>]+?)<\/b>/m @series = $1.strip @title = $2.strip @series.gsub!(/<[^>]+>/,'').strip! @series = nil if @seires.to_s.size == 0 @title.strip! end if data[:e_title] =~ /([^>]+?)<\/b>/ @e_title = $1.strip if @e_title =~ /(.+?)q(.+?)r/ @e_title = $1.strip @e_author = $2.strip end end if data[:image] =~ // @isbn = $1 end if data[:main] =~ // data_name = $& data_name.scan(//) { |str| name = str.gsub(/<[^>]+>/,'').strip if str =~ /y–óz/ if @translator.nil? then @translator = '' else @translator << "\t" end @translator << name.chomp('y–óz') else if @author.nil? then @author = '' else @author << "\t" end @author << name.chomp('y’˜z') end } end if data[:main] =~ /\[.+?\(Å•Ê\)<\/b>/s data_info = $& if data_info =~ /\[(.+?)\].+?(.+?)<\/b>.+?(.+?)<\/b>/ @sizetype = $1 @genre = $2 @price = $3 end end if !data[:main].nil? data[:main].split("
").each { |word| if word =~ /(‚|‚ƒ‚)/s @size = word.gsub(/<[^>]+>/,'').strip end if word =~ /o”Å/s str = word.gsub(/<[^>]+>/,'').strip @publisher = str.gsub(/\s+/,' ').strip @pubdate = str.gsub(/\s+/,' ').strip if str =~ /\d/ @publisher = $`.gsub(/\s+/,' ').strip.chomp('(').strip end if str =~ /[\d\/\-]+/ @pubdate = $&.gsub(/\s+/,' ').strip end end } @etc = data[:main].gsub(/
.+?$/mi,'').gsub(/<[^>]+>/,'').strip.gsub(/\s+/,' ') if data[:main] =~ /color=\"green\">([^<]+)/i @stock = $1.strip if @stock =~ /(.+B)(.+?B)/s @stock, @delivery = $1.strip, $2.strip end end end =begin data_size = data[:size].split('
') @size = data_size[0].gsub(/<[^>]+>/,'').strip if data_size[1] =~ /(.+)\((.+oӁ)\)/ @pulisher = $1.gsub(/<[^>]+>/,'').strip @pubdate = $2 end =end if data[:content] =~ /.+?<\/td>/ @desc = $&.strip.gsub(/
/,"\t").gsub(/<[^>]+>/,'').strip end if data[:stock] =~ // @nip_cd = $1 end # if data[:stock] =~ // # @isbn = $1 # end if data[:stock] =~ /<\/form>/ data_stock = $` if data_stock =~ /.+?/m data_stock = $& end stock = data_stock.gsub(/<[^>]+>/,'').strip if stock != '' @stock = stock @delivery = @stock if @stock =~ /B/ @stock = ($` + $&).strip @delivery = $'.strip end end end if data[:author_comment] =~ /.+?<\/td>/ @author_intro = $&.gsub(/<[^>]+>/,'').strip end =begin reviewsplit = data[:review].to_s.split(mode_tbl[:review]) reviewlist = [] reviewsplit.each { |column| if column =~ /cust_id=(.+?)'/ custid = $1 reviewlist << custid end if column =~ /(.+?)“X’·/ custid = $1.strip reviewlist << custid end } @reviewlist = reviewlist.join("\t") if reviewlist.size > 0 if @flag_review reviewsplit.each{ |column| review = {} if column =~ /cust_id=(.+?)'/ review["cust_id"] = $1 end if column =~ /(.+?)“X’·‚Ìw(.+?)xƒR[ƒi[/s review["reviewer"] = $1.strip review["corner"] = $2.strip end if column =~ /#{review["reviewer"]}\s*\[(.+?)\]\s*|\s*(.+?“ú)(.+?)<\/td>/s review["value"] = $1 review["date"] = $2 review["content"] = $3 review["content"].gsub!(/^<.+?>/,'').strip! review["content"].gsub!(/\r/,'') review["content"].gsub!(/\n/,"\t") end @reviews << review if review.size > 0 } end =end end #===== ===== main ===== ===== def set_info #===== set local-value from @info (from cache) ===== #----- set book-info (from cache) ----- @flag_overprint = true if @info["overprint"] @isbn = @info["isbn"] unless @info["isbn"].nil? @title = @info["title"] @delivery = @info["delivery"] end def get_info #===== get book-info(@info) from url ===== message = 'CHK; access; ' + @url_site + ' -> ' + @isbn @stderr.puts message.kconv(@messageKcode) #----- get book-info ----- agent = WebAgent.new() agent.uri = url_bibinfo begin agent.get() body = agent.body.kconv(@insystemKcode) parse_bibinfo(body) rescue end if !@flag_overprint @info = {} end @info["isbn"] = @isbn @info["title"] = @title @info["author"] = @author @info["publisher"] = @publisher @info["pubdate"] = @pubdate @info["price"] = @price @info["desc"] = @desc @info["image"] = @image @info["translator"] = @translator @info["nip_cd"] = @nip_cd @info["image"] = @image @info["limage"] = @limage @info["e_title"] = @e_title @info["e_author"] = @e_author @info["title_kana"] = @title_kana @info["series"] = @series @info["size"] = @size @info["sizetype"] = @sizetype @info["genre"] = @genre @info["stock"] = @stock @info["delivery"] = @delivery @info["author_intro"] = @author_intro @info["etc"] = @etc @info["reviewlist"] = @reviewlist @info["overprint"] = true if @flag_overprint if @flag_review @info["reviews"] = @reviews end end end