0

少し助けが必要..

XHRを使用してWebサイトのURLのページランクを取得するためのJqeryプラグインを開発しています.

問題は、Google サーバーからランクを要求すると、ページにコンテンツが返されないことですが、インスペクターを使用して要求された URL を取得し、ブラウザーを介してアクセスすると、ページランクが表示されます。ヘッダー付きの何かである必要がありますが、戸惑いました。

いくつかのソース コードを示しますが、確認する必要のないいくつかの側面を削除しました。

pagerank.plugin.js

(
    $.fn.PageRank = function(callback)
    {
        var _library = new Object();

        //Creat the system library
        _library.parseUrl = function(a)
        {
            var b = {};
            var a = a || '';
            /*
                * parse the url to extract its parts
            */
            if (a = a.match(/((s?ftp|https?):\/\/){1}([^\/:]+)?(:([0-9]+))?([^\?#]+)?(\?([^#]+))?(#(.+))?/)) {
                b.scheme    = a[2]  ? a[2]  : "http";
                b.host      = a[3]  ? a[3]  : null;
                b.port      = a[5]  ? a[5]  : null;
                b.path      = a[6]  ? a[6]  : null;
                b.args      = a[8]  ? a[8]  : null;
                b.anchor    = a[10] ? a[10] : null
            }
            return b
        }

        _library.ValidUrl = function(url)
        {
            var b = true;
            return b = url.host === undefined ? false : url.scheme != "http" && url.scheme != "https" ? false : url.host == "localhost" ? false : true
        }

        _library.toHex = function(a){
            return (a < 16 ? "0" : "") + a.toString(16)
        }

        _library.hexEncodeU32 = function(a) {
        }

        _library.generateHash = function(a)
        {
            for (var b = 16909125, c = 0; c < a.length; c++)
            {
            }
            return _library.hexEncodeU32(b)
        }

        var CheckPageRank = function(domain,_call)
        {
            var hash = _library.generateHash(domain);
            $.ajax(
            {
                url: 'http://www.google.com/search?client=navclient-auto&ch=8'+hash+'&features=Rank&q=info:' + escape(domain),
                async: true,
                dataType: 'html',
                ifModified:true,
                contentType:'',
                type:'GET',
                beforeSend:function(xhr)
                {
                    xhr.setRequestHeader('Referer','http://google.com/'); //Set Referer
                },
                success: function(content,textS,xhr){
                    var d = xhr.responseText.substr(9, 2).replace(/\s$/, "");
                    if (d == "" || isNaN(d * 1)) d = "0";
                    _call(d);
                }
            });
        }
        //Return the callback
        $(this).each(function(){
            urlsegments = _library.parseUrl($(this).attr('href'))
            if(_library.ValidUrl(urlsegments))
            {
                CheckPageRank(urlsegments.host,function(rank){
                    alert(rank)
                    callback(rank);
                });
            }
        });
        return this; //Dont break any chain.
    }
)(jQuery);

Index.html(例)

<html>
    <head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
        <script type="text/javascript" src="pagerank.plugin.js"></script>
        <script type="text/javascript">
          $(document).ready(function() {
            $('a').PageRank(function(pr){
                alert(pr);
            })
        });
        </script>
    </head>
    <body>
        <a href="http://facebook.com">a</a>
<a href="http://twitter.com">a</a>
        <div></div>
    </body>
</html>

なぜこれを行うのか理解できません。

--

ノート:

jquery 以外の XHR を使用しても問題なく動作します。

function getPageRank(a, b) {
    a = "http://www.google.com/search?client=navclient-auto&ch=8" + awesomeHash(a) + "&features=Rank&q=info:" + a;
    var c = new XMLHttpRequest;
    c.open("GET", a, true);
    c.onreadystatechange = function () {
        if (c.readyState == 4) {
            console.log("reponse text is " + c.responseText);
            var d = c.responseText.substr(9, 2).replace(/\s$/, "");
            if (d == "" || isNaN(d * 1)) d = "0";
            b(d)
        }
    };
    c.send()
}
4

2 に答える 2

1

AJAX を使用して、(ページがホストされているサーバー以外の) 別のサーバーからコンテンツをフェッチすることはできません。ブラウザーは、セキュリティ対策としてこれを明示的に禁止しています。

最善の方法は、独自のサーバーでホストされているサーバー側スクリプトに AJAX リクエストを送信し、そのスクリプトが Google と通信できるようにすることです。

于 2010-06-07T01:40:11.547 に答える
-1

安全のため、ブラウザはajaxが別のドメインに接続することを許可していません。そうしないと、多くのgoogleが表示され、weberはサービスするための「html」ページをホストできますか?

ただし、jsonは実行でき、実行時にページにスクリプトを挿入し、scriptsrcプロパティが設定されます。

グーグルページランクAPIは「1:1:5」のようなテキストのみを返しますが、これはスクリプターでは説明できないため、すべてなくなっています!

だから、ajaxはそれを行うことはできません。

于 2012-03-11T04:45:34.790 に答える