Greasy Fork is available in English.

饰品比例列表计算

饰品比例列表计算查看

// ==UserScript==
// @name         饰品比例列表计算
// @namespace    sourcewater
// @version      0.1.23
// @description  饰品比例列表计算查看
// @author       sourcewater
// @match        https://buff.163.com/market/?game=*
// @match        https://www.c5game.com/dota.html*
// @match        https://www.c5game.com/csgo/default/*
// @match        https://www.igxe.cn/dota2/*
// @match        https://www.igxe.cn/csgo/*
// @grant        GM_xmlhttpRequest
// @connect      www.c5game.com
// @connect      buff.163.com
// @connect      steamcommunity.com
// @connect      steamcommunity-a.akamaihd.net
// ==/UserScript==

(function() {

    let log={
        DEBUG:1,
        INFO:5,
        level:1,
        setLevel:function(level){
            this.level=level;
        },
        log:function(msg,level,prefix){
            let date=new Date();
            let time=date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();
            if(level>=this.level){
                console.log(prefix+time+" >>>> "+msg);
            }
        },
        info:function (msg){
            this.log(msg,this.INFO,"info: ");
        },
        debug:function(msg){
            this.log(msg,this.DEBUG,"debug: ");
        }
    };
    log.setLevel(log.INFO);
    let priceCSSEle=document.createElement("style");
    priceCSSEle.setAttribute("type","text/css");
    const displaySuccessClass="s_s_s_s_display_success";
    const itemidAttr="s_s_s_s_item_id";
    const successAttr="s_s_s_s_success";
    const linkRegAttr="s_s_s_s_click_register";
    const contentChangeAttr="s_s_s_s_content_change";
    const progressDivId="s_s_s_s_progress_div";
    const progressDivAttr="s_s_s_s_progress_init_success";
    const waitingDivId="s_s_s_s_waiting_div";
    const appidList={"csgo":730,"dota2":570};
    const buffUrlReg=/buff\.163\.com\//;
    const c5UrlReg=/c5game\.com\//;
    const igxeUrlReg=/igxe\.cn/;
    const timeout=6000;
    let index=0;
    let progressDivEle=document.createElement("div");
    progressDivEle.setAttribute("id",progressDivId);
    progressDivEle.setAttribute("style","z-index: 999;border-radius:4px; border: 4px solid white; text-align: center;position: absolute;left: 50%;top: 55%;transform: translate(-50%, -50%);background:white;padding:5px;");
    progressDivEle.innerHTML=`
	<p>
	  <strong style="color:black;">正在初始化</strong><br>
	  <progress style="width:200px;height:25px;"></progress>
	</p>
	`;
    document.body.appendChild(progressDivEle);
    let priceCSS=`
        .s_s_s_s_display_success{
            display:block;
        }
        .s_s_s_s_cell_right,
        .s_s_s_s_cell_link,
        .s_s_s_s_cell_after_fee,
        .s_s_s_s_cell_rate,
        .s_s_s_s_cell_rate_high{
            width:50px;
            text-align:right;
        }
        .s_s_s_s_cell_left{
            display:inline-block;
            width:50px;
            text-align:left;
        }
        .s_s_s_s_cell_right{
            color:#eea20e;
        }
        .s_s_s_s_cell_link{
            color:black;
        }
        .s_s_s_s_cell_rate{
            color:green;
        }
        .s_s_s_s_cell_rate_high{
            color:red;
        }
    `;
    let customPriceCss;
    if(buffUrlReg.test(window.location.href)){
        customPriceCss=`
        .s_s_s_s_cell_left{
            color:black;
        }
        .s_s_s_s_display_success{
            margin-left:15px;
            height:167px;
        }
        .s_s_s_s_cell_after_fee{
            color:purple;
        }
        `;
        /*
        let enLocale="Locale-Supported=en;";
        if(document.cookie.lastIndexOf(enLocale)<0){
            document.cookie=enLocale+"path=/";
            window.location.reload();
        }
        */
    }else if(c5UrlReg.test(window.location.href)){
        customPriceCss=`
        .s_s_s_s_cell_left{
            color:white;
        }
        .s_s_s_s_display_success{
            margin-left:15px;
            height:205px;
        }
        .s_s_s_s_cell_after_fee{
            color:#55aa88;
        }
        `;
    }else if(igxeUrlReg.test(window.location.href)){
        customPriceCss=`
        .s_s_s_s_cell_left{
            color:white;
        }
        .s_s_s_s_display_success{
            margin-left:15px;
            height:205px;
        }
        .s_s_s_s_cell_after_fee{
            color:#55aa88;
        }
        `;
    }
    priceCSSEle.innerHTML=priceCSS+customPriceCss;
    document.head.appendChild(priceCSSEle);
    function checkInitCalculate(){
        if(!progressDivEle.getAttribute(progressDivAttr)){
            initCalculate();
            return;
        }
        log.info("init successfully!");
    }
    function initCalculate(){
        setTimeout(function(){checkInitCalculate();},timeout);
        let steamMarketUrl="https://steamcommunity.com/market/";
        let walletVariable="var g_rgWalletInfo = ";
        GM_xmlhttpRequest({
            url: steamMarketUrl,
            method: 'GET',
            //timeout:10000,
            onload: function(res){
                if(res.status === 200){
                    let html=res.responseText;
                    walletVariable+=html.match(/var g_rgWalletInfo(.|\n)*?(\{+?(.|\n)*?\}+?)+/)[2];
                    let varScriptEle=document.createElement("script");
                    varScriptEle.setAttribute("type","text/javascript");
                    varScriptEle.innerHTML=walletVariable;
                    document.body.appendChild(varScriptEle);
                    let calculateJSUrl="https://steamcommunity-a.akamaihd.net/public/javascript/economy_common.js?v=tsXdRVB0yEaR&l=schinese&_cdn=china_pinyuncloud";
                    GM_xmlhttpRequest({
                        url: calculateJSUrl,
                        method: 'GET',
                        //timeout:10000,
                        onload: function(res){
                            if(res.status === 200){
                                let calculateScript=res.responseText;
                                let calScriptEle=document.createElement("script");
                                calScriptEle.setAttribute("type","text/javascript");
                                calScriptEle.innerHTML=calculateScript;
                                document.head.appendChild(calScriptEle);
                                progressDivEle.setAttribute(progressDivAttr,"success");
                                start(window.location.href);
                                document.body.removeChild(progressDivEle);
                            }else{
                                log.info("initCalculate(): 访问Steam市场错误!");
                            }
                        },onerror : function(err){
                            log.info("initCalculate(): 访问Steam市场超时!");
                        },ontimeout : function(err){
                            log.info("initCalculate(): 访问超时");
                        }
                    });
                }else{
                    log.info("initCalculate(): 访问Steam市场错误!");
                }
            },onerror : function(err){
                log.info("initCalculate(): 访问Steam市场超时!");
            },ontimeout : function(err){
                log.info("initCalculate(): 访问超时");
            }
        });

    }
    initCalculate();
    function getPriceValueAsInt(value){
        if(!isNaN(value)){
            value=value.toString();
            if(value.lastIndexOf(".")<0){
                value=value+"00";
            }else if(value.length-value.lastIndexOf(".") == 2){
                value+="0";
            }
        }
        return parseInt(value.replace(".",""));
    }
    function receivePrice(price){
        if(typeof price != 'undefined'){
            return (getPriceValueAsInt(price)-parseInt(CalculateFeeAmount(getPriceValueAsInt(price),g_rgWalletInfo["wallet_publisher_fee_percent_default"]).fees))/100;
        }
        return 0;
    }
    function queryPrice(currentIndex,appid,name,updateView,args){
        log.info("new task index: "+currentIndex);
        if(currentIndex<index){
            log.debug("stop previous check update for index: "+currentIndex);
            return;
        }
        function checkUpdate(currentIndex,item_nameid,steamUrl,element){
            if(currentIndex<index){
                log.debug("stop previous check update for index: "+currentIndex);
                return;
            }
            if(!args.element.getAttribute(successAttr)){
                update(item_nameid,steamUrl);
                log.debug("retry get price >>>> "+item_nameid);
            }
            log.debug(item_nameid+" >>>> get price finish!");
        }
        function update(item_nameid,steamUrl){
            if(currentIndex<index){
                log.debug("stop previous check update for index: "+currentIndex);
                return;
            }
            let buyPrice=-1;
            let sellPrice=-1;
            setTimeout(function(){checkUpdate(currentIndex,item_nameid,steamUrl,args.element);},timeout);
            log.debug(`update: "https://steamcommunity.com/market/itemordershistogram?country=CN&language=schinese&currency=23&item_nameid=${item_nameid}&two_factor=0"`);
            GM_xmlhttpRequest({
                url: `https://steamcommunity.com/market/itemordershistogram?country=CN&language=schinese&currency=23&item_nameid=${item_nameid}&two_factor=0`,
                method: 'GET',
                //timeout:10000,
                responseType: 'json',
                onload: function(res){
                    if(res.status === 200){
                        let data=res.response;
                        if(data.success==1){
                            if(data.buy_order_graph.length>0&&data.buy_order_graph[0].length>0){
                                buyPrice=data.buy_order_graph[0][0];
                            }
                            if(data.sell_order_graph.length>0&&data.sell_order_graph[0].length>0){
                                sellPrice=data.sell_order_graph[0][0];
                            }
                            args.sellPrice=sellPrice;
                            args.buyPrice=buyPrice;
                            args.steamUrl=steamUrl;
                            updateView(args);
                        }
                    }else{
                        log.info("update(): "+res.status+" :访问Steam市场错误!");
                    }
                },onerror : function(err){
                    log.info("update(): 访问Steam市场超时!");
                },ontimeout : function(err){
                    log.info("update(): 访问超时");
                }
            });
        }
        function checkFetchInfo(currentIndex,item_nameid){
            if(currentIndex<index){
                log.debug("stop previous check fetch info for index: "+currentIndex);
                return;
            }
            if(!args.element.getAttribute(itemidAttr)){
                fetchInfo();
                log.debug("retry get item name id.");
            }
            log.debug(item_nameid+" >>>> get item name id finish!");
        }
        function fetchInfo(){
            let item_nameid="";
            if(currentIndex<index){
                log.debug("stop previous check update for index: "+currentIndex);
                return;
            }
            let steamUrl=`https://steamcommunity.com/market/listings/${appid}/${name}`;
            setTimeout(function(){checkFetchInfo(currentIndex,item_nameid);},timeout);
            GM_xmlhttpRequest({
                method: "get",
                url: steamUrl,
                //timeout:10000,
                async: false,
                onload: function(res){
                    if(res.status === 200){
                        let response=res.responseText;
                        let nameidMatchs=response.match(/Market_LoadOrderSpread\(.*?([\d]+).*?\);/);
                        log.debug("<nameidMatchs: "+nameidMatchs+">");
                        if(nameidMatchs){
                            item_nameid=nameidMatchs.length == 2 ? nameidMatchs[1] : "";
                            log.debug("<item_nameid: "+item_nameid+">");
                            if(item_nameid!=""){
                                args.element.setAttribute(itemidAttr,"success");
                                update(item_nameid,steamUrl);
                            }
                        }else{
                            args.element.querySelector("#"+waitingDivId).innerHTML=`<span style="color: red;display:block;text-align: center;position: relative;left: 50%;top: 50%;transform: translate(-50%, -50%);">此物品不在货架上。</span>`;
                            args.element.querySelector("#"+waitingDivId).setAttribute("class",displaySuccessClass);
                            args.element.setAttribute(itemidAttr,"success");
                            args.element.setAttribute(successAttr,"true");
                        }
                    }else{
                        log.info("fetchInfo(): Error Code: "+res.status);
                    }
                },onerror : function(err){
                    log.info("fetchInfo(): 访问Steam市场错误!");
                },ontimeout : function(err){
                    log.info("fetchInfo(): 访问超时");
                }
            });
        }
        fetchInfo();
    }
    function updateView(args){
        let purchasePrice,sellRate,buyRate;
        let priceSpan=document.createElement("span");
        let success=true;
        if(buffUrlReg.test(args.url)&&!args.element.getAttribute(successAttr)){
            purchasePrice=parseFloat(args.element.querySelector("strong.f_Strong").innerHTML.match(/[\d\.]/g).join(""));
        }else if(c5UrlReg.test(args.url)&&!args.element.getAttribute(successAttr)){
            purchasePrice=parseFloat(args.element.querySelector("span.price").innerHTML.match(/[\d\.]/g).join(""));
        }else if(igxeUrlReg.test(args.url)&&!args.element.getAttribute(successAttr)){
            purchasePrice=parseFloat(args.element.querySelector(".price.fl").textContent.match(/[\d\.]+/g).join(""));
        }else{
            success=false;
        }
        if(success){
            sellRate=(purchasePrice/receivePrice(args.sellPrice)).toFixed(2);
            buyRate=(purchasePrice/receivePrice(args.buyPrice)).toFixed(2);
            args.element.removeChild(args.element.querySelector("#"+waitingDivId));
            priceSpan.setAttribute("class",displaySuccessClass);
            let priceContent=`
                <br><span class="s_s_s_s_cell_left">卖出:</span><span class="s_s_s_s_cell_right">${(args.sellPrice == -1 ? "无" : args.sellPrice)}</span>
                <br><span class="s_s_s_s_cell_left">税后:</span><span class="s_s_s_s_cell_after_fee">${args.sellPrice == -1 ? "无" : receivePrice(args.sellPrice)}</span>
                <br><span class="s_s_s_s_cell_left">比例:</span><span class="${ sellRate > 0.7 ? "s_s_s_s_cell_rate_high": "s_s_s_s_cell_rate"}">${args.sellPrice == -1 ? "无" : sellRate}</span>
                <br><br><span class="s_s_s_s_cell_left">买入:</span><span class="s_s_s_s_cell_right">${(args.buyPrice == -1 ? "无" : args.buyPrice)}</span>
                <br><span class="s_s_s_s_cell_left">税后:</span><span class="s_s_s_s_cell_after_fee">${args.buyPrice == -1 ? "无" : receivePrice(args.buyPrice)}</span>
                <br><span class="s_s_s_s_cell_left">比例:</span><span class="${ buyRate > 0.9 ? "s_s_s_s_cell_rate_high": "s_s_s_s_cell_rate"}">${args.buyPrice == -1 ? "无" : buyRate}</span>
                <br><br>
                <span class="s_s_s_s_cell_link"><a href="${args.steamUrl}" target="_blank">Steam链接</a></span>
        `;
            priceSpan.innerHTML=priceContent;
            args.element.setAttribute(successAttr,"true");
            args.element.appendChild(priceSpan);
            log.debug("update view successfully!");
        }
    }
    function waitForElement(selector,task){
        if(document.querySelector(selector)){
            task();
        }else{
            setTimeout(function(){waitForElement(selector,task);},100);
        }
    }
    let missionStart=false;
    function start(url){
        let cards;
        let cardClass;
        let appid;
        if(buffUrlReg.test(url)){
            let buffCSGOReg=/game=csgo/;
            let buffDotaReg=/game=dota2/;
            if(buffCSGOReg.test(url)){
                cardClass=".card_csgo";
                appid=appidList.csgo;
            }else if(buffDotaReg.test(url)){
                cardClass=".card_dota2";
                appid=appidList.dota2;
            }
            waitForElement(cardClass,function(){
                cards=document.querySelector(cardClass).querySelectorAll("li");
                startQuery();
            });

        }else if(c5UrlReg.test(url)){
            let c5CSGOReg=/\/csgo\//;
            let c5DotaReg=/dota\.html/;
            cardClass=".list-item4";
            if(c5DotaReg.test(url)){
                appid=appidList.dota2;
            }else if(c5CSGOReg.test(url)){
                appid=appidList.csgo;
            }
            waitForElement(cardClass,function(){
                cards=document.querySelector(cardClass).querySelectorAll("li");
                startQuery();
            });
        }else if(igxeUrlReg.test(url)){
            let igxeCSGOReg=/\/csgo\//;
            let igxeDotaReg=/\/dota2\//;
            cardClass=".dataList";
            if(igxeDotaReg.test(url)){
                appid=appidList.dota2;
            }else if(igxeCSGOReg.test(url)){
                appid=appidList.csgo;
            }
            waitForElement(cardClass,function(){
                cards=document.querySelector(cardClass).querySelectorAll("a");
                startQuery();
            });
        }
        function startQuery(){
            ++index;
            if(buffUrlReg.test(url)){
                for(let i=0;i<cards.length;++i){
                    let card=cards[i];
                    let currentIndex=index;
                    let progressEleDiv=document.createElement("div");
                    progressEleDiv.setAttribute("id",waitingDivId);
                    card.setAttribute("style","height:399px!important;");
                    progressEleDiv.setAttribute("style","width:208px;height:120px;");
                    progressEleDiv.innerHTML=`<progress style="text-align: center;position: relative;left: 50%;top: 50%;transform: translate(-50%, -50%);"></progress>`;
                    let buffItemEnNameAttr="s_s_s_s_buff_item_en_name_attr";
                    let decodeTextEle=document.createElement("textarea");
                    card.appendChild(progressEleDiv);
                    function checkItemEnName(card,currentIndex){
                        if(!card.getAttribute(buffItemEnNameAttr)){
                            getItemEnName(card,currentIndex);
                            log.debug("Buff: retry get the en name!");
                        }
                        log.debug("Buff: got the en name!");
                    }
                    function getItemEnName(card,currentIndex){
                        setTimeout(function(){checkItemEnName(card,currentIndex);},5000);
                        GM_xmlhttpRequest({
                            url: `${card.querySelector("a").href}`,
                            method: 'GET',
                            //timeout:10000,
                            onload: function(res){
                                if(res.status === 200){
                                    let html=res.responseText;
                                    let steamLinkReg=/"https:\/\/steamcommunity.com\/market\/listings\/(.*?)"/;
                                    let steamLink=html.match(/"https:\/\/steamcommunity.com\/market\/listings\/(.*?)"/);
                                    if(steamLink.length>0){
                                        decodeTextEle.innerHTML=steamLink[1].substring(steamLink[1].lastIndexOf("\/")+1);
                                        let enName=decodeTextEle.value;
                                        queryPrice(currentIndex,appid,enName,updateView,{"url":url,"element":card});
                                        card.setAttribute(buffItemEnNameAttr,"success");
                                    }
                                }else{
                                    log.info("访问Buff页面错误: error code: "+res.status);
                                }
                            },onerror : function(err){
                                log.info("访问Buff页面错误!");
                            },ontimeout : function(err){
                                log.info("访问Buff页面超时!");
                            }
                        });
                    }
                    getItemEnName(card,currentIndex);
                }
                let marketCard=document.querySelector("#j_market_card");
                if(!missionStart){
                    let marketCardConfig = { childList: true };
                    let observer = new MutationObserver(function(){
                        if(!document.querySelector(cardClass)){
                            if(!marketCard.getAttribute(contentChangeAttr)){
                                marketCard.setAttribute(contentChangeAttr,"true");
                            }
                        }
                    });
                    observer.observe(marketCard, marketCardConfig);
                    let marketCardConfigAttr={ attributes: true };
                    let observerAttr = new MutationObserver(function(){
                        if(marketCard.getAttribute(contentChangeAttr)){
                            marketCard.removeAttribute(contentChangeAttr);
                            start(window.location.href);
                        }
                    });
                    observerAttr.observe(marketCard, marketCardConfigAttr);
                    missionStart=true;
                }
            }
            else if(c5UrlReg.test(url)){
                let c5ItemEnNameAttr="s_s_s_s_c5_item_en_name_attr";
                let decodeTextEle=document.createElement("textarea");
                function runPart(start,end){
                    for(let i=start;i<end;++i){
                        let currentIndex=index;
                        let card=cards[i];
                        let progressEleSpan=document.createElement("span");
                        progressEleSpan.setAttribute("style","height:205px;display:block;");
                        progressEleSpan.setAttribute("id",waitingDivId);
                        progressEleSpan.innerHTML=`<progress style="text-align: center;position: relative;left: 50%;top: 50%;transform: translate(-50%, -50%);"></progress>`;
                        card.appendChild(progressEleSpan);
                        function checkItemEnName(card,currentIndex){
                            if(!card.getAttribute(c5ItemEnNameAttr)){
                                getItemEnName(card,currentIndex);
                                log.debug("c5: retry get the en name!");
                            }
                            log.debug("c5: got the en name!");
                        }
                        function getItemEnName(card,currentIndex){
                            setTimeout(function(){checkItemEnName(card,currentIndex);},5000);
                            GM_xmlhttpRequest({
                                url: `${card.querySelector("a").href}`,
                                method: 'GET',
                                //timeout:10000,
                                onload: function(res){
                                    if(res.status === 200){
                                        let html=res.responseText;
                                        let steamLinkReg=/"https:\/\/steamcommunity.com\/market\/listings\/(.*?)"/;
                                        let steamLink=html.match(/"https:\/\/steamcommunity.com\/market\/listings\/(.*?)"/);
                                        if(steamLink.length>0){
                                            decodeTextEle.innerHTML=steamLink[1].substring(steamLink[1].lastIndexOf("\/")+1);
                                            let enName=decodeTextEle.value;
                                            queryPrice(currentIndex,appid,enName,updateView,{"url":url,"element":card});
                                            card.setAttribute(c5ItemEnNameAttr,"success");
                                        }
                                    }else{
                                        log.info("访问C5页面错误: error code: "+res.status);
                                    }
                                },onerror : function(err){
                                    log.info("访问C5页面错误!");
                                },ontimeout : function(err){
                                    log.info("访问C5页面超时!");
                                }
                            });
                        }
                        getItemEnName(card,currentIndex);
                    }
                }
                let half=cards.length>32 ? parseInt(cards.length/2) : cards.length;
                if(half!=0&&half<cards.length){
                    let intervalId=setInterval(function(){
                        let count=document.querySelectorAll("."+displaySuccessClass).length;
                        if(count==half){
                            clearInterval(intervalId);
                            log.info("run part 2!");
                            let part2notifyId="s_s_s_s_c5_part2_notify";
                            let width=200;
                            let height=25;
                            let left=document.documentElement.scrollLeft + (document.documentElement.clientWidth - width) / 2;
                            let top=document.documentElement.scrollTop + (document.documentElement.clientHeight - height) / 2;
                            let notifyEle=document.createElement("div");
                            notifyEle.setAttribute("id",part2notifyId);
                            notifyEle.setAttribute("style","z-index: 999;border-radius:4px; border: 4px solid white; text-align: center;position: absolute;left: "+left+"px;top: "+top+"px;transform: translate(-50%, -50%);background:white;padding:5px;");
                            notifyEle.innerHTML=`
                                    <strong style="color:black;">请等待10秒后加载第二部分!</strong><br>
                                    <progress style="width:${width}px;height:${height}px;"></progress>
                                `;
                            document.body.appendChild(notifyEle);
                            setTimeout(function(){
                                document.body.removeChild(document.querySelector("#"+part2notifyId));
                                runPart(half,cards.length);
                            },10000);
                        }
                    },1000);
                }
                log.info("run part 1!");
                runPart(0,half);
            }
            else if(igxeUrlReg.test(url)||c5UrlReg.test(url)){
                const itemEnNameAttr="s_s_s_s_item_enName_success";
                function checkGetEnNameAndQuery(appid,cnName,progressEleSpan,card){
                    if(!card.getAttribute(itemEnNameAttr)){
                        getEnNameAndQuery(appid,cnName,progressEleSpan,card);
                        log.debug("retry get en name");
                    }
                    log.debug("get en name for "+cnName+" successfully!");
                }
                function getEnNameAndQuery(appid,cnName,progressEleSpan,card){
                    setTimeout(function(){checkGetEnNameAndQuery(appid,cnName,progressEleSpan,card);},timeout);
                    GM_xmlhttpRequest({
                        //url: `https://steamcommunity.com/market/search?appid=${appid}&q=${cnName}`,
                        url: `https://steamcommunity.com/market/search/render/?query=${cnName}&start=0&count=1&appid=${appid}&norender=1`,
                        method: 'GET',
                        responseType: 'json',
                        onload: function(res){
                            if(res.status === 200){
                                let data=res.response;
                                let linkList=data.results;
                                let enName="";
                                if(linkList&&linkList.length>0){
                                    for(let i=0;i<linkList.length;++i){
                                        let matchCNName=linkList[i].name;
                                        if(matchCNName==cnName){
                                            enName=linkList[i].hash_name;
                                        }
                                    }
                                    if(enName!=""){
                                        queryPrice(index,appid,enName,updateView,{"url":url,"element":card});
                                    }else{
                                        progressEleSpan.innerHTML=`<span style="color: red;display:block;text-align: center;position: relative;left: 50%;top: 50%;transform: translate(-50%, -50%);">此物品不在货架上。</span>`;
                                        progressEleSpan.setAttribute("class",displaySuccessClass);
                                        card.setAttribute(itemidAttr,"success");
                                    }
                                    card.setAttribute(itemEnNameAttr,"success");
                                }
                            }else{
                                log.info("startQuery(): 访问Steam市场错误!Code: "+res.status);
                            }
                        },onerror : function(err){
                            log.info("startQuery(): 访问Steam市场错误!");
                        },ontimeout : function(err){
                            log.info("startQuery(): 访问超时");
                        }
                    });
                }
                for(let i=0;i<cards.length;++i){
                    let progressEleSpan=document.createElement("span");
                    progressEleSpan.setAttribute("style","height:205px;display:block;");
                    progressEleSpan.setAttribute("id",waitingDivId);
                    let card=cards[i];
                    let cnName=card.querySelector(".name").title;
                    card.setAttribute("style","height: 450px;");
                    progressEleSpan.innerHTML=`<progress style="text-align: center;position: relative;left: 50%;top: 50%;transform: translate(-50%, -50%);"></progress>`;
                    card.appendChild(progressEleSpan);
                    getEnNameAndQuery(appid,cnName,progressEleSpan,card);
                }
            }
        }
    }
})();