// ==UserScript== // @name 京东图书定价全能王-仿生全自动完美合流版 // @namespace http://tampermonkey.net/ // @version 3.0-Auto // @description 【全自动无感全能版】彻底移除查询按钮。扫描未缓存商品自动进入队列,采用不规则仿生动态延迟(3s-5s随机停顿)依次执行网络清洗,完美拟态人类行为。常驻重置与✍️功能。 // @author Gemini // @match *://t.jd.com/* // @match *://item.jd.com/* // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @connect item.m.jd.com // @connect search.m.dangdang.com // @connect * // ==/UserScript== (function() { 'use strict'; const CONFIG = { FOLLOW: { card: '.item-inner', price: '.p-price' }, ITEM: { anchor: '.product-price-panel' } }; let lastItemSku = null; let requestQueue = []; // 仿生网络请求排队队列 let isQueueRunning = false; // 队列执行锁 let processingSkus = new Set(); // 正在或已进入网络排队序列的SKU洗牌池 function getPageType() { if (window.location.host.includes('item.jd.com')) return 'ITEM'; return 'FOLLOW'; } const currentPage = getPageType(); console.log(`🚀 【全能王 V3.0-Auto】启动![仿生学异步延迟限速总线] 已挂载,正在接管全线自动查询...`); // 💾 【数据库读取】 function getPriceCache(sku) { const key = `jd_book_cache_${sku}`; const cached = GM_getValue(key, null); if (cached) { try { return JSON.parse(cached); } catch (e) { return null; } } return null; } // 💾 【数据库写入】 function setPriceCache(sku, marketPrice) { const key = `jd_book_cache_${sku}`; const data = { marketPrice: marketPrice, time: new Date().getTime() }; GM_setValue(key, JSON.stringify(data)); } // 💾 【数据库单重置】 function removePriceCache(sku) { const key = `jd_book_cache_${sku}`; GM_deleteValue(key); } // 🔍 【精准ISBN提取雷达】 function getIsbnNum() { const isbnDivs = document.querySelectorAll('div.text[title]'); for (let div of isbnDivs) { const titleVal = div.getAttribute('title').trim(); if (/^\d{10,13}$/.test(titleVal)) { return titleVal; } } const bodyText = document.body.innerHTML; const match = bodyText.match(/97[89]\d{10}/); return match ? match[0] : null; } // 📊 【动态折算雷达】 function calculateDiscount(sku, marketPrice, elementContext) { let currentPrice = null; const isDetailPage = (currentPage === 'ITEM'); if (isDetailPage) { const grayPrice = document.querySelector('.product-price-gray-line-through') || document.querySelector('.product-price--gray-line-through'); const mainPrice = document.querySelector(`.J-p-${sku}`) || document.querySelector('.p-price .price') || document.querySelector('.product-price-panel .price'); const priceEl = grayPrice || mainPrice; if (priceEl && priceEl.innerText) { const m = priceEl.innerText.replace(/\s/g, '').match(/\d+\.\d{1,2}/) || priceEl.innerText.replace(/\s/g, '').match(/\d+/); if (m) currentPrice = parseFloat(m[0]); } } else { const targetNode = elementContext || document.querySelector(`.gemini-status-${sku}`)?.parentNode; if (targetNode && targetNode.innerText) { const m = targetNode.innerText.replace(/\s/g, '').match(/\d+\.\d{1,2}/) || targetNode.innerText.replace(/\s/g, '').match(/\d+/); if (m) currentPrice = parseFloat(m[0]); } } return (currentPrice && marketPrice > 0) ? ((currentPrice / marketPrice) * 10).toFixed(2) : null; } // ✍️ 【主动唤起:弹窗强制手动录入】 function handleManualInputPopup(sku, targetContainer, currentStatusNode) { const userPrice = prompt(`【全能王常驻录入】请输入该书的正确定价(元),数据将强制覆写并永久冷冻:`); if (userPrice !== null) { const parsedPrice = parseFloat(userPrice); if (!isNaN(parsedPrice) && parsedPrice > 0) { setPriceCache(sku, parsedPrice); console.log(`[全能王审计] 🟢 用户通过 ✍️ 图标手动录入定价: ¥${parsedPrice},缓存已被重写。`); document.querySelectorAll(`.gemini-tag-${sku}, .gemini-status-${sku}`).forEach(el => el.remove()); const discount = calculateDiscount(sku, parsedPrice, currentPage === 'ITEM' ? null : currentStatusNode?.parentNode); injectDisplay(targetContainer, parsedPrice, discount, sku, currentStatusNode); } else { alert("请输入正确的价格数字!"); } } } // 🔄 终极兜底降级:系统查无价格时转为占位提示状态 function triggerManualInput(sku, statusSpan, targetContainer, reason) { console.log(`[全能王审计] SKU: ${sku} 自动查询受阻,原因: ${reason}`); statusSpan.innerText = "⚠️无定价(点击录入)"; statusSpan.style.background = "#f0ad4e"; statusSpan.style.cursor = "pointer"; statusSpan.onclick = function(e) { e.preventDefault(); e.stopPropagation(); handleManualInputPopup(sku, targetContainer, statusSpan); }; } // 📡 【关注页风控专用:转向引流转换】 function transformToFollowRiskState(statusSpan) { statusSpan.innerText = "🧡🚫风控(请去详情页查)"; statusSpan.style.background = "#ff6a00"; statusSpan.style.cursor = "pointer"; statusSpan.onclick = function(e) { e.preventDefault(); e.stopPropagation(); const cardNode = statusSpan.closest('.item-inner') || statusSpan.parentNode.parentNode; const link = cardNode?.querySelector('a[href*="jd.com"]'); if(link) window.open(link.href, '_blank'); }; } // 📡 【副渠道:当当真核心异步数据总线】 function fetchFromBackupChannel(isbn, sku, statusSpan, targetContainer, onComplete) { statusSpan.innerText = "⏳穿透当当总线..."; const targetUrl = `http://search.m.dangdang.com/search_ajax.php?act=get_product_flow_search&keyword=${isbn}`; GM_xmlhttpRequest({ method: "GET", url: targetUrl, timeout: 6000, headers: { "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1", "X-Requested-With": "XMLHttpRequest" }, onload: function(res) { try { const jsonObject = JSON.parse(res.responseText); if (jsonObject && jsonObject.products && jsonObject.products.length > 0) { let priceMap = {}; let selfOkPrice = null; let maxCount = 0; let modePrice = null; for (let product of jsonObject.products) { const isSpu = String(product.is_spu); const shopId = String(product.shop_id).trim(); const price = parseFloat(product.original_price); const nameStr = String(product.name); if (isSpu === "1" || isSpu === "true") continue; if (price > 0) { if (!/全集|9册|礼盒|大套装|全套/i.test(nameStr)) { priceMap[price] = (priceMap[price] || 0) + 1; if (priceMap[price] > maxCount) { maxCount = priceMap[price]; modePrice = price; } } if (shopId === "0" && !/全集|9册|礼盒|大套装|全套/i.test(nameStr)) { if (!selfOkPrice) selfOkPrice = price; } } } const finalPrice = selfOkPrice || modePrice || parseFloat(jsonObject.products[0].original_price); if (finalPrice > 0) { console.log(`[全能王审计] 🟢 通过【当当核心总线副渠道】自动查得: ¥${finalPrice}`); setPriceCache(sku, finalPrice); const discount = calculateDiscount(sku, finalPrice, statusSpan.parentNode); injectDisplay(targetContainer, finalPrice, discount, sku, statusSpan); if (onComplete) onComplete(); return; } } triggerManualInput(sku, statusSpan, targetContainer, "当当未洗出规范单本指标价"); } catch(e) { triggerManualInput(sku, statusSpan, targetContainer, "解析当当报文崩溃"); } if (onComplete) onComplete(); }, onerror: function() { triggerManualInput(sku, statusSpan, targetContainer, "网络故障(副总线受限)"); if (onComplete) onComplete(); }, ontimeout: function() { triggerManualInput(sku, statusSpan, targetContainer, "副总线超长响应断开"); if (onComplete) onComplete(); } }); } // 📡 【主渠道核心执行核心】 function executeMainChannelRequest(sku, statusSpan, targetContainer, onComplete) { GM_xmlhttpRequest({ method: "GET", url: `https://item.m.jd.com/product/${sku}.html`, timeout: 6000, onload: function(response) { if (response.finalUrl && response.finalUrl.includes('risk_handler')) { console.log(`[全能王审计] 🔴 京东主渠道发起拦截盾保护。`); if (currentPage === 'FOLLOW') { transformToFollowRiskState(statusSpan); if (onComplete) onComplete(); } else { const isbn = getIsbnNum(); if (isbn) fetchFromBackupChannel(isbn, sku, statusSpan, targetContainer, onComplete); else { triggerManualInput(sku, statusSpan, targetContainer, "京东拦截且无ISBN"); if (onComplete) onComplete(); } } return; } try { const html = response.responseText; let marketPrice = null; let mMatch = html.match(/"linePrice"\s*:\s*\{[^}]*?"price"\s*:\s*["'](\d+\.\d{1,2})["']/i); if (mMatch) marketPrice = parseFloat(mMatch[1]); if (marketPrice) { console.log(`[全能王审计] 🟢 通过【京东主渠道】自动查得: ¥${marketPrice}`); setPriceCache(sku, marketPrice); const discount = calculateDiscount(sku, marketPrice, statusSpan.parentNode); injectDisplay(targetContainer, marketPrice, discount, sku, statusSpan); if (onComplete) onComplete(); } else { if (currentPage === 'FOLLOW') { console.log(`[全能王审计] 🔴 关注页半风控,缺失原价数据块。`); transformToFollowRiskState(statusSpan); if (onComplete) onComplete(); } else { const isbn = getIsbnNum(); if (isbn) { console.log(`[全能王审计] 🟡 详情页隐式拦截,无缝转向副总线。`); fetchFromBackupChannel(isbn, sku, statusSpan, targetContainer, onComplete); } else { statusSpan.innerText = "⚠️无定价(通常为套装)"; statusSpan.style.background = "#f0ad4e"; if (onComplete) onComplete(); } } } } catch (e) { if (currentPage === 'FOLLOW') transformToFollowRiskState(statusSpan); else { statusSpan.innerText = "❌解析失败"; statusSpan.style.background = "#d9534f"; } if (onComplete) onComplete(); } }, onerror: function() { if (currentPage === 'FOLLOW') transformToFollowRiskState(statusSpan); else { statusSpan.innerText = "❌超时"; statusSpan.style.background = "#d9534f"; } if (onComplete) onComplete(); } }); } // ⏳ 【核心:仿生学动态限速排队调度机】 function processNextInQueue() { if (requestQueue.length === 0) { isQueueRunning = false; return; } isQueueRunning = true; const task = requestQueue.shift(); // 执行当前任务 executeMainChannelRequest(task.sku, task.statusSpan, task.targetContainer, function() { // 🌟 仿生学灵魂设计:在完成一个任务后,随机停顿 3000ms 到 5000ms 之间不等的任意时间,再看下一本 const randomDelay = Math.floor(Math.random() * 2000) + 3000; console.log(`[仿生限速阀] 💤 随机拟态挂起中,休眠 ${randomDelay} 毫秒以规避反爬频率审计...`); setTimeout(processNextInQueue, randomDelay); }); } // 📡 状态骨架生成器:代替原先的“查定价”按钮,变为隐式状态加载指示器 function createStatusSpan(sku) { const span = document.createElement('span'); span.className = `gemini-status-tag gemini-status-${sku}`; span.innerText = "⏳排队自检..."; span.style.cssText = "display:inline-block; margin-left:8px; padding:1px 6px; font-size:11px; color:#fff; background:#17a2b8; border-radius:10px;"; return span; } function injectDisplay(container, mPrice, discount, sku, oldStatusEl) { if (document.querySelector(`.gemini-tag-${sku}`)) return; const isDetailPage = (currentPage === 'ITEM'); const wrap = document.createElement('span'); wrap.className = `gemini-price-tag gemini-tag-${sku}`; wrap.setAttribute('data-sku', sku); wrap.setAttribute('data-market-price', mPrice); wrap.style.cssText = isDetailPage ? "display:inline-block; margin-left:10px; color:#999; font-size:13px; vertical-align:middle;" : "display:inline-block; margin-left:6px; color:#999; font-size:12px; vertical-align:middle;"; wrap.innerHTML = `定价:¥${mPrice}${discount ? ` [${discount}折]` : ''}`; // 🔄 重置按钮 const resetBtn = document.createElement('a'); resetBtn.href = "javascript:void(0);"; resetBtn.innerText = "🔄"; resetBtn.title = "清除此书本地缓存,重新查询"; resetBtn.style.cssText = "margin-left:5px; text-decoration:none; font-size:11px; cursor:pointer; opacity:0.6; transition:opacity 0.2s;"; resetBtn.onmouseover = function() { this.style.opacity = "1"; }; resetBtn.onmouseout = function() { this.style.opacity = "0.6"; }; resetBtn.onclick = function(e) { e.preventDefault(); e.stopPropagation(); removePriceCache(sku); processingSkus.delete(sku); // 释放洗牌池锁 wrap.remove(); }; wrap.appendChild(resetBtn); // ✍️ 手写录入按钮(仅限详情页常驻) if (isDetailPage) { const manualWriteBtn = document.createElement('a'); manualWriteBtn.href = "javascript:void(0);"; manualWriteBtn.innerText = "✍️"; manualWriteBtn.title = "强制手动修正并录入此书定价"; manualWriteBtn.style.cssText = "margin-left:6px; text-decoration:none; font-size:12px; cursor:pointer; opacity:0.6; transition:opacity 0.2s;"; manualWriteBtn.onmouseover = function() { this.style.opacity = "1"; }; manualWriteBtn.onmouseout = function() { this.style.opacity = "0.6"; }; manualWriteBtn.onclick = function(e) { e.preventDefault(); e.stopPropagation(); handleManualInputPopup(sku, container, null); }; wrap.appendChild(manualWriteBtn); } if (oldStatusEl && oldStatusEl.parentNode) { oldStatusEl.parentNode.replaceChild(wrap, oldStatusEl); } else { if (isDetailPage) { const anchor = document.querySelector('.product-price-gray-line-through') || document.querySelector('.product-price--gray-line-through') || container; if(anchor && anchor.parentNode) anchor.parentNode.appendChild(wrap); } else { container.appendChild(wrap); } } } function scan() { if (currentPage === 'ITEM') { const skuMatch = window.location.href.match(/\/(\d+)\.html/); if (skuMatch) { const sku = skuMatch[1]; if (lastItemSku && lastItemSku !== sku) { document.querySelectorAll('[class*="gemini-tag-"], [class*="gemini-btn-"], [class*="gemini-status-"], .gemini-price-tag').forEach(el => el.remove()); } lastItemSku = sku; const existTag = document.querySelector(`.gemini-tag-${sku}`); if (existTag) { const discountInside = existTag.querySelector('.gemini-discount-inside'); if (discountInside && discountInside.innerHTML === '') { const mPrice = parseFloat(existTag.getAttribute('data-market-price')); const discount = calculateDiscount(sku, mPrice, null); if (discount) discountInside.innerHTML = ` [${discount}折]`; } } else if (!document.querySelector(`.gemini-status-${sku}`)) { const anchor = document.querySelector(CONFIG.ITEM.anchor); if (anchor) { const cache = getPriceCache(sku); if (cache) { console.log(`[全能王审计] 🟢 SKU: ${sku} 详情页缓存直接闪放。`); const discount = calculateDiscount(sku, cache.marketPrice, null); injectDisplay(anchor, cache.marketPrice, discount, sku, null); } else { // 🚀 核心自动逻辑:未缓存时,自动塞入单线仿生执行队列 if (!processingSkus.has(sku)) { processingSkus.add(sku); const statusSpan = createStatusSpan(sku); const grayPrice = document.querySelector('.product-price-gray-line-through') || document.querySelector('.product-price--gray-line-through'); if (grayPrice && grayPrice.parentNode) { grayPrice.parentNode.insertBefore(statusSpan, grayPrice.nextSibling); } else if (anchor.parentNode) { anchor.parentNode.appendChild(statusSpan); } requestQueue.push({ sku, statusSpan, targetContainer: anchor }); if (!isQueueRunning) processNextInQueue(); } } } } } } else { document.querySelectorAll(CONFIG.FOLLOW.card).forEach(card => { const link = card.querySelector('a[href*="jd.com"]'); const priceArea = card.querySelector(CONFIG.FOLLOW.price); if (link && priceArea) { const match = link.href.match(/\/(\d{6,15})/); if (match) { const sku = match[1]; const existTag = card.querySelector(`.gemini-tag-${sku}`); if (existTag) { const discountInside = existTag.querySelector('.gemini-discount-inside'); if (discountInside && discountInside.innerHTML === '') { const mPrice = parseFloat(existTag.getAttribute('data-market-price')); const discount = calculateDiscount(sku, mPrice, priceArea); if (discount) discountInside.innerHTML = ` [${discount}折]`; } } else if (!card.querySelector(`.gemini-status-${sku}`)) { const cache = getPriceCache(sku); if (cache) { const holder = document.createElement('span'); priceArea.appendChild(holder); const discount = calculateDiscount(sku, cache.marketPrice, priceArea); injectDisplay(priceArea, cache.marketPrice, discount, sku, holder); } else { // 🚀 核心自动逻辑:关注页多本书未缓存时,自动有序加入大队列排队执行 if (!processingSkus.has(sku)) { processingSkus.add(sku); const statusSpan = createStatusSpan(sku); priceArea.appendChild(statusSpan); requestQueue.push({ sku, statusSpan, targetContainer: priceArea }); if (!isQueueRunning) processNextInQueue(); } } } } } }); } } setInterval(scan, 1500); })();