Greasemonkey 可以从分页的 URL 序列中获取值吗?



我想从https://play.google.com/store/account*获取一个值,该值通过其输出使用户页面通过其输出。例如:
/store/account?start=0&num=40,然后是/store/account?start=40&num=40

现在,当我访问 https://play.google.com/apps时,我希望greasemonkey从 /store/account页面上添加值,然后在该页面上显示最终值。

下面列出的代码可以从/store/account页面总计我想要的值。但是,我想在用于第二个URL的脚本中插入代码,因此我可以在同一页面上进行预处理。

// ==UserScript==
// @name        Google Play 
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant       GM_setValue   
// @grant       GM_getValue  
// ==/UserScript==
var startParam      = location.search.match (/bstart=(d+)/i);
    if (startParam) {
        var totalPrice  = 0;
        var startNum    = parseInt (startParam[1], 10);
        if (startNum    === 0) {
            GM_setValue ("TotalPrice", "0");
        }
        else {
            totalPrice  = parseFloat (GM_getValue ("TotalPrice", 0) );
        }
        $("#tab-body-account .rap-link").each( function () {
            var price   = $(this).attr ("data-docprice").replace (/[^d.]/g, "");
            if (price) {
                price   = parseFloat (price);
                if (typeof price === "number") {
                    totalPrice += price;
                }
            }
        } );
        //console.log ("totalPrice: ", totalPrice.toFixed(2) );
        $('.tabbed-panel-tab').before (
            '<div id="SumTotal">*Combined Value: $'+ totalPrice.toFixed(2) +'</div>'
        );
        GM_setValue ("TotalPrice", "" + totalPrice);
        if ( $(".snippet.snippet-tiny").length ) {
            startNum       += 40;
            var nextPage    = location.href.replace (
                /bstart=d+/i, "start=" + startNum
            );
            location.assign (nextPage);
        }
    }

从页面/网站获取混搭的基本方法是:

  1. 通过Ajax刮擦:
    这几乎在所有页面上都可以使用,尽管它与通过Ajax加载所需内容的页面无法使用。有时,对于需要身份验证或限制推荐人的网站也可能会变得棘手。
    在大多数情况下,请使用GM_xmlhttpRequest(),以进行跨域脚本。此方法将在下面详细介绍。

  2. <iframe>中加载资源页面:
    此方法在AJAX的页面上起作用,可以编码以使用户手动处理登录问题。但是,这是:较慢,更大的资源密集型,代码更复杂。

    由于这个问题的细节似乎不需要,因此请参阅"如何让Ajax Get-Request等待页面在返回答复之前呈现页面?"有关此技术的更多信息。

  3. 如果有一个网站的API,请使用:
    las,大多数网站没有API,因此这可能不是您的选择,但是值得确保没有提供API。如果可用,API通常是最好的方法。进行新的搜索/问题以获取有关此方法的更多详细信息。

  4. 模仿网站的AJAX调用,如果它呼吁您想要的信息:
    此选项也不适用于大多数站点,但它可能是一种干净,高效的技术。进行新的搜索/问题以获取有关此方法的更多详细信息。


从一系列网页中提取值(s)通过跨域的AJAX:

使用GM_xmlhttpRequest()加载页面,然后使用jQuery处理其HTML。
使用GM_xmlhttpRequest()onload函数来调用下一页,如有必要,请勿尝试使用同步AJAX调用。

核心逻辑从您的原始脚本中移至onload函数内部 - 除了不再需要记住GreaseMonKey运行之间的值。

这是一个完整的GreaseMonKey脚本,其中一些状态和错误报告在:

// ==UserScript==
// @name        _Total-value mashup
// @include     https://play.google.com/apps*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant       GM_addStyle
// @grant       GM_xmlhttpRequest
// ==/UserScript==
var startNum        = 0;
var totalValue      = 0;
//--- Scrape the first account-page for item values:
$("body").prepend (
    '<div id="gm_statusBar">Fetching total value, please wait...</div>'
);
scrapeAccountPage ();
function scrapeAccountPage () {
    var accntPage   = 'https://play.google.com/store/account?start=0&num=40';
    accntPage       = accntPage.replace (/start=d+/i, "start=" + startNum);
    $("#gm_statusBar").append (
        '<span class="gmStatStart">Fetching page ' + accntPage + '...</span>'
    );
    GM_xmlhttpRequest ( {
        method:     'GET',
        url:        accntPage,
        //--- getTotalValuesFromPage() also gets the next page, as appropriate.
        onload:     getTotalValuesFromPage,
        onabort:    reportAJAX_Error,
        onerror:    reportAJAX_Error,
        ontimeout:  reportAJAX_Error
    } );
}
function getTotalValuesFromPage (respObject) {
    if (respObject.status != 200  &&  respObject.status != 304) {
        reportAJAX_Error (respObject);
        return;
    }
    $("#gm_statusBar").append ('<span class="gmStatFinish">done.</span>');
    var respDoc     = $(respObject.responseText);
    var targetElems = respDoc.find ("#tab-body-account .rap-link");
    targetElems.each ( function () {
        var itmVal  = $(this).attr ("data-docprice").replace (/[^d.]/g, "");
        if (itmVal) {
            itmVal   = parseFloat (itmVal);
            if (typeof itmVal === "number") {
                totalValue += itmVal;
            }
        }
    } );
    console.log ("totalValue: ", totalValue.toFixed(2) );
    if ( respDoc.find (".snippet.snippet-tiny").length ) {
        startNum       += 40;
        //--- Scrape the next page.
        scrapeAccountPage ();
    }
    else {
        //--- All done!  report the total.
        $("#gm_statusBar").empty ().append (
            'Combined Value: $' + totalValue.toFixed(2)
        );
    }
}
function reportAJAX_Error (respObject) {
    $("#gm_statusBar").append (
        '<span class="gmStatError">Error ' + respObject.status + '! &nbsp; '
        + '"' + respObject.statusText + '" &nbsp; &nbsp;'
        + 'Total value, so far, was: ' + totalValue
        + '</span>'
    );
}
//--- Make it look "purty".
GM_addStyle ( multilineStr ( function () {/*!
    #gm_statusBar {
        margin:         0;
        padding:        1.2ex;
        font-family:    trebuchet ms,arial,sans-serif;
        font-size:      18px;
        border:         3px double gray;
        border-radius:  1ex;
        box-shadow:     1ex 1ex 1ex gray;
        color:          black;
        background:     lightgoldenrodyellow;
    }
    #gm_statusBar .gmStatStart {
        font-size:      0.5em;
        margin-left:    3em;
    }
    #gm_statusBar .gmStatFinish {
        font-size:      0.5em;
        background:     lime;
    }
    #gm_statusBar .gmStatError {
        background:     red;
        white-space:    nowrap;
    }
*/} ) );
function multilineStr (dummyFunc) {
    var str = dummyFunc.toString ();
    str     = str.replace (/^[^/]+/*!?/, '') // Strip function() { /*!
            .replace (/s**/s*}s*$/, '')   // Strip */ }
            .replace (///.+$/gm, '') // Double-slash comments wreck CSS. Strip them.
            ;
    return str;
}



重要:不要忘记@include@exclude和/或@match指令,因此您的脚本不会在每个页面上运行,并且IFRAME!

相关内容

  • 没有找到相关文章

最新更新