Hatena::ブログ(Diary)

実験と娯楽

2008-11-12

Amazon Cross Book Check - アマゾンから最安中古価格を一発検索(図書館もあるヨ)

これはなに?

アマゾンのページ上で、他の書店サイトの中古価格を表示するGreasemonkeyスクリプトです。カスタマイズして図書館の蔵書を調べたりもできます。

スクリーンショット

f:id:adda:20081112125513j:image

対応しているアマゾンのページ

商品ページ、ほしい物リスト、検索結果、ベストセラー、おすすめ商品、リストマニア、最近チェックした商品

デフォルトで対応している書店サイト

BOOKOFF Onlinelivedoor BOOKS古本市場eBOOKOFF


インストール

以下のリンクをクリックしてインストールして下さい。

amazon_cross_book_check.user.js


使い方

商品ページ

ページを開くと自動で検索して表示します。

それ以外

リストの一番上のアイテムに表示される「他のサイトを探す」をクリックすると、検索を開始します。

f:id:adda:20100411204932j:image


カスタマイズ

以下の設定はお好みで編集することができます。ソースファイルを直接書き換えて下さい。

DEFAULT_AUTO_START

リスト形式のページを開いたとき、自動で検索開始させたい場合はtrueに書き換えて下さい。ページのタイプごとに設定を変えたい場合は、ここをtrueにしたうえで、個別のPAGEINFO(後述)を変えて下さい。

INTERVAL

リスト形式のページでは、ここで指定されたインターバルを空けて検索するようになっています。これはBOOKOFF Onlineなど、一度に大量の検索を行うと利用できなくなるサイト向けの機能です。デフォルト0.5秒。

SITEINFO

検索対象サイトの情報を記述するフォーマットです。このSITEINFOをソースコードに追加することで、検索対象を増やすことができます。

また以下でSITEINFOの共有を進めているので、ぜひご利用・ご参加下さい。

http://wedata.net/databases/AmazonCrossBookCheck/items

SITEINFOの書式は以下の通りです。

{
  label: 'BOOKOFF Online',
  url: 'http://www.bookoffonline.co.jp/display/L001,st=u,q=',
  isbn13: true,
  regexp: /\u4E2D\u53E4\u8CA9\u58F2\u4FA1\u683C<\/th><td class="tab01">\uFFE5([\d,]+)/,
  disabled: false
}
label (必須)
書店サイトの名前です。
url (必須)
検索リクエストのうち、ISBNより前の部分。ISBN以外をキーとした検索には対応していません。
regexp (必須)
検索結果ページから、価格を抜き出すための正規表現リテラルでそのまま表記します。カッコでグループ化した部分が価格として表示されます。グループがない場合は「Found」という文字が挿入されます。図書館の場合は「蔵書有り」を示す部分にマッチするように書いて下さい。
afterISBN
検索リクエストのうち、ISBNより後ろの部分。
isbn13
10ケタISBNではなく、13ケタで検索する場合はtrueに設定して下さい。
bothISBN
ここをtrueに設定すると、ISBN10とISBN13の両方で検索を行います。図書館などで、ISBNの規格が統一されていない場合に使います。現状では、サイト側がパイプ区切りによるOR検索に対応している必要があります。
minetype
minetypeを指定する必要がある場合は、ここに書いてください。
disabled
ここをtrueに設定すると検索を行いません。SITEINFO自体は消したくないけど、一時的に無効にしたい場合に使います。

図書館の追加方法についてはid:turing_patternさんのエントリが詳しいです。

PAGEINFO

アマゾンのページ構造の情報を記述するフォーマットです。自分でPAGEINFOを書いて対応ページを増やすことができます。

{
  type: 'wishlist',
  urlExp: '/wishlist/',
  insertAfter: '//tbody[@name]/descendant::tbody[1]/tr[last()]',
  asinLink: '//td[@class="small"]/strong/a',
  autoStart: true
}
type
ページの説明です。
urlExp (必須)
URLに含まれる文字列。ページタイプの判定に使います。
insertAfter (必須)
XPath。指定した要素の直後に検索結果を挿入します。
asinLink (必須)
XPath。「ISBNを含むURLをhref属性に持つリンク」を指定します。insertAfterとasinLinkで抽出できる要素数が違ったりするとおかしなことになります。
autoStart
DEFAULT_AUTO_STARTとの論理積がtrueになるように設定すると、検索を自動開始します。

さらにカスタマイズ

もっと複雑なことをさせたい人は以下を参照してください。完全に自分用に作った機能ですが、参考までに。


更新情報

2011.04.05

  • eBOOKOFF検索が動かなくなっていたのを修正。(id:poppenさんより。)
  • Greasemonkey-0.9.1に対応。(同じくid:poppenさんより。ありがとうございます!)

2010.05.24

  • SITEINFO内でXPath関数が動かなくなっていたのを修正。(id:sy0taさんより。ありがとうございます!)

2010.04.11

  • アマゾン側の仕様変更に伴ない、PAGEINFOを更新。
  • 動かなくなっていた古書店サイトのSITEINFOを更新。
  • SITEINFOにminetypeを追加。(id:ats7さんより。ありがとうございます!)
  • リスト系ページでの起動方法を、ユーザスクリプトコマンドからリンククリックに変更。
  • その他いろいろ(間が空きすぎて忘れました。。)

2009.03.16

2009.02.28

2009.01.16

2008.12.22

  • サイト毎に検索が完了したタイミングで結果を表示できるように修正。
  • INTERVALを追加。

2008.12.17

  • SITEINFOのregxp属性をregexpに変更。wedataとソースで表記が食い違っていました。なんで今まで気付かなかったんだろう。すいません。。

2008.12.08

  • SITEINFOにbothISBNを追加。id:fuji70 ++

2008.11.28

  • URLの末尾がISBNになっている場合に動作しない不具合を修正。@++

2008.11.20

2008.11.12

  • デフォルトの検索対象に古本市場とeBOOKOFFを追加。turing_pattern++、poppen++
  • DEFAULT_AUTO_STARTを追加。自動開始の一括設定が可能に。
  • TIMEOUTを追加。検索対象が増えて重くなってきたため。
  • SITEINFOの項目にdisabledを追加。
  • ページ設定の変数名をCONFからPAGEINFOに変更。
  • PAGEINFOに「最近チェックした商品」を追加。id:turing_pattern ++

マサトマサト 2008/11/13 20:12 使わせてもらっています。
本の検索がすごく楽になりました。
ありがとうございます。

kamijyokamijyo 2008/11/18 15:59 慶応大学図書館と新宿区図書館のSITEINFO作りました。

{
label: '慶應義塾大学', //慶應義塾大学
url: 'http://opac.lib.keio.ac.jp/cgi-bin/nph-mgwcgi?MGWLPN=OPAC&NSPACE=KMC1&Phase=211&FN=0&Job=A&Qual1=ALL&Keyw1=',
regxp: /refworks/,
},
{
label: '新宿区図書館', //新宿区図書館
url: 'https://www.library.shinjuku.tokyo.jp/opac/cgi-bin/sellist?type=0&allc=&page=1&keyword=&sentaku=and&title=&sentaku=and&author=&sentaku=or&publish=&sentaku=or&isbn=',
afterISBN: '&pubydate1=&pubydate3=&bunrui=&syubetu=all&kan=all&media=all&count=10&order=publish&before=select&authorid=&opacfile=&titleid=&i1=&i2=',
regxp: /detail\?biblioid=/,
},

kamijyokamijyo 2008/11/18 16:00 数値文字参照が文字になっちゃいますね。適当に読み替えてください。

addaadda 2008/11/20 11:46 > kamijyoさん
wedataに登録したので、よろしければ追加お願いします。
http://wedata.net/databases/AmazonCrossBookCheck/items

kamijyokamijyo 2008/11/20 15:17 追加させていただきました。

addaadda 2008/11/20 18:30 ありがとうございます!

@@ 2008/11/26 15:31 いつも使わせていただいております。
ところで、特に検索エンジンからジャンプした場合に
http://www.amazon.co.jp/dp/4431711767
のようなISBNのみで終了しているURLになっていることがあります。
この場合にはスクリプトが走らないようです。

正規表現のことはよくわからないのですが、次のように訂正して使っております。
もしよろしければ次回のアップデートの際にでも対応していだけませんでしょうか。

function getISBN(str) {
if (str.match(/[\/\=]([\dX]{10})[\/\?\&]/)) return RegExp.$1;
else if (str.match(/[\/\=]([\dX]{10})$/)) return RegExp.$1;
}

addaadda 2008/11/28 19:14 > @さん
うわ、すいません。修正しておきました。
SITEINFOもありがとうございました!

fuji70fuji70 2008/12/07 08:34 こんにちは,fuji70ともうします.
便利なスクリプト公開,ありがとうございます.

isbn13についてですが,両方のOR検索でないとうまく引っ張れない図書館があります.(千代田区図書館とか)
 http://d.hatena.ne.jp/fuji70/20081207/1228605986
で対応させる方法について書いてみました.

ところで,スクリプトを改変するのは問題なかったでしょうか?問題あるならエントリー削除しますので連絡ください.
また逆にスクリプト開発に手を出しても良いならぜひ参加させてください.

addaadda 2008/12/08 14:58 > fuji70さん
ご利用&修正ありがとうございます!
ISBNの規格を統一していないなんて、鬼畜な図書館があったものですね!

書いて下さった対処法でアップデートさせて頂きました。
改変については全く問題ありませんし、開発参加は大歓迎です。
今のところレポジトリ等で管理していないので不便な点があるかと思いますが、バグ修正や機能追加の際にご連絡頂ければ反映できるかと思います。

popipopepopipope 2008/12/19 07:10 今日から使わせて頂いております。素晴らしいです。
wedata に The Book Depository (イギリスの書店)を追加しました。
本当は値段がポンドなのが問題ですが、個人的には問題なく使えています。

addaadda 2008/12/19 16:24 ポ、ポンドですか・・・円マークですみません。
海外のSITEINFOが増えたら、オプションで通貨単位も変更できるようにしたいです。

CherenkovCherenkov 2008/12/24 03:11 こんばんは。汎用的なスクリプトの例としてお手本にさせてもらいます。
ところで最近BOOKOFF Onlineは連続アクセス10回制限を設けたというタレコミがありました。なので10回目以降の値段表示やその商品のページを参照しようとすると制限に引っかかってしまいます。
尚これは要望ではありません。タレコミのタレコミです。

addaadda 2008/12/24 03:46 > Cherenkovさん
BOOKOFFにそんな制限が!最近よくはじかれるとは思っていたのですが。。
「連続」がどの程度の頻度を指すのか微妙なところですが、まぁしばらくは様子を見るしかなさそうですね。
ちなみにこのスクリプトは完全に我流で書いているので、参考程度に見て頂ければ幸いです。

addaadda 2009/01/01 22:53 上の追記です.
実験の結果,ブックオフは1秒のインターバルをおけばアクセス制限されないようなので,デフォルトの設定をそのようにしておきました.

rehashrehash 2009/01/06 18:30 こんばんは。いつも便利に利用させていただいております。
livedoor booksの検索についてですが、品切でも中古価格自体は存在するので値段が表示され品物があるように見えてしまいます。
品切の場合には「Not Found」と表示できるようにはなるのでしょうか?

addaadda 2009/01/06 19:10 > rehashさん
すみません、手元で再現できないので、中古で品切れになっている本を教えて下さい。

rehashrehash 2009/01/06 19:22 > addaさん
http://books.livedoor.com/used/item477413628X.html
ISBN:9784774136288
管理コード:477413628X
あたりが今品切状態です。
よろしくお願い致します。

addaadda 2009/01/06 23:15 うーん、手元ではちゃんと「Not Found」になります。。
お使いのスクリプトは最新版でしょうか?

rehashrehash 2009/01/06 23:24 失礼しました。再度インストールしなおしたところNot Foundになりました。
申し訳ありませんでした。

addaadda 2009/01/06 23:51 いえいえ、また何かありましたらお願いします。

kiri3kiri3 2009/01/10 00:23 とても便利なスクリプトをありがとうございます。
ところで横浜市立図書館はpostで検索するため、siteinfoでは対応できそうになかったので、改造してみました。無理やりな改造なのでちょっと気が引けるのですが、とりあえず動いてます。http://kiri.vox.com/library/post/amazon-cross-book-check%E3%81%8C%E7%B4%A0%E6%95%B5%E3%81%A0.html

addaadda 2009/01/10 16:27 うわ,POST対応したかったので参考になります!
時間のある時に解読して,本体に組み込ませていただこうと思います.

turing_patternturing_pattern 2009/01/16 01:37 いつも利用させていただいてます。最新バージョンなのですが、ISBN で終わる URL 問題が再発しているようです。
str.match(/[\/\=]([\d]{9}[\dX])[^&]?/)
ではいかがでしょうか。

addaadda 2009/01/17 16:26 ありがとうございます.反映させていただきました.

poppenpoppen 2009/03/07 21:59 eBOOKOFF検索が動かなくなっていたようなのでpatchを書いてみました。
検索URLが長いのが気になりますが……。
http://gist.github.com/75322

addaadda 2009/03/16 10:22 返事が遅れて申し訳ないです。
配布用のスクリプトに反映させていただきました。ありがとうございます!

poppenpoppen 2009/03/17 23:49 コミットありがとうございます。
またまたで申し訳ないのですが、著者名で引いた際のSITEINFOも書いてみました。といっても、searchのSITEINFOの丸ぱくりなのですがw
http://gist.github.com/80567

sy0tasy0ta 2009/05/26 22:58 bk1の価格と出荷時期を表示し、カートへ入れるリンクを貼るSITEINFOを作ったので、
wedataに追加しました。
http://wedata.net/items/29034

bk1はclassとかidとかがないのでXPathがすごく長くなってしまうので、
何か良い方法があったら教えてください。

XPathはFirebugとFirefinderがすごく使いやすいです。

addaadda 2009/05/26 23:30 > poppenさん
すみません!ずっとコメント見てませんでした。。
次の更新に反映させて頂きます!

>syOtaさん
ifFound機能使う人ほとんどいないので、嬉しいです!
Xpathは私も詳しくないのですが、例えばこんな書き方だと短くできます。

//table[2]/tbody/tr/td/table[2]/tbody/tr/td/table/tbody/tr/td[2]/font[2]/img[1]

//img[@vspace='2']

sy0tasy0ta 2009/05/27 23:49 XPathをそれぞれ

//img[@vspace='2']
//input[@name='selectBibId[0]']

にすることが出来ました。
wedataも更新しました。
教えてくださってありがとうございます。

ats7ats7 2009/12/11 03:06 便利なスクリプトを公開してくださって、ありがとうございます。
SITEINFOにmimetypeを指定できるようにするパッチを作成しました。
もしよろしければ取り込んでください。

以下のSITEINFOは、このパッチを前提にしたものです。(^^;

http://wedata.net/items/30749

==パッチここから==
--- amazon_cross_book_check.user.js.orig 2009-12-11 01:48:40.000000000 +0900
+++ amazon_cross_book_check.user.js 2009-12-11 01:48:29.000000000 +0900
@@ -43,6 +43,7 @@
label: '',
url: '',
afterISBN: '',
+ mimetype: '',
regexp: //,
isbn13: ,
bothISBN: ,
@@ -252,7 +253,7 @@
Checker.prototype.run = function() {
this.url = this.buildURL();
var self = this;
- ajax(this.url, function(res){
+ ajax(this.url, this.info.mimetype, function(res){
if (res.match(self.info.regexp)) {
self.status = 1;
if (RegExp.$1.length > 0) self.content = RegExp.$1;
@@ -353,10 +354,11 @@
return data;
}

-function ajax(url, onload) {
+function ajax(url, mimetype, onload) {
GM_xmlhttpRequest({
method: 'get',
url: url,
+ overrideMimeType: mimetype,
onload: function(res) {
onload(res.responseText);
}
==パッチここまで==

addaadda 2009/12/11 22:11 わー、ありがとうございます!

実を言うと、数カ月前から手元のバージョンではmimetypeが指定出来ていたのですが、更新をサボっておりました。。
サボっててすみません!近いうちに反映して最新版をアップいたします。

ats7ats7 2009/12/12 02:08 更新を楽しみにしています!(^^)

bautabauta 2012/01/05 10:53 いつも大変便利に使わせてもらっています。
本当にありがとうございます。
去年、古本市場がフルイチオンラインにリニューアルしてから
使えなくなっていたので、自分で修正しようとしたのですが、
プログラミングの知識が皆無で挫折してしまいました。。。
お時間のあるときに対応していただけると助かります。
要望のみで恐縮です。
ちなみにDVDに非対応なのは仕様でしょうか。
書籍とはコードが違うのでしょうね。

sus303sus303 2012/03/12 22:29 便利なスクリプトをありがとうございます。

最近、ebookoff(現netoff)と古本市場(フルイチオンライン)がリニューアルしてから、検索機能が使えなくなってしまいました。
自分で修正を試みたのですが、regexpの設定がうまくいかず価格が表示できません。出来れば更新をお願いします。
以下に修正したコードを示します。

{
label: 'フルイチオンライン', //フルイチオンライン
url: 'http://www.furu1online.net/SearchItem?CID=&FREE_WORD=',
        regexp:
isbn13: true,
//disabled: true
},
{
label: 'NETOFF',
url: 'http://www.netoff.co.jp/cmdtyallsearch?word=',
regexp:
isbn13: true,
//disabled: true
},

kaworrykaworry 2012/11/28 21:22 Firefox17で動かなくなってしまいました
更新の予定はありますか?

yryryryr 2013/01/09 13:54 修正してみました。不具合あったら教えて下さい
{
label: 'フルイチオンライン', //フルイチオンライン
url: 'http://www.furu1online.net/SearchItem?CID=&FREE_WORD=',
regexp: /<strong>([\d,]+)<\/strong> 円<\/dd>/,
isbn13: true,
//disabled: true
},
{
label: 'NETOFF',
url: 'http://www.netoff.co.jp/cmdtyallsearch?word=',
afterISBN: '&used=0',
regexp: /\">([\d,]+)円<\/span>/,
isbn13: true,
//disabled: true
},

Firefox17はCDATAの扱いが変わったので変換する必要があります
http://logroid.blogspot.jp/2012/10/firefox-e4x-cdata.html

mklfmklf 2013/01/21 10:37 大変有り難く使わせていただいております。
FireFox17から表示が出なくなり、解決策の模索中、久しぶりに
こちらのサイトへお邪魔させていただきました。
開発者さんの公式のメンテはお休み中のようですが、ユーザーの
みなさんのコメントやティップスに救われています。

当初の疑問だったFireFox17で使えない問題については、先人
( yryryryrさん 2013/01/09 13:54)が原因をご指摘くださって
いるので、解決しました。
というより、そこを抜本的に変える決断がつきかねたので、about
configの設定でCDATAを使えるように切り替えてごまかしました。
でも、所詮FireFox18にアップするまでの短い延命にすぎません。
いずれはソースコードの仕組みを勉強して対処しなくては、ですね。

ところで、別の疑問がいくつか湧いてきています。
長くなりましたので、別のコメントで質問だけを残しますので、
どなたか、お知恵を貸していただければ幸いです。

mklfmklf 2013/01/21 10:58 連投、ご容赦ください。
疑問は、次のものです。

ソースコード中に以下の記述があります。
background-image: url("http://exnent.com/userjs/search_button.png");
これは、リスト系のページで表示されたときに、「他のサイトで…」の
アンカーテキストの前に出てくる虫眼鏡アイコンを意図しているのでは
と考えたのですが、それはまず正しいのでしょうか。

次に、http://exnent.com/というのは存在していないように思える
のですが、どういうことなのでしょうか。

また、自分でソースコードを編集していたら、GreaseMonkyの警告
が表示されまして、「@grant」の宣言が…とのことでした。
何のことかよくわからないままではありますが、jsコードのヘッダー部
に@grantで何か宣言をしておけ、ということなのだろうくらいの理解
をしています。
具体的には、どんなことをしたらいいのでしょうか。

どなたか、お暇なときにでもご教授くださいましたら幸いです。

mklfmklf 2013/01/21 17:53 何度もすみません。

さきほどの質問に書きそびれたのですが、検索結果一覧のページに
表示が出ません。
insertAfterとasinLinkの現状に適した記述を、ご存知の方は、
いらっしゃいませんでしょうか。

Amazonの検索結果一覧の仕様変更があったのか、と考えています。
ソースコードをCTRL+Uで表示させて、CTRL+FでProductDataと
探しても、役に立たないだろう位置でヒットしています。

Xpathの記述を変えなくてはいけないのだろうと想像はつくのですが、
具体的にどう書き変えるのか、よくわかりません。
asinLinkとinsertAfterを現況に合わせて編集していらっしゃる方、
教えていただけませんでしょうか。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証