2009/04/18(Sat)
Amazonで閲覧中の商品に価格comから最低価格を取ってきて付加するGreasemonkeyスクリプト書いた
4月21日追記:Amazonに価格.comの最低価格を表示する『Amazon Lowest Price Checker』改良版リリースしました - 5.1さらうどん
改良版リリースしました。こちらのエントリからダウンロードできるものは旧バージョンとなっておりますので上述のエントリからどうぞ。
その買い物ちょっと待った。
こんな感じになります。
JavaScriptを始めてまだ間もないので、ようやっと「作品」と言い張れるような物ができたかなと。
はじめてのマッシュアップ。
パソコン周辺機器カテゴリーなら大体は使えると思います。
中にはこんなに価格差のある商品もあった。
Amazonで買うのがバカらしすぎるw
4月20日18:33追記:どうやら取得ミスのようです。id:N_Aさんブクマコメでのご指摘ありがとうございます。
インストールしていろいろ見て回るだけでも結構おもしろかったりする。
インストールはこちらからどうぞ。
引っ越しでごたごたして自鯖が使えなくなってしまったので、レンタル鯖を用意している間突撃レーザー氏の鯖を使わせてもらってます。
ご協力ありがとうございます。
ちなみに、Greasemonkey専用の関数を使っているのでOperaのユーザースクリプト実行機能などでは動かないと思います。
Firefox推奨。
今後アップデートする予定もあるので、インストールした方は頻繁にこの記事を見るといいかもしれない。
技術的なおはなし
一番詰まったのはやはりキモとも言える、価格comAPIからの商品情報取得。
XMLで吐く仕様になっているのでプロクシを経由してJSONに変換させてみたのですが、callback関数がうまく呼び出されないw
いろいろ調べてみると、Greasemonkeyで定義した関数は、面倒なことをしないと外から呼び出せないようなのです。
結局、グリモンで共通して使えるGM_xmlhttpRequestという関数はクロスドメイン制限を突破してXMLを取得できるようなので、こちらを利用しました。
GM_xmlhttpRequest の取得結果を DOMに操作 - 技術メモ帳
参考にさせて貰ったエントリー。
既知の問題点
・Amazon商品情報のメーカー型番を取得しているため、記述がない商品は検索できない
たまにメーカー型番が表示されずに商品ページタイトルに検索ワードとなりうる情報が表示されているケースがありますが、自動化するにあたってタイトルから文字列を取り出して、機械的に精査するのは困難なのでこういう仕様になっています。
解決策としては、価格comから商品情報が見つからなかったときにフォームを表示させて、そこのフォームに手動で型番を入れると最低価格を取得できるような仕様にするとどうだろうか?
・メーカー型番の取得方法が適当なので型番が表記されていても検索できない場合がある
商品の特徴の欄にある一番上の項目を取得してタグを外しているだけなので例えば
のように、一番上に別の説明文があるとお手上げ。
解決策としては「メーカー型番」という文字列が含まれる項目が出るまで全ての項目を調査すること。
これは簡単に実装できるけど、完成して気力が尽きたのでやめた。
今後追加する機能?
・Amazonとの価格差を表示する
Amazonよりn円安いです。みたいな感じで。
価格差の大きさによって文字の大きさが変わってもおもしろいかも。
・表示形式の見直し
ほかの項目が1,000のように3ケタ区切りで表示されているのに対して、最低価格はそのまま数字が表示されているので表示形式を買えてみる。
もしくは、OFFと表示されている項目の下に表示させても良いかも。
でも、それだと目立たなそう。
ソースコード
// ==UserScript== // @name Amazon Lowest Price Checker // @namespace http://gigi-net.net // @include http://www.amazon.co.jp/* // ==/UserScript== (function(){ //APIURL定義 var api_url ="http://api.kakaku.com/Ver1/ItemSearch.asp"; //製品型番を取得 //var dom_kataban =GetXpath("/html/body/div[7]/table/tbody/tr/td/div/ul/li"); var dom_kataban =document.getElementById("productDetailsDiv"); var kataban = dom_kataban.childNodes[0].childNodes[0].innerHTML kataban =kataban.replace(/<.*>/,""); //価格comAPIを用いて型番から最安値を取得 xml_url =api_url +"?Keyword="+encodeURIComponent(kataban)+"&CategoryGroup=ALL&SortOrder=pricerank&PageNum=1"; //APIからXMLを読み込んで表示する。 GM_xmlhttpRequest({ method:"GET", url:xml_url, onload:function(x){var parser = new DOMParser();var xml = parser.parseFromString( x.responseText, "text/xml" );var price = xml.getElementsByTagName("ProductInfo")[0].getElementsByTagName("Item")[0].getElementsByTagName("LowestPrice");var title =document.getElementsByTagName("h1");var check_lowest =document.createElement("div");check_lowest.innerHTML ="<b>最低価格:<span class='priceLarge'>\"+price[0].textContent+"</span></b>";title[0].parentNode.appendChild(check_lowest);check_lowest.style.fontSize ="18px"; } }); })();
- とーぜん日記。 - スマブラとマリカWiiのお話。
- 明日は明日の風が吹く - Amazonで閲覧中の商品に価格comから最低価...
- 5.1さらうどん - まさかのホッテントリ入り
- Cli@ - Amazonで閲覧中の商品に価格comから最低価格を取ってきて付...
- [雑記] ついカッとなって
- ■ - memo - Firefox使いのかた専用。Amazonで閲覧中の商品に価格co...
- src’s note - 気になる技術メモ
- 恐るべしほめられサロン
- 5.1さらうどん - Amazonに価格.comの最低価格を表示する『Amazon Lo...
- 檻の記録 - coneco.net版、Amazon閲覧時に最低価格を取ってきて付加...
- 檻の記録 - coneco.net版、Amazon閲覧時に最低価格を取ってきて付加...
- 檻の記録 - coneco.net版、Amazon閲覧時に最低価格を取ってきて付加...
- Amazon Lowest Price Checker
- Amazonに見る“検索とビジネス”の関わり
- ある二宮ひかるファンの日記 - つぶやきその12
- まにまにらいだー - Amazon価格と最安値を比較するツール
- adingo開発グループの日記 - [gessy][Greasemonkey]Greasemonkey作...
- adingo開発グループの日記 - Greasemonkey作成報告
- [Greasemonkey]ひとのコードをなぞって勉強してみる
- 価格comで閲覧中の商品にAmazon(とconeco.net)から最低価格を取っ...
- 週刊ログ
- gigi-net@G91 - [Blog]お呼ばれしたので自己紹介してみる
- それはそれ。これはこれ。 - Amazon+価格COM 別版
- おれさま新聞 - ●米Yahoo!、無料ホスティングサービスのGeoCities...
- 拷問ポルノとケロイドの両面宿儺 - Amazonで閲覧中の商品に価格co...
- けいおん! 第3話「特訓!」
- yusuke_s37の日記 - 我が家のFirefox事情。
- 2703 http://mozilla-remix.seesaa.net/article/117859513.html
- 2123 http://b.hatena.ne.jp/
- 1469 http://b.hatena.ne.jp/hotentry
- 1280 http://www.oshiete-kun.net/archives/2009/04/_amazon_4.html
- 1228 http://d.hatena.ne.jp/
- 524 http://reader.livedoor.com/reader/
- 401 http://mozilla-remix.seesaa.net/article/242764357.html
- 366 http://www.kagitaku.com/diary
- 347 http://userscripts.org/scripts/show/48192
- 345 http://d.hatena.ne.jp/blueberrystream/20090420/1240245350






まず、呼び出し URL ですが、
var api_url ="http://api.kakaku.com/Ver1/ItemSearch.asp";
を使用されていますが、
var api_url ="http://api.kakaku.com/Ver1.1/ItemSearch.asp";
と、 1.1 の方を使っていただいた方が便利かと思います。
http://apiblog.kakaku.com/KakakuItemSearchV1.1.html
こちらですと、パラメータとして結果数を指定できるので、今回のように最安の1件だけであれば
&HitNum=1
を指定していただければその分返る XML が少なくて済みます。
また、 Amazon の中のどの部分を検索クエリとして使うかですが、 id が btAsinTitle の部分の文字列を使う方がヒットしやすいかもです。
最後に、こちらのページ上で拝見したところでは、 priceLarge クラスの span を開いた後の円は ¥ とか ¥ とかの方が無難かもですね。
¥ と &165; と書きました。
# 今回は大丈夫かな..。
むしろこんなシロウトが作ったスクリプトがここまで評価されていいのかと申し訳なくなりました。
コメント欄でアドバイスをくれた方はありがとうございます。
これを参考に修正していきたいと思います。
ご紹介頂いた方法を試してみたのですが、参考URLを見たところHitNumパラメーターのの有効範囲は5-20のようでした。
とりあえず5で試してみることにします。
失礼しました...。