Amazon+価格COM 別版 の続き

id:otn:20090428 で書いた、Amazon+価格COM のGreasemonkeyスクリプトだが、いつの間にか動かなくなってるなあと思って、調べると、価格COMのリクエストにキーが必要になっている。

http://apiblog.kakaku.com/

価格.com WebサービスAPIが新しくなりました。アクセスキーの取得が必要となりましたので、ユーザ登録を行ってください。以前のバージョンにつきましては 8月末日*1をもちまして終了とさせて頂きます。


ということで、キーを取得して、スクリプトを修正した。APIのURLも変わっている。Amazonみたいにリクエストパラメータを秘密キーで署名とか言われるとJavaScriptだけでは苦しいところだけど、単にキーを付加するだけで良いので簡単な修正。

仕様をもう一度書いておく。
・「製品の特徴」の「メーカー型番」という項目を探してそれで価格COMを検索
・「メーカー型番」がない商品の場合は商品名で検索
・検索して見つからない場合は何も出さない
・見つかった場合、価格COM最低価格とメーカー名:商品名を出す
・誤検索かどうかは、人間がメーカー名:商品名を見て判断する

// ==UserScript==
// @name           amazonkakakucom
// @version        1.2
// @namespace      http://d.hatena.ne.jp/otn/
// @description    Amazon+価格COM最安値
// @include        http://www.amazon.co.jp/dp/*
// @include        http://www.amazon.co.jp/*/dp/*
// @include        http://www.amazon.co.jp/gp/product/*
// ==/UserScript==
// http://homepage3.nifty.com/otn/amazonkakakucom.user.js
var apikey = "********************************"; // 自分が取得したキー
var key, proDiv, bTags, title;
// メーカー型番が書いてあればそれを
if((proDiv=document.getElementById("productDetailsDiv")) && (bTags=proDiv.getElementsByTagName("b"))){
  for(var i=0; i<bTags.length; ++i){
    if(bTags[i].textContent.substr(0,6)=="メーカー型番"){
      key=bTags[i].nextSibling.textContent;
      break;
    }
  }
}
// 書いてなければ商品タイトルを検索に使う
if(!key){
  if(title=document.getElementById("btAsinTitle")){
    key=title.textContent;
  }
}
if(key){
  GM_xmlhttpRequest({
    method:"GET", 
    url:"http://api.kakaku.com/WebAPI/ItemSearch/Ver1.0/ItemSearch.aspx?ApiKey="+apikey+
      "&SortOrder=pricerank&ResultSet=mini&HitNum=1"+
      "&Keyword="+encodeURIComponent(key),
    onload:doit
  });
}

function doit(resp){
  var root=document.createElement("div");
  root.innerHTML=resp.responseText;
  var priceTags=root.getElementsByTagName("LowestPrice");
  if(priceTags.length>0){
    var price=priceTags[0].textContent, wk;
    while(wk=price.replace(/([0-9]+)([0-9]{3})/,"$1,$2"), price!=wk) price=wk;
    var linkUrl=root.getElementsByTagName("ItemPageUrl")[0].textContent;
    var maker  =root.getElementsByTagName("MakerName"  )[0].textContent;
    var product=root.getElementsByTagName("ProductName")[0].textContent;
    var priceBlock=document.getElementById("priceBlock");
    var here;
    while(here=priceBlock.parentNode, here.nodeName!="TD") priceBlock=here;
    var div=document.createElement("div");
    div.innerHTML='<span class="priceBlockLabel">価格COM:</span>'+
    '<span><b class="priceLarge">¥'+price+'</b>'+
    '&nbsp;&nbsp;(<a href="'+linkUrl+'">'+maker+':'+product+'</a>)</span>';
    here.insertBefore(div,priceBlock);
  }
}

*1:何年の8月末日なのか書いてないけど、2009年4月時点では必要なかったので、2009年8月31日だろう