电商历史价格查询

看看历史价格 拒绝当小白鼠

当前为 2020-11-14 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         电商历史价格查询
// @namespace    http://shawjie.cn
// @version      1.0.0
// @description 看看历史价格 拒绝当小白鼠
// @author       ShawJie
// @match        https://item.jd.com/*
// @match        https://detail.tmall.com/item.htm*
// @match        https://item.taobao.com/item.htm*
// ==/UserScript==

(function() {
    'use strict';

    var data = {
        mainQueryPath: 'https://tool.manmanbuy.com/',
        subQueryPath: 'historyLowest.aspx?url=',
        mallPattern: {
            Jd: /^http[s]?:\/\/item\.jd\.com\/\d+\.html/,
            Tmall: /^http[s]:\/\/detail\.tmall\.com\/item\.htm/,
            Taobao: /^https?:\/\/item\.taobao\.com\/item\.htm/
        },
        icon: '<svg t="1600605970684" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3197" ><path d="M560.64 857.6c0 24.32-17.92 25.6-39.68 25.6-21.76 0-39.68-1.28-39.68-25.6V638.72h78.08V857.6z" fill="#CBC487" p-id="3198"></path><path d="M522.24 896c-19.2 0-52.48 0-52.48-38.4V638.72c0-7.68 5.12-12.8 12.8-12.8h78.08c7.68 0 12.8 5.12 12.8 12.8V857.6c0 38.4-32 38.4-51.2 38.4z m-26.88-244.48V857.6c0 8.96 0 12.8 26.88 12.8s26.88-2.56 26.88-12.8V651.52h-53.76z" fill="#231C1C" p-id="3199"></path><path d="M714.24 304.64c-5.12-153.6-101.12-217.6-189.44-217.6h-3.84c-88.32 0-185.6 61.44-190.72 217.6v334.08h385.28s-1.28-328.96-1.28-334.08z" fill="#B8CA43" p-id="3200"></path><path d="M715.52 651.52H330.24c-3.84 0-6.4-1.28-8.96-3.84-2.56-2.56-3.84-5.12-3.84-8.96V304.64c5.12-168.96 112.64-229.12 203.52-229.12h3.84c97.28 0 197.12 70.4 202.24 229.12v334.08c0 3.84-1.28 6.4-3.84 8.96-1.28 2.56-5.12 3.84-7.68 3.84z m-372.48-25.6h359.68V304.64c-5.12-151.04-98.56-204.8-176.64-204.8h-3.84c-78.08 0-172.8 53.76-177.92 204.8-1.28 6.4-1.28 206.08-1.28 321.28z" fill="#231C1C" p-id="3201"></path><path d="M715.52 344.32v-38.4c-5.12-153.6-101.12-217.6-189.44-217.6h-3.84c-88.32 0-185.6 61.44-190.72 217.6v38.4H396.8v75.52c0 14.08 11.52 26.88 25.6 26.88s25.6-11.52 25.6-26.88v-75.52h52.48v126.72c0 14.08 11.52 26.88 25.6 26.88s25.6-11.52 25.6-26.88v-126.72h52.48v37.12c0 14.08 11.52 26.88 25.6 26.88s25.6-11.52 25.6-26.88v-37.12h60.16z" fill="#FDE8C2" p-id="3202"></path><path d="M522.24 510.72c-20.48 0-38.4-17.92-38.4-39.68v-113.92h-26.88v62.72c0 21.76-16.64 39.68-38.4 39.68-20.48 0-38.4-17.92-38.4-39.68v-62.72h-52.48c-3.84 0-6.4-1.28-8.96-3.84-2.56-2.56-3.84-5.12-3.84-8.96v-39.68C320 135.68 427.52 75.52 518.4 75.52h6.4c97.28 0 197.12 70.4 202.24 229.12v39.68c0 3.84-1.28 6.4-3.84 8.96-2.56 2.56-5.12 3.84-8.96 3.84h-52.48v24.32c0 21.76-16.64 39.68-38.4 39.68-20.48 0-38.4-17.92-38.4-39.68v-24.32h-26.88v113.92c2.56 21.76-14.08 39.68-35.84 39.68z m-76.8-179.2h52.48c7.68 0 12.8 5.12 12.8 12.8v126.72c0 7.68 5.12 14.08 12.8 14.08s12.8-6.4 12.8-14.08v-126.72c0-7.68 5.12-12.8 12.8-12.8H601.6c7.68 0 12.8 5.12 12.8 12.8v37.12c0 7.68 5.12 14.08 12.8 14.08s12.8-6.4 12.8-14.08v-37.12c0-7.68 5.12-12.8 12.8-12.8h52.48v-25.6c-5.12-151.04-98.56-204.8-177.92-204.8h-3.84c-78.08 0-172.8 53.76-177.92 204.8v25.6h52.48c7.68 0 12.8 5.12 12.8 12.8v75.52c0 7.68 5.12 14.08 12.8 14.08 6.4 0 12.8-6.4 12.8-14.08v-75.52c-3.84-7.68 1.28-12.8 8.96-12.8z" fill="#231C1C" p-id="3203"></path></svg>',
        closeIcon: '<svg t="1605027968686" class="icon" viewBox="0 0 1025 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5352"><path d="M512.775 48.024c255.612 0 464.75 209.138 464.75 464.75s-209.138 464.751-464.75 464.751-464.75-209.138-464.75-464.75 209.137-464.75 464.75-464.75m0-46.476C230.826 1.55 1.549 230.826 1.549 512.775S230.826 1024 512.775 1024 1024 794.723 1024 512.775 794.723 1.549 512.775 1.549z" fill="#ffffff" p-id="5353"></path><path d="M336.17 309.834c-6.197 0-13.943 3.098-18.59 7.745-10.845 10.845-10.845 26.336 0 37.18l354.759 354.76c4.647 4.647 12.393 7.746 18.59 7.746s13.942-3.099 18.59-7.746c10.844-10.844 10.844-26.336 0-37.18L353.21 317.579c-4.647-6.196-10.844-7.745-17.04-7.745z" fill="#ffffff" p-id="5354"></path><path d="M689.38 309.834c-6.197 0-13.943 3.098-18.59 7.745L317.58 672.34c-10.845 10.844-10.845 26.336 0 37.18 4.647 4.647 12.393 7.746 18.59 7.746 6.196 0 13.942-3.099 18.59-7.746l354.759-354.76c10.844-10.844 10.844-26.335 0-37.18-6.197-6.196-12.393-7.745-20.14-7.745z" fill="#ffffff" p-id="5355"></path></svg>',
        textDesc: '历史价格',
        fadeId: 'close-able-history-fade'
    };

    var methods = {
        initialLogic: (path) => {
            let mallCase = undefined;
            for (let pattern in data.mallPattern) {
                if (data.mallPattern[pattern].test(path)) {
                    mallCase = pattern;
                    break;
                }
            }
            if (mallCase == undefined) {
                return;
            }

            const provider = eval(`new ${mallCase}Provider`);
            provider.render();
        }
    }

    class BasicProvider {
        constructor(){
            this.defaultCallback = (container) => {
                let div = document.createElement('div');
                div.style.cssText = `width: 35px;
                    height: 35px; padding: 7.5px;
                    cursor: pointer;position: fixed;
                    background-color: beige; border-radius: 50%;
                    box-shadow: 0px 0px 24px 0px rgba(138,138,138,0.49);
                    right: 5rem; bottom: 3rem;`;
                div.title = `${data.textDesc}`;
                div.innerHTML += `${data.icon}`;

                div.addEventListener('click', (target) => {
                    this.apareHistory();
                });

                container.parentNode.appendChild(div);
            };
        }

        apareHistory() {
            this.abstractFade(() => {
                const container = document.getElementById(data.fadeId);

                let height = container.offsetHeight;
                let width = container.offsetWidth;

                const divContainer = document.createElement('div');
                divContainer.style.cssText = `position: absolute; top: 50%; left: 50%;
                      transform: translate(-50%, -50%); border: 0px;
                      border-radius: 15px; overflow-x: hidden;
                      background-color: #fff; overflow: hidden;`;

                divContainer.style.width = `${width * 0.7}px`;
                divContainer.style.height = `${height * 0.7}px`;

                const iframeDomName = 'history-price-frame';

                const historyPricePage = `${data.mainQueryPath}${data.subQueryPath}${encodeURIComponent(window.location)}`;
                const iframeDom = document.createElement('iframe');
                iframeDom.src = historyPricePage;
                iframeDom.name = iframeDomName;
                iframeDom.width = width * 0.7;
                iframeDom.height = 3000;

                divContainer.appendChild(iframeDom);
                container.appendChild(divContainer);

                iframeDom.style.cssText = `margin-top: -52vh`;
                iframeDom.scrolling = 'no';
            });
        }

        abstractRender(targetContainer, callback) {
            const body = window.document;

            let tabContainer;
            let tryTime = 0;
            const maxTryTime = 30;

            if (callback == undefined) {
                callback = this.defaultCallback;
            }

            let interval = setInterval(() => {
                tabContainer = body.querySelector(targetContainer);
                if (tabContainer) {
                    clearInterval(interval);
                    callback(tabContainer);
                }
                if ((++tryTime) == maxTryTime) {
                    clearInterval(interval);
                }
            }, 1000);
        }

        abstractFade(callback) {
            const body = document.getElementsByTagName('body')[0];

            const fadeDom = document.createElement('div');
            fadeDom.id = data.fadeId;
            fadeDom.style.cssText = `z-index: 99999; width: 100%; height: 100vh; background-color: rgba(0, 0, 0, 0.85); position: fixed; top: 0; left: 0;`;
            const closeBtn = document.createElement('div');
            closeBtn.style.cssText = 'position: absolute; top: 2rem; right: 2rem; width: 35px; height: 35px; cursor: pointer';
            closeBtn.innerHTML = data.closeIcon;
            closeBtn.addEventListener('click', e => {
                fadeDom.parentNode.removeChild(fadeDom);
            });

            fadeDom.appendChild(closeBtn);
            body.appendChild(fadeDom);

            if ((typeof callback) == 'function') {
                callback();
            }
        }
    }


    class JdProvider extends BasicProvider {
        render() {
            const callback = (container) => {
                let div = document.createElement('div');
                div.className = 'J-trigger jdm-toolbar-tab';
                let em = document.createElement('em');
                em.className = 'tab-text';
                em.innerHTML = `${data.textDesc}`;

                div.innerHTML += `${data.icon}`;
                div.lastChild.classList.add('tab-ico');
                div.appendChild(em);

                div.addEventListener('click', (target) => {
                    this.apareHistory();
                });

                container.appendChild(div);
            };

            this.abstractRender('.jdm-toolbar-tabs.J-tab', callback);
        }
    }


    class TmallProvider extends BasicProvider {
        render() {
            this.abstractRender('body');
        }
    }

    class TaobaoProvider extends BasicProvider {
        render() {
            this.abstractRender('body');
        }
    }

    try {
        methods.initialLogic(window.location);
    }catch(message){
        console.warn(message);
    }
})();