1

以前にもこの質問をしたことがありますが、誤解されているようですので、もう一度質問することにしましたが、今回は多くの情報が含まれています。

怠惰な読者のために、ここでの私の目標は次のとおりです。

PHPまたはAjaxを介して外部サイトでjavascriptが有効になっているかどうかを確認する方法はありますか

詳細な説明:

さて、私の会社には多くのクライアントがいます。これらのクライアントが私たちのウェブサイトにサインアップすると、javascript. その後、これscriptを自分の Web サイトで使用して、いくつかの追加機能を取得できます。

現在、クライアントが所有するすべての Web サイトは、当社の CMS システム内に保存されています (当社が署名しているすべての Web サイトのリストがあるように)。

今、上司は私に次の任務を与えました:

ユーザーが「テスト」ボタンを押すと、システムが JavaScript がサイト上にあり、エラーなしで動作しているかどうか (つまり、私たちのスクリプトをブロックしている別のスクリプトがあるかどうか) をテストする機能が必要です。

過去数日間、私はで同様のケースを見つけようとしてきましたwebが、提案されたのはPhantomjsだけでしたが、私が達成したいことに近づく方法の例はありません.

だからあなたへの私の質問:

  1. サイトに特定の JavaScript が含まれているかどうかを確認することはできますか。
  2. javascriptがエラーなしで実行されているかどうかを確認することは可能ですか(コンソールがエラーをスローするかどうか)

今回は誤解されないように願っています :) ご不明な点がございましたら、メッセージを残してください。できるだけ早く対応いたします。

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');

?>
4

3 に答える 3

3

こちらにも載せておきます。私はあなたをphantomjsに連れて行った人だったので、私が思うに、あなたの問題に対する答えを提供するのは公正なことです.
次のスクリプトは、ヘッドレス ファントム ブラウザでページを開き、(イベントを使用して) 実際のブラウザで生成されるコンソール メッセージを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ハンドラーにこの例外を強制的に処理させます。サンドボックスの制限が無限ループの問題を引き起こしている場合、これはある意味でサンドボックスの制限を回避する方法である可能性があります。

于 2013-08-20T08:36:22.410 に答える
1

サイトに特定の JavaScript が含まれているかどうかを確認することはできますか?

2 つのことを行うことができますが、JavaScript を使用する方が実装しやすいと思います。

PHP の使用:

  • データベース内の URL からコンテンツを取得する
  • にロードしてDOMDocument、コードの特定の部分を検索します
  • そのドキュメントからすべての外部 JavaScript ファイルを抽出します
    • それらもフェッチし、その中の特定のコード部分を検索します

JavaScript の使用

  • コンストラクターまたは開始メソッド内で AJAX 要求を実装する
  • スクリプトが実行されている現在のドメインを送信し、データベース内のリストと比較します

セルフホスティング

  • この回答を書いているときに説明したように、これは別の可能性です。ログには、このスクリプトがアクセスしたすべてのページが表示される可能性があるためです。

javascriptがエラーなしで実行されているかどうかを確認することは可能ですか?

実行時にこれを確認する必要があるため、これはもう少し複雑です。スクリプトのユーザーがコードを拡張または変更したり、単に間違った方法で使用したり、コードと競合するものを持っていると想像してください。このコードは、トリガーされる場合とトリガーされない場合があるユーザー インタラクションを呼び出すため、到達しない可能性があります。

1 つの可能性は、エラーが発生したときに AJAX リクエストを送り返すことです。window.onerrorその目的のためにチェックアウトできます:

window.onerror = function(message, url, lineNumber) {}

これにより、AJAX リクエストを使用してサーバーに渡すことができる詳細情報が得られます。

于 2013-08-20T08:28:08.720 に答える