auto order

2024/9/27 15:58:40

  1. // ==UserScript==
  2. // @name auto order
  3. // @namespace Violentmonkey Scripts
  4. // @match https://m.xiangdian.com/*
  5. // @match https://m.imxxd.cn/*
  6. // @grant none
  7. // @version 1.0.8
  8. // @author -
  9. // @description 2024/9/27 15:58:40
  10. // @license MIT
  11. // ==/UserScript==
  12.  
  13. var elmGetter = function() {
  14. const win = window.unsafeWindow || document.defaultView || window;
  15. const doc = win.document;
  16. const listeners = new WeakMap();
  17. let mode = 'css';
  18. let $;
  19. const elProto = win.Element.prototype;
  20. const matches = elProto.matches ||
  21. elProto.matchesSelector ||
  22. elProto.webkitMatchesSelector ||
  23. elProto.mozMatchesSelector ||
  24. elProto.oMatchesSelector;
  25. const MutationObs = win.MutationObserver ||
  26. win.WebkitMutationObserver ||
  27. win.MozMutationObserver;
  28. function addObserver(target, callback) {
  29. const observer = new MutationObs(mutations => {
  30. for (const mutation of mutations) {
  31. if (mutation.type === 'attributes') {
  32. callback(mutation.target);
  33. if (observer.canceled) return;
  34. }
  35. for (const node of mutation.addedNodes) {
  36. if (node instanceof Element) callback(node);
  37. if (observer.canceled) return;
  38. }
  39. }
  40. });
  41. observer.canceled = false;
  42. observer.observe(target, {childList: true, subtree: true, attributes: true});
  43. return () => {
  44. observer.canceled = true;
  45. observer.disconnect();
  46. };
  47. }
  48. function addFilter(target, filter) {
  49. let listener = listeners.get(target);
  50. if (!listener) {
  51. listener = {
  52. filters: new Set(),
  53. remove: addObserver(target, el => listener.filters.forEach(f => f(el)))
  54. };
  55. listeners.set(target, listener);
  56. }
  57. listener.filters.add(filter);
  58. }
  59. function removeFilter(target, filter) {
  60. const listener = listeners.get(target);
  61. if (!listener) return;
  62. listener.filters.delete(filter);
  63. if (!listener.filters.size) {
  64. listener.remove();
  65. listeners.delete(target);
  66. }
  67. }
  68. function query(all, selector, parent, includeParent, curMode) {
  69. switch (curMode) {
  70. case 'css':
  71. const checkParent = includeParent && matches.call(parent, selector);
  72. if (all) {
  73. const queryAll = parent.querySelectorAll(selector);
  74. return checkParent ? [parent, ...queryAll] : [...queryAll];
  75. }
  76. return checkParent ? parent : parent.querySelector(selector);
  77. case 'jquery':
  78. let jNodes = $(includeParent ? parent : []);
  79. jNodes = jNodes.add([...parent.querySelectorAll('*')]).filter(selector);
  80. if (all) return $.map(jNodes, el => $(el));
  81. return jNodes.length ? $(jNodes.get(0)) : null;
  82. case 'xpath':
  83. const ownerDoc = parent.ownerDocument || parent;
  84. selector += '/self::*';
  85. if (all) {
  86. const xPathResult = ownerDoc.evaluate(selector, parent, null, 7, null);
  87. const result = [];
  88. for (let i = 0; i < xPathResult.snapshotLength; i++) {
  89. result.push(xPathResult.snapshotItem(i));
  90. }
  91. return result;
  92. }
  93. return ownerDoc.evaluate(selector, parent, null, 9, null).singleNodeValue;
  94. }
  95. }
  96. function isJquery(jq) {
  97. return jq && jq.fn && typeof jq.fn.jquery === 'string';
  98. }
  99. function getOne(selector, parent, timeout) {
  100. const curMode = mode;
  101. return new Promise(resolve => {
  102. const node = query(false, selector, parent, false, curMode);
  103. if (node) return resolve(node);
  104. let timer;
  105. const filter = el => {
  106. const node = query(false, selector, el, true, curMode);
  107. if (node) {
  108. removeFilter(parent, filter);
  109. timer && clearTimeout(timer);
  110. resolve(node);
  111. }
  112. };
  113. addFilter(parent, filter);
  114. if (timeout > 0) {
  115. timer = setTimeout(() => {
  116. removeFilter(parent, filter);
  117. resolve(null);
  118. }, timeout);
  119. }
  120. });
  121. }
  122. return {
  123. get currentSelector() {
  124. return mode;
  125. },
  126. get(selector, ...args) {
  127. let parent = typeof args[0] !== 'number' && args.shift() || doc;
  128. if (mode === 'jquery' && parent instanceof $) parent = parent.get(0);
  129. const timeout = args[0] || 0;
  130. if (Array.isArray(selector)) {
  131. return Promise.all(selector.map(s => getOne(s, parent, timeout)));
  132. }
  133. return getOne(selector, parent, timeout);
  134. },
  135. each(selector, ...args) {
  136. let parent = typeof args[0] !== 'function' && args.shift() || doc;
  137. if (mode === 'jquery' && parent instanceof $) parent = parent.get(0);
  138. const callback = args[0];
  139. const curMode = mode;
  140. const refs = new WeakSet();
  141. for (const node of query(true, selector, parent, false, curMode)) {
  142. refs.add(curMode === 'jquery' ? node.get(0) : node);
  143. if (callback(node, false) === false) return;
  144. }
  145. const filter = el => {
  146. for (const node of query(true, selector, el, true, curMode)) {
  147. const _el = curMode === 'jquery' ? node.get(0) : node;
  148. if (refs.has(_el)) break;
  149. refs.add(_el);
  150. if (callback(node, true) === false) {
  151. return removeFilter(parent, filter);
  152. }
  153. }
  154. };
  155. addFilter(parent, filter);
  156. },
  157. create(domString, ...args) {
  158. const returnList = typeof args[0] === 'boolean' && args.shift();
  159. const parent = args[0];
  160. const template = doc.createElement('template');
  161. template.innerHTML = domString;
  162. const node = template.content.firstElementChild;
  163. if (!node) return null;
  164. parent ? parent.appendChild(node) : node.remove();
  165. if (returnList) {
  166. const list = {};
  167. node.querySelectorAll('[id]').forEach(el => list[el.id] = el);
  168. list[0] = node;
  169. return list;
  170. }
  171. return node;
  172. },
  173. selector(desc) {
  174. switch (true) {
  175. case isJquery(desc):
  176. $ = desc;
  177. return mode = 'jquery';
  178. case !desc || typeof desc.toLowerCase !== 'function':
  179. return mode = 'css';
  180. case desc.toLowerCase() === 'jquery':
  181. for (const jq of [window.jQuery, window.$, win.jQuery, win.$]) {
  182. if (isJquery(jq)) {
  183. $ = jq;
  184. break;
  185. };
  186. }
  187. return mode = $ ? 'jquery' : 'css';
  188. case desc.toLowerCase() === 'xpath':
  189. return mode = 'xpath';
  190. default:
  191. return mode = 'css';
  192. }
  193. }
  194. };
  195. }();
  196.  
  197.  
  198.  
  199.  
  200.  
  201. (function() {
  202. window.elmGetter = elmGetter;
  203.  
  204. elmGetter.get('.container--pay').then(div => {
  205. console.log(div)
  206. let iii = setInterval(()=>{
  207. window.document.getElementsByClassName('container--pay')[0].click()
  208. //clearInterval(iii)
  209. },10)
  210. })
  211.  
  212. //检测全选是否选中
  213. let startCheck = false
  214. let selectAllEle = null
  215. const myCheck = setInterval(function(){
  216. if(startCheck){
  217. const btn = selectAllEle.querySelector('.van-checkbox__icon--checked');
  218. console.log(btn)
  219. if (btn) {
  220. startCheck = false
  221. clearInterval(myCheck);
  222. //已经全选 点击结算
  223. window.document.getElementsByClassName('bottombar--right-btn')[0].click()
  224. }else{
  225. startCheck = true
  226. window.document.getElementsByClassName('bottombar__checkbox--cover')[0].click()
  227. };
  228. }
  229.  
  230. }, 10);
  231.  
  232. //全选
  233. elmGetter.get('.select-all').then(div => {
  234. selectAllEle = div
  235. const btn = div.querySelector('.van-checkbox__icon--checked');
  236. console.log(btn)
  237. if (btn) {
  238. //已经全选 点击结算
  239. window.document.getElementsByClassName('bottombar--right-btn')[0].click()
  240. }else{
  241. startCheck = true
  242. };
  243.  
  244. });
  245.  
  246. })();