Greasy Fork

Greasy Fork is available in English.

Steam、Epic历史价格查询

跳转到SteamDB、EpicGamesDB,兼容via和x浏览器

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name                Steam、Epic历史价格查询
// @name:zh-TW          Steam、Epic歷史價格查詢
// @name:en             Steam and Epic Historical Price Lookup
// @name:ja             Steam and Epic Historical Price Lookup
// @name:ko             Steam and Epic Historical Price Lookup
// @name:ru             Steam and Epic Historical Price Lookup
// @description         跳转到SteamDB、EpicGamesDB,兼容via和x浏览器
// @description:zh-TW   跳轉到 SteamDB、EpicGamesDB,兼容via和x瀏覽器
// @description:en      Navigate to SteamDB, EpicGamesDB, compatible with Via and X browsers
// @description:ja      Navigate to SteamDB, EpicGamesDB, compatible with Via and X browsers
// @description:ko      Navigate to SteamDB, EpicGamesDB, compatible with Via and X browsers
// @description:ru      Navigate to SteamDB, EpicGamesDB, compatible with Via and X browsers
// @author       shopkeeperV
// @namespace    http://greasyfork.icu/zh-CN/users/150069
// @version      1.1.7
// @run-at       document-end
// @match        https://store.steampowered.com/*
// @match        https://store.epicgames.com/*
// ==/UserScript==

(function () {
    'use strict';
    let host = location.host;
    let path = location.pathname;
    let db_url;
    if (/steampowered/.test(host)) {
        let page_type;
        let title_eles;
        let page_id = path.match(/\/([0-9]*?)\//i)[1];
        if (/app/.test(path)) {
            title_eles = document.getElementsByClassName("apphub_AppName");
            let wrappers = document.getElementsByClassName("game_area_purchase_game_wrapper");
            page_type = "app";
            //@run-at声明在各浏览器中表现不一致,所以为了兼容麻烦得要死
            let wait = function () {
                if (title_eles.length > 0 && wrappers.length > 0) {
                    for (let wrapper of wrappers) {
                        let item_type;
                        let item_id;
                        let forms = wrapper.getElementsByTagName("form");
                        if (forms.length < 0) {
                            continue;
                        }
                        let inputs = forms[0].getElementsByTagName("input");
                        for (let input of inputs) {
                            if (/subid|bundleid/.test(input.name)) {
                                if (/subid/.test(input.name)) {
                                    item_type = "sub";
                                } else if (/bundleid/.test(input.name)) {
                                    item_type = "bundle";
                                }
                                item_id = input.value;
                                break;
                            }
                        }
                        db_url = "https://steamdb.info/" + item_type + "/" + item_id + "/#pricehistory";
                        let titles = wrapper.getElementsByClassName("title");
                        if (titles.length > 0) {
                            titles[0].appendChild(createASpan(db_url));
                        }
                    }
                    set();
                } else {
                    setTimeout(wait, 500);
                }
            }
            wait();
        } else {
            title_eles = document.getElementsByClassName("pageheader");
            if (/sub/.test(path)) {
                page_type = "sub";
            } else if (/bundle/.test(path)) {
                page_type = "bundle";
            } else return;
            let wait = function () {
                if (title_eles.length > 0) {
                    set();
                } else {
                    setTimeout(wait, 500);
                }
            }
            wait();
        }

        function set() {
            for (let title_ele of title_eles) {
                db_url = "https://steamdb.info/" + page_type + "/" + page_id + "/#pricehistory";
                title_ele.appendChild(createASpan(db_url));
            }
        }
    }
    if (/epicgames/.test(host)) {
        //跳过年龄验证
        document.cookie = `HasAcceptedAgeGates=Generic%3A18;path=/`;
        let loop_times = 0;
        handler();
        //onurlchange兼容性不佳
        const originalPushState = history.pushState;
        const originalReplaceState = history.replaceState;
        //popstate事件监听不到,可以拦截相应方法达到同样的效果
        history.pushState = function (state) {
            originalPushState.apply(history, arguments);
            console.log("Epic历史价格查询:监听到地址变化。pushState()调用。");
            handler();
        };
        //此方法只是备用,epic并不是用这个
        history.replaceState = function (state) {
            originalReplaceState.apply(history, arguments);
            console.log("Epic历史价格查询:监听到地址变化,replaceState()调用。");
            handler();
        };

        function handler() {
            if (loop_times >= 60) {
                loop_times = 0;
                console.log("Epic历史价格查询:取消循环。");
                return;
            }
            if (/\/p\//.test(location.pathname)) {
                console.log("Epic历史价格查询:正在获取页面id...");
                let ele1 = document.getElementById("_schemaOrgMarkup-Product");
                let ele2 = document.getElementById("btn_age_continue");
                if (ele1 && !ele2 && !ele1.getAttribute("price_db")) {
                    ele1.setAttribute("price_db", "price_db");
                    loop_times = 0;
                    console.log("Epic历史价格查询:已添加查询按钮。");
                    let content = ele1.textContent;
                    let id = content.match(/"sku":"([^"]*):([^"]*)"/)[2];
                    db_url = "https://egdata.app/offers/" + id + "/price";
                    document.getElementsByTagName("h1")[0].appendChild(createASpan(db_url));
                } else {
                    loop_times++;
                    setTimeout(handler, 500);
                }
            }
        }
    }

    function createASpan(url) {
        let span = document.createElement("span");
        span.setAttribute("class", "history_price");
        span.textContent = "查价";
        span.style.cssText = "display:inline-block;margin-left:10px;color:yellow;cursor:pointer;";
        span.onclick = (e) => {
            window.open(url);
        };
        return span;
    }
})();