Amazon Order Check

Show alert to avoid multiple order.

  1. // ==UserScript==
  2. // @name Amazon Order Check
  3. // @description:en Show alert to avoid multiple order.
  4. // @version 0.1
  5. // @namespace https://twitter.com/foldrr
  6. // @include http://www.amazon.co.jp/*
  7. // @include https://www.amazon.co.jp/*
  8. // @description Show alert to avoid multiple order.
  9. // ==/UserScript==
  10.  
  11. (function (){
  12. // 警告メッセージ情報
  13. var warn = {
  14. message: '2つ以上注文している商品があります。<br>' +
  15. '二重注文していないか数量を確認してください。',
  16. style: {
  17. backgroundColor: '#FFC000',
  18. borderStyle: 'solid',
  19. borderWidth: '4px',
  20. fontSize: '32pt',
  21. fontWeight: 'bold',
  22. padding: '20px'
  23. }
  24. };
  25. // エラーメッセージ情報
  26. var error = {
  27. message: 'Amazon注文チェックスクリプトでエラーが発生しました。<br>' +
  28. '二重注文チェックができませんでした。<br>' +
  29. 'あなたの目で注文数量をよく確認してください。',
  30. style: {
  31. backgroundColor: '#FF8080',
  32. borderStyle: 'solid',
  33. borderWidth: '4px',
  34. fontSize: '32pt',
  35. fontWeight: 'bold',
  36. padding: '20px'
  37. }
  38. };
  39. // ページ設定
  40. var pages = [
  41. // href : チェックを適用するページのURL文字列。
  42. // cart : カートに商品がある場合に存在するはずのカート要素のXPath文字列。
  43. // items: カートにある商品要素のXPath文字列。
  44. // getter: 商品個数を表す要素を取り出すための関数。
  45. // pattern: 商品個数を抽出するための正規表現文字列。
  46. {
  47. // カートに入れた直後の画面
  48. href: 'http://www.amazon.co.jp/gp/cart/view-upsell.html',
  49. cart: '//form[@id="cartViewForm"]',
  50. items: "//td/span[@class='tiny']",
  51. getter: function(node){
  52. return node.firstChild.nodeValue;
  53. },
  54. pattern: "数量: (\\d+)",
  55. }
  56. , {
  57. // カートを見る
  58. href: 'http://www.amazon.co.jp/gp/cart/view.html/',
  59. cart: '//a[@name="tobuynow"]',
  60. items: '//form[@id="cartViewForm"]//input[@type="text"]',
  61. getter: function(node){
  62. return node.value;
  63. },
  64. pattern: "(\\d+)",
  65. }
  66. , {
  67. // 注文確定前の確認画面
  68. href: 'https://www.amazon.co.jp/gp/buy/payselect/handlers/continue.html',
  69. cart: null,
  70. items: '//span[@class="tiny"]',
  71. getter: function(node){
  72. return node.firstChild.nodeValue;
  73. },
  74. pattern: '数量[::  ]*(\\d+)',
  75. }
  76. /*
  77. /**/
  78. ];
  79. main(document);
  80. // メイン処理
  81. function main(){
  82. for(var i = 0, n = pages.length; i < n; i++){
  83. if(! processPage(pages[i])){
  84. return;
  85. }
  86. }
  87. }
  88. // 指定したページ情報を処理する。
  89. function processPage(page){
  90. // 処理対象ページかチェックする。対象外なら正常終了。
  91. var href = document.location.href;
  92. if(href.indexOf(page.href) != 0){
  93. return true;
  94. }
  95. // 必要があれば、処理対象カートの存在をチェックする。存在しなければ正常終了。
  96. if(page.cart){
  97. var cart = $X(page.cart, document);
  98. if(! cart.snapshotLength){
  99. return true;
  100. }
  101. }
  102. // 処理対象商品の存在をチェックする。存在しなければエラー。
  103. var items = $X(page.items, document);
  104. if(! items.snapshotLength){
  105. return showMessage(error);
  106. }
  107. // 商品個数をチェックする。
  108. var hits = 0;
  109. var re = new RegExp(page.pattern);
  110. for(var i = 0, n = items.snapshotLength; i < n; i++){
  111. var text = page.getter(items.snapshotItem(i));
  112. var counter = (re.exec(text) || [])[1];
  113. if(counter){
  114. hits++;
  115. if(2 <= counter){
  116. return showMessage(warn);
  117. }
  118. }
  119. }
  120. // 商品個数を表す要素の取得に失敗していればエラー。
  121. if(hits == 0){
  122. return showMessage(error);
  123. }
  124. return true;
  125. }
  126. // 指定されたメッセージを表示する。
  127. function showMessage(messageData){
  128. var elem = document.createElement("div");
  129. elem.innerHTML = messageData.message;
  130. for(var k in messageData.style){
  131. elem.style[k] = messageData.style[k];
  132. }
  133. var body = document.getElementsByTagName('body')[0];
  134. body.insertBefore(elem, body.firstChild);
  135. return false;
  136. }
  137. // 指定したXPath文字列から要素を取得する。
  138. function $X(xpath, node){
  139. var nodes = node.evaluate(xpath,
  140. node, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  141. return nodes;
  142. }
  143. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址