电商历史价格查询

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

As of 2020-11-14 16:29:31 UTC. See the latest version.

// ==UserScript==
// @name         电商历史价格查询
// @namespace    http://shawjie.cn
// @version      1.0.1
// @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: 1000000000; 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);
    }
})();