Javascript跨域RSS Feed解析的代理问题

时间:2010-04-20 22:14:35

标签: php javascript proxy cross-domain

这是我的Javascript函数,它通过代理脚本获取rss feed,然后从feed中输出5个最新的rss项以及指向样式表的链接:

    function getWidget (feed,limit) {  if (window.XMLHttpRequest) {
        xhttp=new XMLHttpRequest()
    } else {
        xhttp=new ActiveXObject("Microsoft.XMLHTTP")
    }
    xhttp.open("GET","http://MYSITE/proxy.php?url="+feed,false);
    xhttp.send("");
    xmlDoc=xhttp.responseXML;
    var x = 1;
    var div = document.getElementById("div");
    div.innerHTML = '<link type="text/css" href="http://MYSITE/css/widget.css" rel="stylesheet" /><div id="rss-title"></div></h3><div id="items"></div><br /><br /><a href="http://MYSITE">Powered by MYSITE</a>';
    document.body.appendChild(div);
    content=xmlDoc.getElementsByTagName("title");
    thelink=xmlDoc.getElementsByTagName("link");
    document.getElementByTagName("rss-title").innerHTML += content[0].childNodes[0].nodeValue;
    for (x=1;x<=limit;srx++) {
        y=x;
        y--;
        var theitem = '<div class="item"><a href="'+thelink[y].childNodes[0].nodeValue+'">'+content[x].childNodes[0].nodeValue+'</a></div>';
        document.getElementById("items").innerHTML += theitem;
    }  }

以下是来自proxy.php的代码:

    $session = curl_init($_GET['url']);                    // Open the Curl session
curl_setopt($session, CURLOPT_HEADER, false);          // Don't return HTTP headers
curl_setopt($session, CURLOPT_RETURNTRANSFER, true);   // Do return the contents of the call
$xml = curl_exec($session);                            // Make the call
header("Content-Type: text/xml");                  // Set the content type appropriately
echo $xml;        // Spit out the xml
curl_close($session); // And close the session

现在,当我尝试在任何不是我的网站的域上加载它时,没有任何内容加载。我没有JS错误,但我在firebug的Console选项卡中得到“407 Proxy Authentication Required”

所以我不确定如何使这项工作。

目标是能够获取RSS提要,解析它以获取标题和链接,并将其吐出到网络上任何网站上的某些HTML中。我基本上为我网站的各种RSS提要制作一个简单的RSS小部件。

我的Javascript很糟糕

我真的是Javascript的初学者。我非常了解jQuery,但在这种情况下我无法使用它,因为这个脚本将嵌入任何网站,我不能真正依赖jQuery库。所以我决定编写一些基于可用的默认XML解析选项的基本Javascript。这里的任何建议都很酷。谢谢!

x和y变量有什么用?

我的网站创建RSS提要的方式是第一个标题实际上是RSS提要标题。第二个标题是第一个项目的标题。第一个链接是第一个项目的链接。因此,当使用javascript获取标题时,我必须首先获取第一个标题(这是RSS标题),然后从作为项目的第一个标题的第二个标题开始。对不起,我不认为这与我的问题有关。只想澄清我的代码。

1 个答案:

答案 0 :(得分:3)

因为我发现了YQL,所以在处理这些类型的用例时,这是我的选择方法,因为我可以保留JavaScript中的所有内容,而不必担心跨域代理。更好的是,您将能够将所有处理卸载到客户端。

这个简单的查询将为您完成:选择标题,链接自rss,其中url ='http://rss.news.yahoo.com/rss/topstories'

查询的永久链接: https://developer.yahoo.com/yql/console/?q=select%20title%2C%20link%20from%20rss%20where%20url%3D%27http%3A%2F%2Frss.news.yahoo.com%2Frss%2Ftopstories%27

示例代码段:

<script>

function cbfunc(data){
  for(var i in data.query.results.item) {
    var item = data.query.results.item[i];
    console.log(item.title);
    console.log(item.link);
  }
}

function execYQL(yql, callbackFuncName) {
    var url = "http://query.yahooapis.com/v1/public/yql?q=" + encodeURIComponent(yql) + "&format=json&callback=cbfunc";
    var head= document.getElementsByTagName('head')[0];
    var script= document.createElement('script');
    script.type= 'text/javascript';
    script.src= url;
    head.appendChild(script);
}

execYQL("select title, link from rss where url='http://rss.news.yahoo.com/rss/topstories'");

</script>

Just cut&amp;将其粘贴到HTML文件中并打开萤火虫进一步检查。