// ==UserScript== // @name 二手车摆渡人268v自动秒接单 // @namespace https://tampermonkey.net/ // @version 1.63 // @description 在 dp.268v.com 订单列表中,自动点击并发出提示音。 // @author you // @match https://dp.268v.com/* // @match http://dp.268v.com/* // @grant none // @run-at document-idle // ==/UserScript== (function () { 'use strict'; // ============ 核心功能 =================================================// var CELL_SEL = '.cell'; var BTN_SEL = '.ui-btn'; var TARGET_SEL = '.ui-list-btn-wait'; var CELL_COOLDOWN_MS = 2000; var BEEP_COOLDOWN_MS = 400; var lastCellClickAt = new WeakMap(); var lastBeepAt = 0; var clickCount = 0; var audioCtx = null; function dlog() { if (window.__dpxDebug === false) return; console.log('[dp-268v-auto-free]', Array.prototype.join.call(arguments, ' ')); } function showBadge() { if (document.getElementById('__dpx_badge__')) return; var el = document.createElement('div'); el.id = '__dpx_badge__'; el.textContent = 'DPX'; el.style.cssText = 'position:fixed;top:8px;right:8px;z-index:999999;' + 'padding:4px 10px;border-radius:4px;background:#52c41a;color:#fff;' + 'font:12px/1.4 -apple-system,Segoe UI,sans-serif;' + 'box-shadow:0 2px 8px rgba(0,0,0,.2);pointer-events:none;opacity:.85;'; (document.body || document.documentElement).appendChild(el); } function flashBadge(text, color) { var el = document.getElementById('__dpx_badge__'); if (!el) return; var old = el.textContent; var oldBg = el.style.background; el.textContent = text; el.style.background = color; setTimeout(function () { el.textContent = old; el.style.background = oldBg; }, 1200); } function unlockAudio() { var Ctx = window.AudioContext || window.webkitAudioContext; if (!Ctx) return; if (!audioCtx) audioCtx = new Ctx(); if (audioCtx.state === 'suspended') { audioCtx.resume().catch(function(e) { dlog('AudioContext resume failed:', e.message); }); } } ['click', 'keydown', 'pointerdown', 'touchstart'].forEach(function (ev) { window.addEventListener(ev, unlockAudio, { once: true, capture: true }); }); function beep() { // 确保音频上下文可用 if (!audioCtx) unlockAudio(); if (!audioCtx || audioCtx.state !== 'running') return; var now = performance.now(); if (now - lastBeepAt < BEEP_COOLDOWN_MS) return; lastBeepAt = now; try { var t = audioCtx.currentTime; // 增益节点(4倍放大,突破浏览器默认响度限制) var gain = audioCtx.createGain(); gain.gain.setValueAtTime(0.0001, t); gain.gain.exponentialRampToValueAtTime(4.0, t + 0.01); gain.gain.exponentialRampToValueAtTime(0.0001, t + 0.35); // 动态压缩(防止增益过高导致削峰失真) var compressor = audioCtx.createDynamicsCompressor(); compressor.threshold.value = -10; compressor.ratio.value = 4; compressor.attack.value = 0.003; compressor.release.value = 0.1; gain.connect(compressor); compressor.connect(audioCtx.destination); // 双音叠加,使用方波增强穿透力 [660, 990].forEach(function (freq, i) { var o = audioCtx.createOscillator(); o.type = 'square'; o.frequency.value = freq; o.connect(gain); o.start(t + (i === 1 ? 0.04 : 0)); o.stop(t + 0.4); }); // 第二次叠加,提升声音厚度 setTimeout(function() { if (!audioCtx || audioCtx.state !== 'running') return; var t2 = audioCtx.currentTime; [660, 990].forEach(function (freq) { var o = audioCtx.createOscillator(); o.type = 'square'; o.frequency.value = freq * 1.5; // 高八度 o.connect(gain); o.start(t2); o.stop(t2 + 0.2); }); }, 100); } catch (e) { dlog('beep error', e.message); } } function clickBtn(uiBtn) { var span = uiBtn.querySelector(TARGET_SEL); var target = span || uiBtn; try { target.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window })); } catch (e) { dlog('dispatch click failed', e.message); try { target.click(); } catch (e2) { dlog('native click failed', e2.message); } } } function findTargets(root) { var scope = (root && root.querySelectorAll) ? root : document; return scope.querySelectorAll(TARGET_SEL); } function process(target) { if (!(target instanceof HTMLElement)) return; var uiBtn = target.closest(BTN_SEL); if (!uiBtn) return; var cell = uiBtn.closest(CELL_SEL); if (!cell) return; var now = performance.now(); var last = lastCellClickAt.get(cell); if (last && now - last < CELL_COOLDOWN_MS) return; lastCellClickAt.set(cell, now); clickCount++; clickBtn(uiBtn); beep(); dlog('click #' + clickCount, target.textContent.trim().slice(0, 20)); flashBadge('已自动点击 #' + clickCount, '#1890ff'); } function scanAndProcess(root) { var targets = findTargets(root); for (var i = 0; i < targets.length; i++) { process(targets[i]); } } function startCore() { showBadge(); dlog('init', location.href, '目标数:', document.querySelectorAll(TARGET_SEL).length); scanAndProcess(); var observer = new MutationObserver(function (records) { for (var r = 0; r < records.length; r++) { var nodes = records[r].addedNodes; for (var n = 0; n < nodes.length; n++) { if (nodes[n].nodeType !== 1) continue; scanAndProcess(nodes[n]); } } }); observer.observe(document.documentElement, { childList: true, subtree: true }); dlog('MutationObserver 已挂上'); } // ============ 入口 ====================================================// startCore(); })();