Greasy Fork 支持简体中文。

Amazon Automation

Add entire lists to cart - empty cart - empty saved items - show subtotal in lists

目前為 2018-11-05 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name Amazon Automation
  3. // @namespace https://greasyfork.org/users/222319
  4. // @version 1.5.44
  5. // @date 2018-10-30
  6. // @description Add entire lists to cart - empty cart - empty saved items - show subtotal in lists
  7. // @author Explisam <explisam@gmail.com>
  8. // @compatible chrome
  9. // @compatible firefox
  10. // @compatible opera
  11. // @compatible safari
  12. // @license MIT License <https://opensource.org/licenses/MIT>
  13. // @include *://*.amazon.co*/*
  14. // @grant GM_addStyle
  15. // @run-at document-idle
  16. // ==/UserScript==
  17.  
  18. (function() {
  19.  
  20. const ListPlaceHolder = document.getElementById("wl-list-collaborators");
  21. const ListContainer = document.getElementById("g-items");
  22. const CartContainer = document.getElementById('sc-active-cart');
  23. const SaveContainer = document.getElementById('sc-saved-cart');
  24.  
  25. if (ListContainer) {
  26. ListPolymer();
  27. CountFlag();
  28. CountPop();
  29.  
  30. var config = { attributes: true, childList: true, subtree: true };
  31. var observer = new MutationObserver(ListObserver);
  32. observer.observe(ListContainer, config);
  33. }
  34.  
  35. if (CartContainer) {
  36. CartPolymer();
  37. }
  38.  
  39. if (SaveContainer) {
  40. SavePolymer();
  41. }
  42.  
  43. function buttonBuild(id, margin, style, action, text) {
  44. var buttonDec = document.createElement("span");
  45. buttonDec.id = id;
  46. buttonDec.className = "a-declarative a-button a-button-normal a-button-primary " + style;
  47. buttonDec.addEventListener("click", action, false);
  48.  
  49. if (margin) {
  50. buttonDec.style.marginBottom = margin;
  51. buttonDec.style.display = "block";
  52. }
  53.  
  54. var buttonInn = document.createElement("span");
  55. buttonInn.className = "a-button-inner";
  56.  
  57. var button = document.createElement("span");
  58. button.appendChild(document.createTextNode(text));
  59. button.className = "a-button-text";
  60. button.role = "button";
  61.  
  62. buttonDec.appendChild(buttonInn);
  63. buttonInn.appendChild(button);
  64.  
  65. return buttonDec;
  66. }
  67.  
  68. function spanBuild(id, style, text) {
  69. var span = document.createElement("span");
  70. span.className = style;
  71. span.appendChild(document.createTextNode(text));
  72.  
  73. if (id) {
  74. span.id = id;
  75. }
  76.  
  77. return span;
  78. }
  79.  
  80. function ListPolymer() {
  81. var checkdi = document.getElementById('amazonAutoCAd');
  82. var checkli = ListContainer.querySelectorAll('[data-action=add-to-cart]');
  83.  
  84. if (!checkdi && checkli[0]) {
  85. var button = buttonBuild(
  86. "amazonAutoCAd",
  87. undefined,
  88. "wl-info-aa_add_to_cart aok-float-right",
  89. AddList, "Add List to Cart")
  90. var referenceNode = ListPlaceHolder.querySelector('.aok-inline-block');
  91. referenceNode.parentNode.insertBefore(button, referenceNode.nextSibling);
  92. }
  93. }
  94.  
  95. function CartPolymer() {
  96. var checkdi = document.getElementById('amazonAutoCDt');
  97. var checkli = CartContainer.querySelectorAll('*[name^="submit.delete"]');
  98.  
  99. if (!checkdi && checkli[0]) {
  100. var button = buttonBuild(
  101. "amazonAutoCDt",
  102. "20px",
  103. "a-row",
  104. DeleteCart,
  105. "Delete all items")
  106. var referenceNode = document.getElementById('sc-active-cart');
  107. referenceNode.insertBefore(button, referenceNode.firstChild);
  108. }
  109. }
  110.  
  111. function SavePolymer() {
  112. var checkdi = document.getElementById('amazonAutoCSv');
  113. var checkli = SaveContainer.querySelectorAll('*[name^="submit.delete"]');
  114.  
  115. if (!checkdi && checkli[0]) {
  116. var button = buttonBuild(
  117. "amazonAutoCSv",
  118. "20px",
  119. "a-row",
  120. DeleteSave,
  121. "Delete all saved")
  122. var referenceNode = document.getElementById('sc-saved-cart');
  123. referenceNode.insertBefore(button, referenceNode.firstChild);
  124. }
  125. }
  126.  
  127. function CountFlag(observer) {
  128. var referenceNode =
  129. document.getElementById('wl-list-info')
  130. .getElementsByTagName('div')[0]
  131. .getElementsByTagName('div')[0];
  132.  
  133. if (observer) {
  134. var counter = document.getElementById("amazonAutoCCn");
  135. referenceNode.removeChild(counter.parentNode);
  136. }
  137.  
  138. var checkli = ListContainer.querySelectorAll('[data-action=add-to-cart]');
  139.  
  140. if (checkli[0]) {
  141. var container = document.getElementById("wl-item-view");
  142. var whole = container.getElementsByClassName("a-price");
  143. var price = [];
  144. var currency = whole[0].getElementsByClassName('a-offscreen')[0].innerText.substring(0,1);
  145.  
  146. for (var i = 0; i < whole.length; i++) {
  147. var itemMeta = JSON.parse(whole[i].parentNode.getAttribute("data-item-prime-info")).id;
  148. var itemId = 'itemRequested_' + itemMeta;
  149. var itemQuantity = document.getElementById(itemId).innerText;
  150.  
  151. if (!itemQuantity) {
  152. itemQuantity = 1;
  153. } else {
  154. itemQuantity = parseFloat(itemQuantity);
  155. }
  156.  
  157. var itemPrice = parseFloat(whole[i].getElementsByClassName('a-offscreen')[0].innerText.substring(1));
  158.  
  159. price[i] = itemPrice * itemQuantity;
  160. }
  161.  
  162. var total = price.reduce((a, b) => a + b, 0).toFixed(2);
  163.  
  164. var wrapper = document.createElement('span');
  165.  
  166. var display = spanBuild(
  167. "amazonAutoCCn",
  168. "a-size-medium a-color-price sc-price sc-white-space-nowrap sc-price-sign a-text-bold",
  169. currency + total);
  170.  
  171. wrapper.appendChild(display);
  172.  
  173. if (!observer) {
  174. var space1 = spanBuild(undefined, "a-letter-space", "")
  175. var space2 = spanBuild(undefined, "a-letter-space", "")
  176.  
  177. referenceNode.appendChild(space1);
  178. referenceNode.appendChild(space2);
  179. }
  180.  
  181. referenceNode.appendChild(wrapper);
  182. }
  183. }
  184.  
  185. function ListObserver(mutationsList, observer) {
  186. CountFlag(observer);
  187.  
  188. ListLength =
  189. ListContainer.querySelectorAll('[data-action=add-to-cart]').length +
  190. ListContainer.getElementsByClassName('g-cart-checkout-btn').length;
  191. }
  192.  
  193. function CountPop() {
  194. var dialog = document.createElement("div");
  195. dialog.style.visibility = "visible";
  196. dialog.style.display = "contents";
  197. dialog.style.marginTop = "10px";
  198. dialog.className = "a-popover a-popover-no-header a-declarative a-arrow-right";
  199.  
  200. var wrapper = document.createElement("div");
  201. wrapper.className = "a-popover-wrapper a-popover-inner";
  202. wrapper.style.border = "1px solid #c45500"
  203. wrapper.style.borderColor = "rgba(196,85,0,1)"
  204.  
  205. var button = document.createElement("button");
  206. button.className = "a-button-close a-declarative";
  207. button.addEventListener("click", function(){
  208. document.getElementById("content-right").removeChild(dialog);
  209. }, false);
  210.  
  211. var icon = document.createElement("i");
  212. icon.className = "a-icon a-icon-close";
  213.  
  214. var content = document.createElement("div");
  215. content.id = "a-popover-content-1";
  216. content.className = "a-popover-content";
  217. content.appendChild(
  218. document.createTextNode(
  219. "Make sure to expand your list (scroll to bottom)" +
  220. " to view full total price"
  221. ));
  222.  
  223. button.appendChild(icon);
  224. dialog.appendChild(wrapper);
  225. wrapper.appendChild(button);
  226. wrapper.appendChild(content);
  227.  
  228. var referenceNode = document.getElementById('wl-list-collaborators');
  229. referenceNode.parentNode.insertBefore(dialog, referenceNode.nextSibling);
  230. }
  231.  
  232. function getRex(name) {
  233. return document
  234. .getElementById(name)
  235. .getElementsByTagName('span')[0]
  236. .getElementsByTagName('span')[0];
  237. }
  238.  
  239. var ListPass;
  240. var ListLength;
  241. var ListTimer;
  242. var listButtons;
  243.  
  244. function AddList(zEvent) {
  245. if (ListPass) {
  246. return;
  247. }
  248.  
  249. var addObj = document.getElementById('amazonAutoCAd');
  250. addObj.disabled = "disabled";
  251. ListPass = true;
  252.  
  253. ListLength = ListContainer.querySelectorAll('[data-action=add-to-cart]').length;
  254.  
  255. ListTimer = window.setInterval(function() {
  256. listButtons = ListContainer.querySelectorAll('[data-action=add-to-cart]');
  257.  
  258. if (listButtons[0]) {
  259. var referenceButton = listButtons[0].getAttribute("data-add-to-cart");
  260. var referenceMeta = JSON.parse(referenceButton).itemID;
  261. var referenceView = document.querySelectorAll('[data-itemid=' + referenceMeta + ']')[0];
  262. referenceView.scrollIntoView({ behavior: 'smooth' });
  263.  
  264. listButtons[0].click();
  265. getRex('amazonAutoCAd').innerText
  266. = "Added "
  267. + (ListLength - listButtons.length)
  268. + " items out of " + ListLength + "..";
  269. } else {
  270. getRex('amazonAutoCAd').innerText = "Added " + ListLength + " items to cart";
  271. window.clearInterval(ListTimer);
  272.  
  273. window.scrollTo({ top: 0, behavior: 'smooth' });
  274.  
  275. var unavailable = ListContainer.getElementsByClassName('wl-info-aa_buying_options_button').length;
  276.  
  277. if (unavailable) {
  278. unavailable = unavailable + " unavailable item";
  279.  
  280. if (unavailable.substring(0,1) > 1) {
  281. unavailable = unavailable + "s";
  282. }
  283.  
  284. var warning = spanBuild(undefined, "aok-float-right", unavailable)
  285. warning.style.marginTop = "5px";
  286. warning.style.marginRight = "5px";
  287. warning.style.color = "#c45500";
  288.  
  289. var referenceNode = document.getElementById('amazonAutoCAd');
  290. referenceNode.parentNode.insertBefore(warning, referenceNode.nextSibling);
  291. }
  292. }
  293. }, 500);
  294. }
  295.  
  296. var CartPass;
  297.  
  298. function DeleteCart(zEvent) {
  299. if (CartPass) {
  300. return;
  301. }
  302.  
  303. var cartLength = CartContainer.querySelectorAll('*[name^="submit.delete"]').length;
  304. var cartObj = document.getElementById('amazonAutoCDt');
  305. cartObj.disabled = "disabled";
  306. CartPass = true;
  307.  
  308. var cartTimer = window.setInterval(function() {
  309. var listButtons = CartContainer.querySelectorAll('*[name^="submit.delete"]');
  310.  
  311. if (listButtons[0] && cartLength == listButtons.length) {
  312. listButtons[0].click();
  313.  
  314. cartLength = listButtons.length - 1;
  315. getRex('amazonAutoCDt').innerText = cartLength + " items left..";
  316. } else if (!listButtons[0]) {
  317. cartObj.parentNode.removeChild(cartObj);
  318. window.clearInterval(cartTimer);
  319. }
  320. }, 500);
  321. }
  322.  
  323. var SavePass;
  324.  
  325. function DeleteSave(zEvent) {
  326. if (SavePass) {
  327. return;
  328. }
  329.  
  330. var saveLength = SaveContainer.querySelectorAll('*[name^="submit.delete"]').length;
  331. var saveObj = document.getElementById('amazonAutoCSv');
  332. saveObj.disabled = "disabled";
  333. SavePass = true;
  334.  
  335. var saveTimer = window.setInterval(function() {
  336. var listButtons = SaveContainer.querySelectorAll('*[name^="submit.delete"]');
  337.  
  338. if (listButtons[0] && saveLength == listButtons.length) {
  339. listButtons[0].click();
  340.  
  341. saveLength = listButtons.length - 1;
  342. getRex('amazonAutoCSv').innerText = saveLength + " items left..";
  343. } else if (!listButtons[0]) {
  344. saveObj.parentNode.removeChild(saveObj);
  345. window.clearInterval(saveTimer);
  346. }
  347. }, 500);
  348. }
  349. })();