有時候,你的Blog可能需要這樣的功能:
在自己Blog上彙總並顯示朋友Blog的最新文章,這樣方便自己及時瞭解朋友的訊息,另外,也方便訪問者找到和本Blog相關的blog和文章。
這個功能你可以叫它“Blog彙總”或者“Blog聯播”,目前,實現這樣功能的軟體或服務都有限制:比如,Terac Sinfonia、Lilina、MXNA雖然功能都很強大,但是需要安裝,不能自由定製,不能嵌入到Blog側邊欄。另一方面,目前提供這樣服務的BSP只能彙總本系統內的使用者,限制也很多。
為瞭解決以上問題,我採用AJAX(Asynchronous JavaScript + XML)技術實現了在自己Blog上彙總並顯示朋友Blog的最新文章的功能,你可以根據需要,進行自由定製。預設是支援RSS 2.0規範的,Terac Miracle、Movable Type、Word Press、Donews / 部落格園 / CSDN採用的.Text系統都能很好的支援,你可以自由修改,來支援RSS 0.92、RSS 1.0、Atom 0.3。顯示效果可以看我這個blog右下角的“朋友的最新Blog”。
為什麼採用AJAX呢。首先,彙總別人的RSS不能影響自己網站的速度,所以需要非同步執行,其次,RSS本身就是一個很規範的XML文檔,另外,由於彙總內容大小不可定,所以必須要局部重新整理,最重要的一點,採用AJAX完全把載入解析XML的操作放到用戶端進行處理,節省伺服器頻寬和資源,最後,這個功能我完全用JavaScript實現的,這樣,不管你的blog是ASP、.Net、PHP、JSP、Perl,甚至純HTML的都能用。下面說用法:
首先,在你Blog側邊欄合適位置加入這樣一段代碼:
<script src="ajax_rss.js" type="text/javascript"></script>
然後將下面的內容儲存成“ajax_rss.js”(也可以直接下載我的ajax_rss.js),然後上傳到伺服器相應的位置:
//你可以自由添加符合RSS 2.0規範的 RSS
processRSS('http://www.xintiantang.com/andy/index.xml');
processRSS('http://www.xintiantang.com/joywave/index.xml');
processRSS('http://www.xintiantang.com/skype/index.xml');
processRSS('http://www.donews.net/keso/rss.aspx');
function processRSS(url){
var req = getXMLHttpRequest();
req.onreadystatechange = function () {
if (req.readyState == 4 && req.status == 200) {
var doc=req.responseXML.documentElement;
parseRSS(doc);
}
}
req.open("GET",url, true);
req.send(null);
}
function parseRSS(doc) {
//如果要用RSS 0.92, RSS 1.0, Atom 0.3,你需要改下面3行
var blogName=doc.getElementsByTagName("title")[0].firstChild.data;
var entryName=doc.getElementsByTagName("title")[1].firstChild.data;
var entryLink=doc.getElementsByTagName("link")[1].firstChild.data;
document.getElementById('ajax_rss').innerHTML += '<a target="_blank" href="'+entryLink+'" title="'+blogName+'">'+entryName+'</a><br/>'; }
function getXMLHttpRequest() {
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
好了,安裝結束,測試一下吧。顯示效果可以看我這個blog右下角的“朋友的最新Blog”。
需要說明的是:由於網速和對方伺服器的原因,AJAX不能保證一定能獲得RSS,所以有時可能會顯示不出來。另外,建議不要加太多的blog,由於裝載和解析放到用戶端,過多的blog可能會導致用戶端的系統運行緩慢,甚至瀏覽器崩潰。
更新:2005/06/09 11:33
由於安全原因,XMLHttpRequest不能cross domain,所以只能彙總當前domain上的內容,比如你在新天堂的Blog只能彙總新天堂的,在部落格園上的Blog只能彙總部落格園的,其實對於部分人,這已經足夠了。搜了一下,我找到瞭解決cross domain問題的方案:方法一,用Apache mod_rewrite把other domian的RSS重寫成本地的,這需要設定管理員,比較麻煩,不通用。方法二,用ASP、.Net、PHP、JSP、Perl寫一個Proxy指令碼,我寫好了JSP和PHP的,稍後放出。別的指令碼的就沒辦法了,如果有人寫好了,就發給我吧,共用出來:)。
更新:2005/06/09 17:40
其實這個東西適合訪問量不大的Blog使用,如果你的blog訪問量很大的話,順帶著朋友blog的RSS訪問量也很大,很浪費朋友Blog所在伺服器的頻寬^_^。當然,你可以用bloglines或feedburner中轉,浪費鬼子的頻寬去:D。
如暖暖魚所說的,最好提供這樣的服務,不過我做的東西太多了,我在考慮中^_^。不過要做好需要考慮很多問題:Cache、彙總頻率、彙總效率、RSS儲存等,如果在做這個或要做的朋友也請考慮一下這些問題吧。
PHP代碼(儲存成keso.php,我彙總了Keso的,請別見怪:)。
header( "Content-Type: text/xml" );
//TODO 應該用Cache
$rssData = file_get_contents("http://www.donews.net/keso/rss.aspx");
echo $rssData;
?>
然後上傳到伺服器,在ajax_rss.js裡加入這一行:processRSS('http://www.xintiantang.com/keso.php');,這樣就解決了XMLHttpRequest的cross domain問題。