require "jcode.pl"; package bookinfo; ;# このパッケージはISBNから書籍情報を取得する役割を持ちます。 ;# 読み込み時にinitを呼びます。 &init unless defined $version; ;#初期化 sub init { $version = "1.0"; $book_info_cache_file = "data/book_info_cache"; read_cache_file(); } ;# 書籍情報を取得します。 sub get_book_info { local($isbn, *title, *author, *publisher) = @_; if(exists $books{$isbn}){ ;# キャッシュ内に存在するので、キャッシュから取得する。 $title = $books{$isbn}[0]; $author = $books{$isbn}[1]; $publisher = $books{$isbn}[2]; } else{ ;# キャッシュ内に存在しないので、インターネットから取得しキャッシュに入れる。 $title = ""; $author = ""; $publisher = ""; get_book_info_online($isbn, \$title, \$author, \$publisher); write_cache_file($isbn, $title, $author, $publisher); $books{$isbn}[0] = $title; $books{$isbn}[1] = $author; $books{$isbn}[2] = $publisher; } } ;# インターネット上から書籍情報を取得します。 sub get_book_info_online { local($isbn, *title, *author, *publisher) = @_; ;# ISBNからハイフンを取り除きます。 $isbn =~ s/-//g; ;# 書籍情報を提供するサイトから書籍情報を含むhtmlを取得します。 local($host) = "www.netdirect.co.jp"; local($page) = "/search/ISSSchDetail.asp?ISBN=" . $isbn; local($data) = ""; local($addr) = (gethostbyname($host))[4]; local($name) = pack("S n a4 x8", 2, 80, $addr); socket(S, 2, 1, 0); connect(S, $name); binmode(S); local($old) = select(S); $| = 1; select($old); print S "GET $page HTTP/1.0\r\n\r\n"; while () { $data .= $_; } close(S); jcode::convert(\$data, 'euc'); ;# 書籍データの各項目を取り出します。 ;# サイトの出力形式が変わると書き直す必要があります。 ;# 以下は2002-05-29におけるwww.netdirect.co.jp/search/の出力に対するものです。 if($data =~ '.*([^<&]*).*'){ $title = $1; } if($data =~ '.*著者:[^\n]*\n[^\n]*\n[^\n]*\n *([^<&]*)'){ $author = $1; } if($data =~ '.*出版社:[^\n]*\n[^\n]*\n[^\n]*\n *([^<&]*)'){ $publisher = $1; } } ;# 書籍情報キャッシュファイルから全てのレコードを取り出します。 sub read_cache_file { open(IN, $book_info_cache_file) || return; while($line = ){ chop($line); @cols = split(",", $line); $books{$cols[0]}[0] = $cols[1]; $books{$cols[0]}[1] = $cols[2]; $books{$cols[0]}[2] = $cols[3]; } close(IN); } ;# 書籍情報キャッシュファイルにレコードを追加します。 sub write_cache_file { local($isbn, $title, $author, $publisher) = @_; open(CACHE_OUT, ">> ". $book_info_cache_file); print(CACHE_OUT "$isbn,$title,$author,$publisher\n"); close(CACHE_OUT); } 1;