我很擅长为Chrome / Firefox编写用户脚本。我试图从网站获取AJAX生成的JSON数据并将它们发送到我自己的服务器,分析它们并将它们放入数据库。
我设法用Ajax发送数据并将它们放在我自己的服务器上的文本文件中。但是在Chrome控制台中,它说我有:
未捕获的SyntaxError:意外的令牌j
,但我已收到每条消息,'数据已发送'且我'调用'后 - 这些是日志消息。< / p>
是否有回调,我应该实施,还是我错过了一些明显的东西?我在这里放了一个缩短版的代码。
// Injecting javascript in the original page
function inject(func) {
var source = func.toString();
var script = document.createElement('script');
script.innerHTML = "(" + source + ")()";
document.body.appendChild(script);
}
function injection() {
}
// This function intercepts the ajax
function interceptAjax() {
$('body').ajaxSuccess (
function (event, requestData, settings) {
serverData = requestData.responseText;
if(JSON.parse(settings.data).method == "dashboard.getPaginatedPlextsV2"){
console.log("Sending");
$.ajax({
type: "POST",
url: "http://mywebsite.com/collectdata.php",
data: { json: JSON.stringify(serverData) },
success: function(msg) {
console.log("Data were sent");
},
error: function(xhr, ajaxOptions, thrownError) {
console.log("Failed: " + xhr.status + " - " + thrownError);
}
});
console.log("After the call");
}
}
);
}
// A helperfunction for the ajaxInterception to work in Chrome
function addJS_Node (text, s_URL, funcToRun) {
var D = document;
var scriptNode = D.createElement('script');
scriptNode.type = "text/javascript";
if(text) scriptNode.textContent = text;
if(s_URL) scriptNode.src = s_URL;
if(funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()';
var targ = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
targ.appendChild(scriptNode);
}
// This function is necessary to intercept the ajax
addJS_Node(null, null, interceptAjax);
inject(injection);
答案 0 :(得分:0)
夫妻俩:
mywebsite.com
是否与目标网页相同?如果没有,那么你不能像那样做跨域AJAX(除非目标页面服务器有一个慷慨的CORS策略)。
如果是这样,那么你控制服务器(或有访问权限),那么为什么要乱用数据的用户脚本呢? ; - )
这一行:
if(JSON.parse(settings.data).method == "dashboard.getPaginatedPlextsV2")
看起来容易导致错误。
即使您有理由确定所有页面的AJAX调用仅发送有效的JSON数据,但并非所有数据都具有method
属性。 (EG:看起来对http://mywebsite.com/collectdata.php
的AJAX调用可能没有。
您需要使检查更具防撞性。像这样(未经测试):
var jsonData = null;
try {
jsonData = JSON.parse (settings.data);
}
catch (e) {
jsonData = null;
}
if (jsonData && jsonData.method
&& jsonData.method == "dashboard.getPaginatedPlextsV2"
) {
...