// ==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);
})();