Amazonに図書館の検索結果を差し込むGreasemonkey
だいぶほったらかしになっていたAmazonの商品詳細ページから図書館の蔵書の有無を調べるGreasemonkeyの更新なのですが、
大まかに動作が確認出来たので再度途中経過など
大きな変更点としては、所増の有無の判定にXPathを使う事と検索中のメッセージを表示する事の2点
GM_xmlhttpRequestのレスポンスからノードに変換するのはhttp://userscripts.org/scripts/show/8551を参考にさせていただきました
サンプル
〜略〜 var XPATH = "//table[5]/tbody/tr/td[3]/a"; 〜略〜 GM_xmlhttpRequest({ method : "GET", url : QUERY_URL_PREFIX + isbn + QUERY_URL_SUFFIX, headers: { 'User-Agent' : 'Mozilla/4.0 (compatible) Greasemonkey', 'Content-type': 'application/x-www-form-urlencoded' }, onerror : function(response) { var tx = STTS_NAME_5 + LIB_NAME_2; lk.appendChild(document.createTextNode(tx)) loading.removeChild(loading.lastChild); loading.appendChild(df); }, onload : function(response) { FlgRes = true; var htmlDoc = createHTMLDocumentByString(response.responseText); var nodes = document.evaluate( XPATH, htmlDoc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); switch(nodes.snapshotLength) { case 0: // 所蔵なし var tx = STTS_NAME_1; var href = QUERY_URL_PREFIX + isbn + QUERY_URL_SUFFIX; break; case 1: // 1件所蔵 var tx = STTS_NAME_2; var href = DETAIL_URL + nodes.snapshotItem(0).getAttribute("href"); break; default: // 複数所蔵 var tx = STTS_NAME_3; var href = DETAIL_URL + nodes.snapshotItem(0).getAttribute("href"); } lk.setAttribute('title', LIB_NAME_2); lk.setAttribute('href', href); lk.appendChild(document.createTextNode(tx + LIB_NAME_2)) df.appendChild(lk); loading.removeChild(loading.lastChild); loading.appendChild(df); } }); // utility functions. function createHTMLDocumentByString(str) { var html = str.replace(/<!DOCTYPE.*?>/, '').replace(/<html.*?>/, '').replace(/<\/html>.*/, '') var htmlDoc = document.implementation.createDocument(null, 'html', null) var fragment = createDocumentFragmentByString(html) try { fragment = htmlDoc.adoptNode(fragment) } catch(e) { fragment = htmlDoc.importNode(fragment, true) } htmlDoc.documentElement.appendChild(fragment) return htmlDoc } function createDocumentFragmentByString(str) { var range = document.createRange() range.setStartAfter(document.body) return range.createContextualFragment(str) } } })();