Amazon Automation

Automatically add entire lists, empty cart or saved items.

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

QingJ © 2025

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