0

此脚本在亚马逊交易页面上运行:

// ==UserScript==
// @name     Unnamed Script 138015
// @version  1
//@include     http://www.amazon.in/*
// @grant       GM_setValue   
// @grant       GM_getValue  
// @grant       GM.xmlHttpRequest
// @grant       GM_xmlhttpRequest
// @grant       GM.addStyle
// @grant       GM.getResourceText
// @grant       GM.getValue
// @grant       GM.setValue
// @grant       GM.info
// @require     http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// ==/UserScript==
var x=document.getElementById("dealTitle"); //fetches the URL
alert(x);
GM.xmlHttpRequest ( {
    method: "GET",
    url: x,
    onload: function (response) {
        var parser  = new DOMParser ();
        var doc         = parser.parseFromString (response.responseText, "text/html");
        var price  = document.getElementsByClassName("a-size-medium a-color-price")[0];
        $("body").prepend ('<h1>' + price + '</h1>');
    },
    onerror: function (e) {
        console.error ('**** error ', e);
    },
    onabort: function (e) {
        console.error ('**** abort ', e);
    },
    ontimeout: function (e) {
        console.error ('**** timeout ', e);
    }
} );

它在控制台日志中显示以下错误。

Error: GM.xmlHttpRequest: Received no URL.
Stack trace:
GM_xmlHttpRequest@user-script:null/Unnamed%20Script%20138015:572:21
userScript@user-script:null/Unnamed%20Script%20138015:504:1
scopeWrapper@user-script:null/Unnamed%20Script%20138015:632:9
@user-script:null/Unnamed%20Script%20138015:487:17

有什么方法可以使用从页面中获取的链接以在 HttpRequest 中发送?

4

1 回答 1

1
  1. getElementById不返回 URL;它返回一个节点。
  2. dealTitle元素是通过 AJAX 添加的;当您的脚本首次运行时它不存在。因此,您需要在脚本中使用 AJAX 感知技术。

像这样的东西应该工作:

// ==UserScript==
// @name        Unnamed Script 138015
// @version     2
// @match       *://www.amazon.in/*
// @grant       GM.xmlHttpRequest
// @grant       GM_xmlhttpRequest
// @require     http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require     https://gist.github.com/raw/2625891/waitForKeyElements.js
// ==/UserScript==

waitForKeyElements ("#dealTitle", fetchDealPage);

function fetchDealPage (jNode) {
    var dURL = jNode.attr ("href");
    console.log ("dURL: ", dURL);

    GM.xmlHttpRequest ( {
        method: "GET",
        url: dURL,
    //etc...
}

尽管您可能必须安装 Tampermonkey,并将行更改为GM_xmlhttpRequest ( {.
不确定 GM4 是否支持GM.xmlHttpRequest这种方式。

于 2018-04-28T18:12:47.570 回答