#!/usr/bin/env ruby # skysoft.rb ver.0.1 2002.4.8-2003.1.20 require 'net/http' require 'cgi' #require 'simpleuri' #require 'webagent' class CacheBib_skysoft < 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, :translator, :delivery attr_accessor :genre, :point, :category, :category_code, :size, :etc attr_accessor :reviews, :reviewlist attr_accessor :insystemKcode, :outputKcode, :messageKcode def initialize () super @reviews = Array.new() @flag_review = true @affiliate_code = nil @url_site = 'http://www.skysoft.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 if @delivery =~ /23/ delivery = "23時間" elsif @delivery =~ /2\-3/ delivery = "2〜3日" elsif @delivery =~ /4\-14/ delivery = "4〜14日" elsif @delivery =~ /取寄/ 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 + 'NewSkysoft/GetTitleDetail.asp?' url << 'Userid=' + @affiliate_code + '&' if !@affiliate_code.nil? url << "ISBN=#{@isbn.delete('-').upcase}" return url end #===== ===== parse ===== ===== def parse_bibinfo (str) #----- set key and data ------ mode_tbl = { :title => '--左側メニュー部分の終了--', :genre => '', :image => '', :author => '著者:', :price => '本体価格 :', :point => 'ページプラス
ポイント\(\*1\) :', :delivery => '納期情報\(\*2\) :', :publisher => '出版社 :', :isbn => 'ISBN :', :pubdate => '発行日 :', :category => 'カテゴリー :', :size => '寸法 :', :etc => 'その他の情報', :content => '内容紹介', :none => '' # :review => ']+>/,'').strip if data[:genre] =~ // @genre = $1.strip end if data[:image] =~ /').each { |line| name = line.gsub(//,'').gsub(/<[^>]+>/,'').strip # @author = name if name.to_s.size > 0 if name =~ / 著$/ @author = name.sub(/ 著$/,'').sub(/ +$/,'').strip elsif name =~ / 訳$/ @translator = name.sub(/ 訳$/,'').sub(/ +$/,'').strip end } if data[:price] =~ /(.+?)<\/B>/ @price = $1 end if data[:point] =~ /(.+?)<\/B>/ @point = $1 end if data[:delivery] =~ /(.+?)<\/B>/ @delivery = $1 end @publisher = data[:publisher].to_s.sub(/#{mode_tbl[:publisher]}/s,'').gsub(/<[^>]+>/,'').strip @isbn = data[:isbn].to_s.sub(/#{mode_tbl[:isbn]}/s,'').gsub(/<[^>]+>/,'').strip @pubdate = data[:pubdate].to_s.sub(/#{mode_tbl[:pubdate]}/s,'').gsub(//,'').gsub(/<[^>]+>/,'').strip if !data[:category].nil? if data[:category] =~ /(.+?)<\/B>/ @category = $1 end if data[:category] =~ /Category=([^"]+)/ @category_code = $1 end end if !data[:size].nil? @size = data[:size].to_s.sub(/#{mode_tbl[:size]}/s,'').gsub(/<[^>]+>/,'').strip end etc = data[:etc].to_s.sub(/#{mode_tbl[:etc]}/s,'').gsub(//,'').gsub(/<[^>]+>/,'').strip @etc = etc if etc.size > 0 if !data[:content].nil? @desc = data[:content].to_s.sub(/#{mode_tbl[:content]}/s,'').gsub(/<[^>]+>/,'').strip.gsub(/^ +/,'').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 =~ /(.+?)店長/ 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 =~ /(.+?)店長の『(.+?)』コーナー/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["delivery"] = @delivery @info["genre"] = @genre @info["point"] = @point @info["category"] = @category @info["category_code"] = @category_code @info["size"] = @size @info["etc"] = @etc @info["reviewlist"] = @reviewlist @info["overprint"] = true if @flag_overprint if @flag_review @info["reviews"] = @reviews end end end