您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
精简的比价助手,查看价格曲线和比价,暂时只支持京东和天猫,其中天猫只支持价格曲线, 显示在商品详情页面的价格后面。本脚本为购物党比价脚本的精简版,数据均来源于购物党,如果需要完整版请使用购物党官方脚本或扩展。
// ==UserScript== // @name 比价助手 // @description 精简的比价助手,查看价格曲线和比价,暂时只支持京东和天猫,其中天猫只支持价格曲线, 显示在商品详情页面的价格后面。本脚本为购物党比价脚本的精简版,数据均来源于购物党,如果需要完整版请使用购物党官方脚本或扩展。 // @namespace https://greasyfork.org/zh-CN/scripts/373964-%E6%AF%94%E4%BB%B7%E5%8A%A9%E6%89%8B // @version 0.10 // @author silentmoon // @copyright silentmoon // @include http*://item.jd.com* // @include http*://*detail.tmall.com* // @grant GM_xmlhttpRequest // @connect gwdang.com // @require https://cdn.bootcss.com/echarts/4.7.0/echarts.min.js // @require https://cdn.bootcss.com/jquery/3.5.1/jquery.min.js // ==/UserScript== var jq142 = jQuery.noConflict(true); (function() { 'use strict'; var hideTimeout; var hideCompareTimeout; var obj; var bgInsertTo; var priceinsertTo; var priceLeft; var priceTop; var compareLeft; var compareTop; setTimeout(function() { init(); }, 1000); function init() { if (location.hostname.indexOf("item.jd.com") == 0) { bgInsertTo = ".dd > .p-price"; priceinsertTo = ".summary-price"; priceLeft = -1; priceTop = 37; compareLeft = 150; compareTop = 37; } else if (location.hostname.indexOf("detail.tmall.com") >= 0) { if (jq142('.tm-promo-price > .tm-price').length > 0) { bgInsertTo = ".tm-promo-price > .tm-price"; } else { bgInsertTo = ".tm-price"; } priceinsertTo = ".tb-wrap > .tm-fcs-panel"; priceLeft = 460; priceTop = 174; compareLeft = 600; compareTop = 174; } if (location.hostname.indexOf("item.jd.com") == 0) { jq142("<span class='bj-bg3' style='display: none;' ><a href='#none' style='vertical-align: 2px ;text-decoration:underline;'>到手价:</a> <span class='bj-bg3-realPrice' style='color:red;vertical-align: 2px ;'> ⠀⠀</span></span>").insertAfter(jq142(bgInsertTo)); jq142("<div class='bj-realPrice' style='box-shadow: 0 5px 15px 0 rgba(23,25,27,.15);display: none;background: #fff;position: absolute;clear: both;background-color: white;height: 150px; z-index: 999999;margin: 0;padding: 0;border-radius: 0 0 4px 4px;left: " + compareLeft + "px;top: " + compareTop + "px;width: 250px;border: 1px solid #ddd;border-top: none;'></div>").insertAfter(jq142(priceinsertTo)); jq142(".bj-realPrice").append("<ul class='bj_realPrice_list'></ul>"); } jq142("<span> </span><a class='bj-bg' href='#none' style='vertical-align: 2px ;text-decoration:underline '>价格曲线</a><span class='bj-bg1'>⠀⠀</span>").insertAfter(jq142(".bj-bg3")); jq142("<div class='bj-price' style='box-shadow: 0 5px 15px 0 rgba(23,25,27,.15);display: none;background: #fff;position: absolute;clear: both;background-color: white;height: 400px; z-index: 999999;margin: 0;padding: 0;border-radius: 0 0 4px 4px;left: " + priceLeft + "px;top: " + priceTop + "px;width: 750px;border: 1px solid #ddd;border-top: none;'></div>").insertAfter(jq142(priceinsertTo)); jq142(".bj-price").append("<div style='margin-left:50px;margin-top:20px;display: block;'><a class='active-plot type-plot' id='plotAll'>全部</a><a class='type-plot' id='plotYear'>年线</a><a class='type-plot' id='plotMonth'>月线</a>"); jq142(".bj-price").append("<div id='main-price' style='width: 720px;height:350px;margin: 0;padding: 0'></div>"); if (location.hostname.indexOf("item.jd.com") == 0) { jq142("<a class='bj-bg2' href='#none' style='vertical-align: 2px ;text-decoration:underline '>价格比较</a><span>⠀⠀</span>").insertAfter(jq142(".bj-bg1")); jq142("<div class='bj-compare' style='box-shadow: 0 5px 15px 0 rgba(23,25,27,.15);display: none;background: #fff;position: absolute;clear: both;background-color: white;height: 400px; z-index: 999999;margin: 0;padding: 0;border-radius: 0 0 4px 4px;left: " + compareLeft + "px;top: " + compareTop + "px;width: 250px;border: 1px solid #ddd;border-top: none;'></div>").insertAfter(jq142(priceinsertTo)); jq142(".bj-compare").append("<ul class='bj_buy_list'></ul>"); } jq142(".type-plot").css({ "cursor": "pointer", "padding-left": "10px", "padding-right": "10px", "text-decoration": "underline" }); jq142(".active-plot").css({ "text-decoration": "none", "font-weight": "bold" }); jq142(".bj-bg").mouseover(function() { jq142(".bj-price").show(); }).mouseout(function() { hideTimeout = setTimeout(function() { jq142(".bj-price").hide(); }, 200); }); jq142(".bj-bg3").mouseover(function() { jq142(".bj-realPrice").show(); }).mouseout(function() { jq142(".bj-realPrice").hide(); }); jq142(".bj-price").mouseenter(function() { clearTimeout(hideTimeout); }).mouseleave(function() { jq142(".bj-price").hide(); }); jq142(".bj-bg2").mouseover(function() { jq142(".bj-compare").show(); }).mouseout(function() { hideCompareTimeout = setTimeout(function() { jq142(".bj-compare").hide(); }, 200); }); jq142(".bj-compare").mouseenter(function() { clearTimeout(hideCompareTimeout) }).mouseleave(function() { jq142(".bj-compare").hide(); }); jq142(".type-plot").click(function(e) { jq142(".type-plot").css({ "text-decoration": "underline", "font-weight": "normal" }); jq142(e.target).css({ "text-decoration": "none", "font-weight": "bold" }); var data1; if (e.target.id == "plotAll") { if (obj.store.length > 1) { data1 = obj.store[1].all_line; } showChart(obj.store[0].all_line, obj.store[0].all_line_begin_time, data1); } else if (e.target.id == "plotYear") { if (obj.store.length > 1) { data1 = obj.store[1].year_line; } showChart(obj.store[0].year_line, obj.store[0].year_line_time, data1); } else if (e.target.id == "plotMonth") { if (obj.store.length > 1) { data1 = obj.store[1].month_line; } showChart(obj.store[0].month_line, obj.store[0].month_line_time, data1); } }); var myChart = echarts.init(document.getElementById('main-price')); var url = location.href; var gwdUrl = "https://browser.gwdang.com/extension/price_towards?ver=1&format=jsonp&&url=" + encodeURIComponent(url); GM_xmlhttpRequest({ url: "https://browser.gwdang.com/extension/price_towards?ver=1&format=jsonp&&url=" + encodeURIComponent(url), method: 'GET', timeout: 10000, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'Cache-Control': 'public' }, onload: function(data) { obj = JSON.parse(data.responseText); if (obj.is_ban == 1) { console.log('ssss'); opWind(obj.action.to, '1', '请验证后刷新页面!', ''); return; } if (obj.store[0].all_line == null) { jq142("#plotAll").hide(); } if (obj.store[0].year_line == null) { jq142("#plotYear").hide(); } if (obj.store[0].month_line == null) { jq142("#plotMonth").hide(); } var data1; if (obj.store.length > 1) { data1 = obj.store[1].all_line; } showChart(obj.store[0].all_line, obj.store[0].all_line_begin_time, data1); var realPriceData; var promo; if (obj.nopuzzle_promo) { promo = obj.nopuzzle_promo; } else if (obj.promo) { promo = obj.promo; } else { return; } if (promo.length > 0) { realPriceData = promo[promo.length - 1]; if (realPriceData.time == obj.now_day / 1000 - 28800) { jq142(".bj-bg3-realPrice").text(realPriceData.price / 100); jq142(".bj-bg3").show(); var html = ""; if (realPriceData.msg) { if (realPriceData.msg.promotion && realPriceData.msg.promotion.indexOf("plus") < 0) { html += "<li class='bj_li'> <span class='bj_gwd_title' style='padding-left:10px;'>促</span><span class='bj_c_price '>" + realPriceData.msg.promotion + "</span></li>"; } if (realPriceData.msg.coupon) { html += "<li class='bj_li'> <span class='bj_gwd_title' style='padding-left:10px;'>券</span><span class='bj_c_price '>" + realPriceData.msg.coupon + "</span></li>"; } } jq142(".bj_realPrice_list").append(html); } } } }); var compareUrl = "https://browser.gwdang.com/brwext/dp_query_latest?permanent_id=&union=union_gwdang&url=" + encodeURIComponent(url); GM_xmlhttpRequest({ url: compareUrl, method: 'GET', timeout: 10000, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'Cache-Control': 'public' }, onload: function(data) { var jsonStr = data.responseText; if (!jsonStr) { return; } var d = JSON.parse(jsonStr).b2c.store; for (var i = 0; i < d.length; i++) { var html = "<li class='bj_li'><img class='bj_store' src='" + d[i].icon_url + "'><a href='" + getParam(d[i].url, "target_url") + "' title='" + d[i].site_name + "' target='_blank'><span class='bj_gwd_title '>" + d[i].site_name + "</span><span class='bj_c_price '>" + d[i].price / 100 + "</span></a></li>"; jq142(".bj_buy_list").append(html); } jq142(".bj_store").css({ "float": "left", "overflow": "hidden", "margin": "8px 7px 4px 14px", "width": "16px", "height": "16px" }); jq142(".bj_gwd_title").css({ "height": "33px", "margin": "0", "float": "left", "font-size": "14px", "font-weight": "700", "max-width": "170px", "overflow": "hidden", "width": "auto" }); jq142(".bj_c_price").css({ "color": "#E4393C", "font-weight": "700", "line-height": "33px", "height": "33px", "width": "auto", "float": "right", "font-size": "14px", "margin-right": "14px" }); jq142(".bj_li").css({ "border-bottom": "1px solid #edf1f2", "overflow": "hidden", "width": "100%", "height": "33px", "line-height": "33px" }); } }); function showChart(data, beginTime, data1) { var dt = []; for (var i = 0; i < data.length; i++) { var d = new Date(beginTime); d.setDate(d.getDate() + i); dt.push(d.toLocaleDateString()); } // 指定图表的配置项和数据 var option = { tooltip: { enterable: true, trigger: 'axis', formatter: function(params) { return params[0].axisValue + "<br/>" + params[0].data; }, axisPointer: { animation: false } }, legend: { data: ['页面价', '到手价'], selected: { '到手价': false } }, xAxis: { data: dt, splitArea: { show: false }, boundaryGap: false, splitLine: { show: true, }, axisLabel: { interval: parseInt((data.length) / 10), formatter: function(value) { return value.substring(5); } }, }, yAxis: { splitArea: { show: false }, splitLine: { show: true, } }, series: [{ name: '页面价', type: 'line', data: data, showSymbol: false, hoverAnimation: false, markPoint: { symbol: 'pin', data: [ { type: 'max', name: '最大值' }, { type: 'min', name: '最小值' } ] }, markLine: { data: [ { type: 'average', name: '平均值' } ] } }, { name: '到手价', type: 'line', data: data1, showSymbol: false, hoverAnimation: false, markPoint: { symbol: 'pin', data: [ { type: 'max', name: '最大值' }, { type: 'min', name: '最小值' } ] }, markLine: { data: [ { type: 'average', name: '平均值' } ] } } ] }; myChart.setOption(option); } } function opWind(purl, pisweb, pname, phml) { var url = purl; var name = pname; var iWidth = 800; var iHeight = 450; var iTop = (window.screen.height - 30 - iHeight) / 2; var iLeft = (window.screen.width - 10 - iWidth) / 2; var insWind = document.createElement("iframe"); // insWind.src = "javascript:(function(){document.write("+insWind+")})()"; insWind.innerHTML = phml; document.body.appendChild(insWind); } function getParam(url, paramName) { var reg = new RegExp("(^|&)" + paramName + "=([^&]*)(&|jq142)", "i"); var r = url.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } })();