Hatena::ブログ(Diary)

5.1さらうどん Twitter

2009/04/18(Sat)

Amazonで閲覧中の商品に価格comから最低価格を取ってきて付加するGreasemonkeyスクリプト書いた

| 23:53 |

4月21日追記:Amazonに価格.comの最低価格を表示する『Amazon Lowest Price Checker』改良版リリースしました - 5.1さらうどん

改良版リリースしました。こちらのエントリからダウンロードできるものは旧バージョンとなっておりますので上述のエントリからどうぞ。


その買い物ちょっと待った。

http://gyazo.com/e804925bee438ecb02872d54c6c52b03.png

http://gyazo.com/f36d54eb8c903f5c47771c7824d6c234.pnghttp://gyazo.com/4ef0935b7d081d07854992313ffe489a.png

こんな感じになります。

JavaScriptを始めてまだ間もないので、ようやっと「作品」と言い張れるような物ができたかなと。

はじめてのマッシュアップ



パソコン周辺機器カテゴリーなら大体は使えると思います。

中にはこんなに価格差のある商品もあった。

http://gyazo.com/828bd505d0791e650fb5f081724eac0b.png

Amazonで買うのがバカらしすぎるw

4月20日18:33追記:どうやら取得ミスのようです。id:N_Aさんブクマコメでのご指摘ありがとうございます。

インストールしていろいろ見て回るだけでも結構おもしろかったりする。


インストールはこちらからどうぞ。

Amazon Lowest Price Checker


引っ越しでごたごたして自鯖が使えなくなってしまったので、レンタル鯖を用意している間突撃レーザー氏の鯖を使わせてもらってます。

ご協力ありがとうございます。


ちなみに、Greasemonkey専用の関数を使っているのでOperaのユーザースクリプト実行機能などでは動かないと思います。

Firefox推奨。

今後アップデートする予定もあるので、インストールした方は頻繁にこの記事を見るといいかもしれない。


技術的なおはなし

一番詰まったのはやはりキモとも言える、価格comAPIからの商品情報取得。

XMLで吐く仕様になっているのでプロクシを経由してJSONに変換させてみたのですが、callback関数がうまく呼び出されないw

いろいろ調べてみると、Greasemonkeyで定義した関数は、面倒なことをしないと外から呼び出せないようなのです。

結局、グリモンで共通して使えるGM_xmlhttpRequestという関数はクロスドメイン制限を突破してXMLを取得できるようなので、こちらを利用しました。

GM_xmlhttpRequest の取得結果を DOMに操作 - 技術メモ帳

参考にさせて貰ったエントリー。


既知の問題点

・Amazon商品情報のメーカー型番を取得しているため、記述がない商品は検索できない

たまにメーカー型番が表示されずに商品ページタイトルに検索ワードとなりうる情報が表示されているケースがありますが、自動化するにあたってタイトルから文字列を取り出して、機械的に精査するのは困難なのでこういう仕様になっています。

解決策としては、価格comから商品情報が見つからなかったときにフォームを表示させて、そこのフォームに手動で型番を入れると最低価格を取得できるような仕様にするとどうだろうか?


・メーカー型番の取得方法が適当なので型番が表記されていても検索できない場合がある

商品の特徴の欄にある一番上の項目を取得してタグを外しているだけなので例えば

http://gyazo.com/34f012ae110fbeaf373cc5cd0dc59066.png

のように、一番上に別の説明文があるとお手上げ。

解決策としては「メーカー型番」という文字列が含まれる項目が出るまで全ての項目を調査すること。

これは簡単に実装できるけど、完成して気力が尽きたのでやめた。

今後追加する機能?

・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";
}
});

})();

linkが欲しいなlinkが欲しいな 2009/04/20 12:38 check_lowest.innerHTML = "<b><a href=\"http:\/\/kakaku.com\/search_results\/" + encodeURIComponent(kataban) + "\">最低価格<\/a>:<span class='priceLarge'>"+price[0].textContent+"</span></b>";

setomitssetomits 2009/04/20 15:55 一応中の人です。

まず、呼び出し 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 を開いた後の円は ¥ とか ¥ とかの方が無難かもですね。

setomitssetomits 2009/04/20 15:57 度々失礼します。

&yen; と &165; と書きました。
# 今回は大丈夫かな..。

gigi-netgigi-net 2009/04/20 18:27 信じられないほどのアクセス数とブクマとスターがついていてぶったまげました。
むしろこんなシロウトが作ったスクリプトがここまで評価されていいのかと申し訳なくなりました。
コメント欄でアドバイスをくれた方はありがとうございます。
これを参考に修正していきたいと思います。

gigi-netgigi-net 2009/04/21 10:56 >setomitsさん
ご紹介頂いた方法を試してみたのですが、参考URLを見たところHitNumパラメーターのの有効範囲は5-20のようでした。
とりあえず5で試してみることにします。

setomitssetomits 2009/04/21 13:29 HitNum の値の件、1から4を指定したらエラーになりますね。
失礼しました...。

トラックバック - http://d.hatena.ne.jp/gigi-net/20090418/1240066430