我在脚本中尝试做的是自动展开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);
}
}
这实际上是有人可以在浏览器中看到的响应,如果他使用整个网址,
我认为响应是当用户点击未展开的博客存档链接时调用的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
。但如果它运行,我不知道为什么它无法正确执行。