我之前已经问过这个问题,但似乎我被误解了,所以我决定再次询问,但这一次有很多信息:
对于懒惰的读者,我的目标是:
有没有办法通过PHP或Ajax检查外部网站上是否启用了javascript
详细说明:
好的,所以我的公司有很多客户,当这些客户在我们的网站上注册时,他们会被提交javascript
。然后,他们可以在自己的网站上使用此script
来获取一些额外的功能。
现在,客户所拥有的所有网站都存储在我们的CMS系统中(就像他们拥有的所有网站列表一样,我们都会签名)。
现在我的老板给了我以下任务:
我们需要一个功能,以便用户可以按下“测试”按钮,系统将测试javascript是否在他们的网站上并且没有错误地工作(即是否有另一个脚本阻止了我们的)。
现在过去几天,我一直试图在web
上找到类似的案例,而且我唯一建议的是Phantomjs但是没有关于如何接近我的例子想要实现。
所以我向你提问:
我希望,这次我不会被误解:)如果您有任何疑问,请留言,我会尽快回复!
幻影解决方案(由Elias发布)
这是我的代码:
var page = require('webpage').create();
page.onConsoleMessage = function( message, line, srcId)
{//show console errors for page
console.log('Page has errors showing in console: ' + msg
+ ' (line: ' + (line || '?') + ', id: ' + srcId + ')');
};
page.open('http://www.marcrasmussen.com',function(status)
{
if (status != 'success')
{//can't load page
console.log('Failed to open page: ' + status);
phantom.exit();
return;
}
var reslt = page.evaluate(function()
{
var usesOurScript = false,
scripts = document.querySelectorAll('script');//get all script tags
Array.forEach.apply(scripts, [function(elem)
{//check all loaded scripts
if (/jquery\.js/.js.js.test(elem.getAttribute('src')))
{//this src attribute refers your script
usesOurScript = true;//set to true
}
}]);
return {page: location.href, found: usesOurScript};//return its href and the use-status
});
//script was found? adjust message
reslt.found = (reslt.found ? ' uses ' : ' does not use ') + 'our script!';
console.log(reslt.page + reslt.found);//logs url does not use || uses our script
phantom.exit();
});
当我从php运行它时,没有输出它只是一直运行:
test.php的
<?php echo shell_exec('phantomjs hello.js');
?>
答案 0 :(得分:3)
我也会在这里发布。因为我是那个让你接触幻影的人,所以我认为你能解决问题的方法是公平的。
以下脚本在无头幻像浏览器中打开一个页面,记录页面在实际浏览器中产生的任何控制台消息(使用onConsoleMessage
事件),如果页面无法加载,它还会记录错误,如果页面打开没有问题,它会检查该页面上的所有<script>
标记,查找您的javascript文件。
var page = require('webpage').create();
page.onConsoleMessage = function( message, line, srcId)
{//show console errors for page
console.log('Page has errors showing in console: ' + msg
+ ' (line: ' + (line || '?') + ', id: ' + srcId + ')');
};
page.open('http://www.your-url-here.org',function(status)
{
if (status != 'success')
{//can't load page
console.log('Failed to open page: ' + status);
phantom.exit();
return;
}
var reslt = page.evaluate(function()
{
var usesOurScript = false,
scripts = document.querySelectorAll('script');//get all script tags
/* Array.forEach is causing errors, as it turns out...
Array.forEach.apply(scripts, [function(elem)
{//check all loaded scripts
if (/yourScriptName\.js/.test(elem.getAttribute('src')))
{//this src attribute refers your script
usesOurScript = true;//set to true
}
}]);*/
for (var i=0;i<scripts.length;i++)
{
if (/yourScriptName\.js/.test(scripts[i].getAttribute('src')))
{
return {page: location.href, found: true};
}
}
return {page: location.href, found: false};
});
//script was found? adjust message
reslt.found = (reslt.found ? ' uses ' : ' does not use ') + 'our script!';
console.log(reslt.page + reslt.found);//logs url does not use || uses our script
phantom.exit();
});
如果该文件的作用类似于jQ(创建对某个对象的全局引用),您甚至可以将其添加到page.evaluate
回调中:
var reslt = page.evaluate(function()
{//this code will behave like it's running on the target page
var libs = {jQuery: ($ || jQuery),
myLib: ourLibsGlobalName};
return libs;
});
if (reslt.jQuery instanceof Object)
{
console.log('client uses jQ');
}
if (reslt.myLib instanceof Object)
{
console.log('client uses our lib, successfuly');//wouldn't be accessible if it contained errors
}
console.log(reslt.myLib);//shows full object, so you can verify it's the right one
注意:
这段代码未经过测试,我只是把它写在了我的头顶。它可能包含愚蠢的拼写错误。这不是你所有祈祷的副本可回答的答案
我相信page.evaluate
回调能够返回一些内容,但是:它在加载页面的上下文中运行,并且是沙箱,因此您可能必须强制错误:
page.evaluate(function()
{
Array.forEach(document.querySelectorAll('script'), [function(elem)
{
if (/yourScript\.js/.test(elem.getAttribute('src')))
{
throw {message: 'Script found',
nodeSrc: elem.getAttribute('src'),
pageUrl: location.href,
myLib : yourGlobalVar}//<-- cf remarks on jQ-like usage
}
}]);
});
通过抛出这个未被捕获的自定义错误,它将最终出现在控制台中,您强制page.onConsoleMessage
处理程序处理此异常。在某种程度上,如果它们导致无限循环问题发生,这可能是围绕沙箱限制的一种方式。
答案 1 :(得分:1)
是否可以检查网站是否有某个JavaScript?
你可以做两件事,我认为使用JavaScript的那件事会更容易实现。
使用PHP:
DOMDocument
并搜索代码的特定部分使用JavaScript
自托管
是否可以检查javascript是否正常运行?
这个有点复杂,因为你在运行时检查了这一点。想象一下,您的脚本用户会扩展或修改您的代码,或者只是以错误的方式使用它,或者有一些与您的代码冲突的内容。也许这个代码永远不会到达,因为它调用了一些用户交互,可能会也可能不会被触发。
一种可能性是在发生错误时向您发送AJAX请求。您可以为此目的查看window.onerror
:
window.onerror = function(message, url, lineNumber) {}
这将为您提供一些详细信息,您可以使用AJAX请求将其传递到服务器。
答案 2 :(得分:0)
环形交叉路口或者更简单的方法是创建一个虚拟对象定义,其名称为'your_company_name _'+ some_hash。像abc_45xcd。
//your custom js file
//BEWARE! this is global namespace.
function abc_45xcd(){
console.log('abc_45scd custom js is loaded');
}
单击测试按钮时,您可以尝试创建新对象
var x = new abc_45scd();
您可以检查构造函数和类型,以检查它是否是您自己的“自定义”虚拟对象。
注意:这实际上是一个天真的解决方案,因为有些人可能会在其脚本中创建一个具有相同名称的对象。 此外,它无缘无故地污染全局命名空间。