Amazon_shopver='$Id: amazon_shop.rb,v 1.4 2004-02-01 23:56:03+09 waka Exp waka $'.split(" ")[2]
# http://www.double-red.net/
=begin
日記中に
(@DVD:BCBA-0618)
(@CD:AMCY-7125)
みたいな
(@DVD:背表紙にある記号)
(@CD:背表紙にある記号)
という形式の文字列があると
amazon から書誌、DVD,CDの情報やら書影、ジャケット画像、商品画像やらを引っ張ってきて置き換えます。
www.amazon.co.jp が取り扱っている以下の商品に対応しています。
(基本的に ASIN で指定すれば確実です)
本 (@ASIN:ASIN) もしくは (@ISBN:ISBN)
洋書 (@ASIN:ASIN) もしくは (@ISBN:ISBN)
エレクトロニクス (@ASIN:ASIN)
ホーム&キッチン (@ASIN:ASIN)
ミュージック(CD) (@ASIN:ASIN) もしくは (@CD:背表紙にある記号)
DVD/ビデオ (@ASIN:ASIN) もしくは (@DVD:背表紙にある記号)
ソフトウェア (@ASIN:ASIN)
ゲーム (@ASIN:ASIN)
ゲームは ASIN の他に以下の書式が利用できます
・PlayStation (@PS:背表紙にある記号)
・PlayStation2 (@PS2:背表紙にある記号)
・GAMECUBE (@GC:背表紙にある記号)
・GAME BOY ADVANCE (@GBA:背表紙にある記号)
・Xbox (@XBOX:背表紙にある記号)
@@仕様-----------------------------------------------------------
ruby 1.8.x 以上推奨
※ ruby 1.6.x で利用する際には
※ yaml.rb(http://yaml4r.sourceforge.net/)をインストールしてください。
http://prdownloads.sourceforge.net/yaml4r/syck-0.42.tar.gz?download
が最新のようです(2004-01-27現在)
@@キャッシュディレクトリ設定------------------------------------
ndiary.conf の LOG_DIRECTORY で指定したディレクトリに
amazon_shop
というディレクトリを作っておくと取得したデータをキャッシュしておくようになります。
キャッシュの有効期限もスクリプト内で指定しているので必要に応じて変更してください。
※ amazondvd.rb を利用していた方へ。(必読)
amazondvd.rb 上位互換です。
設定も同一です。特に変更するような追加設定項目は今のところありません。
amazondvd.rb のキャッシュがそのまま利用可能できます。
amzcacheDVD の中身を amazon_shop へコピーすれば利用可能です。
書式も同一です。過去の日記を書き直す必要はありません。
※ただし、amazon_shop.rb のキャッシュは amazondvd.rb では利用できません。
@@キャッシュ保持期間--------------------------------------------
キャッシュの有効期限を指定できます。
ndiary.conf にて
変数 AMAZON_CACHE_EXPIRE に日数(正の整数)を指定してください。
(0は無期限)
(例)
AMAZON_CACHE_EXPIRE = '30'
@@プロキシ設定--------------------------------------------------
ndiary.conf で
PROXY = 'proxy.hoge.com:8080'
と指定しておくと、情報取得時プロクシを経由するようになります。
@@その他の設定--------------------------------------------------
ndiary.conf にて以下の変数が使用できます(必須ではない)
* BOOKSTORE_AMAZON_ID(Amazonアソシエイトに参加している場合に有効)
(例)
BOOKSTORE_AMAZON_ID = 'hogehoge-foo'
* NO_IMAGE_FILE
・ジャケット画像がない場合に代替に表示する画像(imgタグで表記)
(例)
NO_IMAGE_FILE='
'
@@ Special Thanx------------------------------------------------
== amazondvd.rb / amazon_shop.rb は以下の方の助力、影響、恩恵を受けています ==
- not (のとや) さん
-- http://www14.cds.ne.jp/~not/
-- nDiary本体とamazon.rbの作者
-- amazon.rb のソースに少し変更を加えたものが amazondvd.rb
そこからさらに発展したものが amazon_shop.rb
- mas さん
-- http://home3.highway.ne.jp/mas/
-- バグ報告や動作確認、Amazonアソシエイト対応など
- Ace of Diamond さん
-- http://every.pobox.ne.jp/
-- Amazonアソシエイト対応コード不具合パッチなど
- amazondvd.rb / amazon_shop.rb 利用者の方々
@@ 注意事項------------------------------------------------------
著作権がらみの情報を取得するため、
www.amazon.co.jpのアソシエイトプログラムを確認の上自己責任でご利用下さい。
=end
class Module
def attr_my_accessorshop( name )
module_eval %{
def #{name.id2name}()
get_shopdata
@#{name.id2name}
end
}
end
end
class Amazon_shop
require 'net/http'
require 'yaml'
attr_accessor :code_id
attr_accessor :key
attr_accessor :skey
attr_accessor :diary_day
attr_accessor :cached_day
attr_my_accessorshop :title
attr_my_accessorshop :actor
attr_my_accessorshop :maker
attr_my_accessorshop :director
attr_my_accessorshop :size
attr_my_accessorshop :pubdate
attr_my_accessorshop :price
attr_my_accessorshop :desc
attr_my_accessorshop :writer
attr_my_accessorshop :image_url
attr_my_accessorshop :imageL_url
attr_my_accessorshop :image_width
attr_my_accessorshop :image_height
attr_my_accessorshop :media
attr_my_accessorshop :site
attr_my_accessorshop :time
attr_my_accessorshop :voice
attr_my_accessorshop :voice_spec
attr_my_accessorshop :caption
attr_my_accessorshop :stand_in
attr_my_accessorshop :screen_size
attr_my_accessorshop :electro_spec
attr_reader :cache_dir
attr_accessor :expire
attr_accessor :proxy
def initialize
@expire = 0 # 0だと存在するキャッシュを必ず使用
@proxy = nil
@flag = false
@diary_day = Time.now
@cached_day = Time.now
end
def load_cache
if @flag or
(File::directory?(@cache_dir.to_s) and File::readable?(@cache_dir + @code_id) and
File::mtime(@cache_dir + @code_id).to_i < Time::now.to_i - 3600 * 24 * @expire and
@expire != 0) then
return
end
@flag = true
read_cache
end
def read_cache
cache_file = @cache_dir + @code_id
begin
cache = File.open(cache_file,mode="r")
str = YAML::load(cache)
cache.close
@title = str["商品タイトル"]
@actor = str["出演者/著者"]
@maker = str["メーカー"]
@size = str["枚数/サイズ"]
@pubdate = str["発売日"]
@price = str["価格"]
@desc = str["解説"]
@writer = str["解説者"]
@image_url = str["画像URL"]
@image_width = str["画像幅"]
@image_height = str["画像高さ"]
@media = str["メディア"]
@director = str["監督"]
@site = str["サイト"]
@key = str["キー"]
@imageL_url = str["拡大画像URL"]
@time = str["再生時間"]
@voice = str["音声"]
@voice_spec = str["音声仕様"]
@caption = str["字幕"]
@stand_in = str["吹替え"]
@screen_size = str["スクリーンサイズ"]
@electro_spec = str["スペック"]
@diary_day = str["日記記載日"]
@cached_day = str["キャッシュした時間"]
rescue
if $DEBUG then
puts "****** amazon_shop.rb is loading Old type cache. Please ignore yaml.rb Warnings. *******"
end
begin
open(cache_file){ |f|
@title, @actor, @maker, @size, @pubdate, @price, @desc, @writer, @image_url,@image_width, @image_height, @media, @director, @site, @key, @imageL_url, @time, @voice, @voice_spec, @caption, @stand_in, @screen_size, @electro_spec = f.read.split(/\t/)
}
rescue
puts @cache_dir + @code_id
@flag = nil
end
end
end
def save_cache
return unless File::directory?(@cache_dir.to_s)
cache_file = @cache_dir + @code_id
str = Hash[\
"商品タイトル",@title,\
"出演者/著者",@actor,\
"メーカー",@maker,\
"枚数/サイズ",@size,\
"発売日",@pubdate,\
"価格",@price,\
"解説",@desc,\
"解説者",@writer,\
"画像URL",@image_url,\
"画像幅",@image_width,\
"画像高さ",@image_height,\
"メディア",@media,\
"監督",@director,\
"サイト",@site,\
"キー",@key,\
"拡大画像URL",@imageL_url,\
"再生時間",@time,\
"音声",@voice,\
"音声仕様",@voice_spec,\
"字幕",@caption,\
"吹替え",@stand_in,\
"スクリーンサイズ",@screen_size,\
"スペック",@electro_spec,\
"日記記載日",@diary_day,\
"キャッシュした時間",@cached_day\
]
cache = File.open(cache_file,mode="w")
cache.write(str.to_yaml)
cache.close
end
def getFileStream(url, proxy)
if /^http/ =~ url
if $DEBUG then
$stderr.puts "CHK; access; #{url}"
end
require 'net/http'
domain, port = "", ""
if /\/\/(.+?)(?:\/|$)/ =~ url
domain = $1.to_s
end
protocol = url.split(":").first + "://"
path = url.gsub(Regexp.new(protocol + domain),"")
if proxy
proxy, port = proxy.split(':')
port = port.to_i
else
proxy = port = nil
end
begin
http = Net::HTTP::Proxy(proxy, port).new(domain, 80)
if /1\.6/ =~ RUBY_VERSION
file_info, = http.get2(path)
else
file_info = http.get(path)
end
if file_info.code == '302'
path = file_info.header['location'].sub(Regexp.new(url), "")
file_info = http.get(path)
end
return(file_info.response.body)
rescue
return $!
end
else
open(url, "rb").read
end
end
def cache_dir=(dir)
dir << '/' unless dir[-1,1] == '/'
@cache_dir = dir
end
def media_get(str)
featured_system="プラットフォーム:.*?\n \n(.*?)\n
|sm =~ str then
@media = @media + "(#{$1})"
end
end
#エレクトロニクスカテゴリー取得(未完成)
if /商品/ =~ @media then
if %r!同じ種類の商品を探す(.*)!smi =~ str then
media_scope = $1
# if %r!
?.amazon.com/images/P/[^.]+.[0-9][0-9].[^T][^H][^U][^M][^B]Z+.jpg))
(?:.*
)+"s =~ review_scope.to_s.gsub(/\n/,'') then
@writer =$1
@desc = $2
end
end
if @writer.to_s.empty? and @desc.to_s.empty? then
if %r"(作品内容|内容(「.+?」データベースより))
\n(.*?)"mis =~ review_scope then
@writer =$1
@desc = $2
end
end
if @writer.to_s.empty? and @desc.to_s.empty? then
if %r|(製品概要)[::](.*?)|mi =~ review_scope then
@writer = $1
@desc = $2
end
end
#--------------------------------------------------
# Published Date
#--------------------------------------------------
#(2002/05/24)
:DVD,CD
#発売日:2002/03/28
:PS2
if %r"(?:発売日[::]|\()([\d\/]+[\d])\)?
" =~ response then
@pubdate = $1
elsif %r|\((\d{4}\/[\d\/]+)\)| =~ response then
@pubdate = $1
end
#--------------------------------------------------
# Size(ディスク枚数)
#--------------------------------------------------
if %r!(?:)?ディスク枚数:(?:)?(.+)
! =~ response then
@size = $1
elsif %r!サイズ\(cm\): ([^<]*)$! =~ response then
@size = $1
end
#--------------------------------------------------
# CD,DVD or PS2?
#--------------------------------------------------
if /isbn/i =~ key then
if %r|^Amazon.co.jp:([^:]+):| =~ response then
@media = $1.strip
end
else
if %r|この(\w+)に\w+レビューを書|s =~ response then
@media = $1
if @media =~ /商品/ then
media_get(response)
end
else
media_get(response)
end
end
if @title.nil? then
read_cache
else
save_cache
@flag = true
end
end
end
class Filter
def add_title(str)
d = Array.new
str.split(",").each{|i|
if i =~ /href/ then
a = i
unless %r!http://www.amazon.co.jp! =~ a then
a = a.gsub(/\/exec/,"http:\/\/www.amazon.co.jp\/exec")
end
b = a.scan(/>(.+?))[0].to_s
c = "#{a.scan(/((.*)<\/a>/)[0]}\" class=\"amazonimg\"#{tagend}"
else
img = "
(.*)<\/a>/)[0]}\" class=\"amazonimg\"#{tagend}"
end
else
img = no_img
end
unless amzshop.media.to_s.empty?
media = amzshop.media
title = title.gsub(/この商品/,"この#{media}") unless media.to_s.empty?
xbox_icon="
/,"")
img = img.gsub(/(\ +)?<\/title>/,"")
# maker = メーカー
maker = add_title(amzshop.maker) unless amzshop.maker.to_s.empty?
# actor = 出演者
actor = add_title(amzshop.actor) unless amzshop.actor.to_s.empty?
# director = 監督
director = add_title(amzshop.director) unless amzshop.director.to_s.empty?
# pubdate = 発売日
pubdate = amzshop.pubdate unless amzshop.pubdate.to_s.empty?
# price = 価格
price = amzshop.price.gsub(/¥/,'\\') unless amzshop.price.to_s.empty?
# size = 枚数 (CD,DVD)
size = amzshop.size.gsub(/ /,'') unless amzshop.size.to_s.empty?
# time = 再生時間 (CD,DVD)
time = amzshop.time unless amzshop.time.to_s.empty?
# desc = 内容記述
desc = amzshop.desc.gsub(/\/exec/,"http:\/\/www.amazon.co.jp\/exec") unless amzshop.desc.to_s.empty?
# writer = desc のライター(「DVD NAVIGATOR」データベースより ...など)
writer = amzshop.writer unless amzshop.writer.to_s.empty?
# site = obsolete (google とかだった)
site =amzshop.site unless amzshop.site.to_s.empty?
# voice = 音声(英語/日本語 ...など)
voice = amzshop.voice unless amzshop.voice.to_s.empty?
# voice_spec = 音声仕様 (Dolby Digital 5.1/Dolby Digital 5.1 ...など)
voice_spec = amzshop.voice_spec unless amzshop.voice_spec.to_s.empty?
# caption = 字幕 (日本語/英語/日本語吹き替え用字幕 ...など)
caption = amzshop.caption unless amzshop.caption.to_s.empty?
# stand_in = 吹き替え
stand_in = amzshop.stand_in unless amzshop.stand_in.to_s.empty?
# screen_size = 画面サイズ (シネマスコープ ...など)
screen_size = amzshop.screen_size unless amzshop.screen_size.to_s.empty?
# electro_spec = エレクトロニクススペック
electro_spec = amzshop.electro_spec unless amzshop.electro_spec.to_s.empty?
if /本|洋書/ =~ media then
actorStr = "著者:"
sizeStr = "サイズ:"
sizeUnit = " cm"
else
actorStr = "出演者:"
sizeStr = "枚数:"
sizeUnit = " 枚"
end
body = Array.new
body << "
| " body << "\t\t\t#{img}" body << "\t\t | " body << "\t\t"
body << "\t\t\t『#{title}』"
body << "\t\t\t#{media}#{@diary.tag_br}"
body << "\t\t\t#{maker}#{@diary.tag_br}" unless maker.empty?
body << "\t\t\t#{actorStr}#{actor}#{@diary.tag_br}" unless actor.empty?
body << "\t\t\t監督:#{director}#{@diary.tag_br}" unless director.empty?
date_price_size_time = Array.new
date_price_size_time << "発売日:" + pubdate unless pubdate.to_s.empty?
date_price_size_time << "価格:" + price unless price.to_s.empty?
date_price_size_time << sizeStr + size + sizeUnit unless size.to_s.empty?
date_price_size_time << "時間:" + time unless time.to_s.empty?
dpst = date_price_size_time.join(", ")
body << "\t\t\t#{dpst}#{@diary.tag_br}#{@diary.tag_br}" unless dpst.empty?
body << "\t\t\t音声:#{voice}#{@diary.tag_br}" unless voice.empty?
body << "\t\t\t音声仕様:#{voice_spec}#{@diary.tag_br}" unless voice_spec.empty?
body << "\t\t\t字幕:#{caption}#{@diary.tag_br}" unless caption.empty?
body << "\t\t\t吹き替え:#{stand_in}#{@diary.tag_br}" unless stand_in.empty?
body << "\t\t\t画面サイズ:#{screen_size}#{@diary.tag_br}" unless screen_size.empty?
body << "\t\t\t
| "
body << "\t
\s*<\/p>/mi, '') end rescue puts "#{$!}" end end end =begin Local Variables: mode: ruby coding: sjis-dos End: =end