Greasemonkey XMLHttpRequest和javascript响应代码

时间:2017-08-02 01:47:59

标签: javascript ajax xmlhttprequest greasemonkey gm-xmlhttprequest

我在脚本中尝试做的是自动展开Blogger网站“Blog Archive”部分下的所有(或部分)链接,而不必逐个点击它们。查看HTTP标头,我可以看到每次用户点击未展开的链接(例如“二月”)时,浏览器会发送如下的HTTP GET请求(我使用官方Greasemonkey博客作为示例) ):

?action=getTitles&widgetId=BlogArchive1&widgetType=BlogArchive&responseType=js&path=http%3A%2F%2Fwww.greasespot.net%2F2017%2F02%2F

现在在我的脚本中使用XMLHttpRequest,

GM_xmlhttpRequest({
    method:     'GET',
    url:        'http://www.greasespot.net/?action=getTitles&widgetId=BlogArchive1&widgetType=BlogArchive&responseType=js&path=http%3A%2F%2Fwww.greasespot.net%2F2017%2F02%2F',
    onload:     function (response) {
        console.log (response.responseText);
    }
});

我收到这样的回复:

try {
_WidgetManager._HandleControllerResult('BlogArchive1', 'getTitles',{'path': 'http://www.greasespot.net/2017/02/', 'posts': [{'title': 'Greasemonkey 3.10 Release', 'url': 'http://www.greasespot.net/2017/02/greasemonkey-310-release.html'}]});
} catch (e) {
  if (typeof log != 'undefined') {
    log('HandleControllerResult failed: ' + e);
  }
}

这实际上是有人可以在浏览器中看到的响应,如果他使用整个网址,

http://www.greasespot.net/?action=getTitles&widgetId=BlogArchive1&widgetType=BlogArchive&responseType=js&path=http%3A%2F%2Fwww.greasespot.net%2F2017%2F02%2F

我认为响应是当用户点击未展开的博客存档链接时调用的javascript函数(带有适当的参数)。

按照Greasemonkey wiki执行网站的javascript功能,我尝试使用this方法

window.eval(response.responseText);

但它不起作用。我甚至不知道是否可以像这样使用它......

使用GM_xmlhttpRequest获取后,是否可以在用户脚本中运行此响应js代码?

修改

我通过注入<script>标记尝试了相同的操作,我甚至在没有try-catch块的情况下复制粘贴了响应函数,但仍然无效。

function exec(fn) {
    var script = document.createElement('script');
    script.setAttribute("type", "application/javascript");
    script.textContent = '(' + fn + ')();';
    document.body.appendChild(script);
    document.body.removeChild(script);
}

GM_xmlhttpRequest({
    method:     'GET',
    url:        'http://www.greasespot.net/?action=getTitles&widgetId=BlogArchive1&widgetType=BlogArchive&responseType=js&path=http%3A%2F%2Fwww.greasespot.net%2F2017%2F02%2F',
    onload:     function (response1) {
        console.log (response1.responseText);
        exec(function() {_WidgetManager._HandleControllerResult('BlogArchive1', 'getTitles',{'path': 'http://www.greasespot.net/2017/02/', 'posts': [{'title': 'Greasemonkey 3.10 Release', 'url': 'http://www.greasespot.net/2017/02/greasemonkey-310-release.html'}]});});
    }
});

然后记录响应,我认为该函数已执行,因为我得到TypeError: a is null。但如果它运行,我不知道为什么它无法正确执行。

0 个答案:

没有答案