2008年1月15日

Google AJAX Feed API

Google.com serves as a proxy to the outside feeds。

Google AJAX Feed APIGoogle AJAX API的一個分支,簡單來說就是連到Google來取得feed,本質上仍是使用script tag的方式突破same-origin policy取得資料。

  • 說明上說要先申請一個Google API key,雖然要輸入使用的URL(說明上說在此URL下所有的子目錄都可以使用,且可以用不同的URL申請),但是我用部落格申請的key,在個人電腦上也可以用,好像並沒有限制,甚至沒有key也可以用。
  • 依照Developer's Guide的說明,使用起來非常直覺簡單。
  • 有提供JSON、XML、Conbined JSON/XML三種資料格式,JSON格式將RSS或Atom的部分常用元素轉成對應的欄位,並統一名稱,並沒有全部轉換,XML格式可以使用google.feeds.getElementsByTagNameNS來取得擴充的資料。
  • feed資料由crawler(Feedfetcher)取得,所以不一定是最新的。
  • 可以設定取得資料的數量,預設是4個。
  • 對於一般的資料顯示,有FeedControl可以直接用,另外還有提供一些成品可以套用(請參考ExampleBlog)。
  • 甚至可以做feed的查詢及探知

範例

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("feeds", "1");

function initialize() {
  var feed = new google.feeds.Feed("http://api.flickr.com/services/feeds/photos_public.gne?tags=羅平,油菜花,sunset&tagmode=all");
  feed.setResultFormat(google.feeds.Feed.MIXED_FORMAT);
  feed.load(function(result) {
    if (!result.error) {
      var div = document.getElementById("flickr photos");
      for (var i = 0; i < result.feed.entries.length; i++) {
        var entry = result.feed.entries[i];
        var img = document.createElement("img");
        var imgLink = google.feeds.getElementsByTagNameNS(entry.xmlNode, "http://www.w3.org/2005/Atom", "link")[2];
        img.setAttribute("src", imgLink.getAttribute("href"));
        img.setAttribute("title", entry.title);
        img.setAttribute("width", "200");
        img.setAttribute("height", "116");
        var a = document.createElement("a");
        a.setAttribute("href", entry.link);
        a.setAttribute("target","_blank");
        a.appendChild(img);
        div.appendChild(a);
      }
    }
  });
}

google.setOnLoadCallback(initialize);
</script>

動態載入updated on 2008-04-18

基本上使用Google AJAX API loader載入所需的模組分為兩個階段:

  1. <script type="text/javascript" src="http://www.google.com/jsapi"></script> 建立google、google.loader模組及相關函式
  2. 使用google.load(moduleName, moduleVersion, optionalSettings)載入所需要的AJAX API模組,例如google.load("feeds","1")載入google.feeds模組

Google對這兩個階段都提供了動態載入的支援 (參考:blogdoc):

  1. 加上callback參數,動態插入<script type="text/javascript" src="http://www.google.com/jsapi&callback=YOUR_CALLBACK"></script>,載入完成後會執行所指定的回呼函式。
  2. 傳入callback參數,google.load(..., ..., {"callback": YOUR_CALLBACK})會使用動態插入script tag的方式載入模組,完成後會執行所指定的回呼函式。
Read more

2008年1月13日

Multiple labels or tags search

目前很多網站及部落格都有提供使用標籤來分類文章的功能,對於以網頁提供服務的方式,這是傳統目錄分類方式的合理替代品。在瀏覽部落格時,常會想要找出符合多個標籤的文章,但網站上通常都沒有明確的說明如何做到,只把標籤當作類似單層的目錄來使用。

以下是我目前知道的多標籤查詢方法:

1. Technorati

在 Advanced Serch 中,Tag Search 好像可以做多個標籤邏輯組合的搜尋(使用AND、OR、NOT,空白似乎代表AND,標籤中有空白的話可用雙引號「"」將標籤包起來),但是介面上缺少只搜尋某個網站文章的功能,但是上面的 Keyword Search 卻有這項功能,使用的參數名稱是from,於是試著自己加看看,結果竟然成功了。

例如要搜尋 Ajaxian.com 上包含 jQuery 和 Prototype 標籤的文章(標籤的大小寫好像無關,這點跟一些部落格上的查詢好像有差),可以在網址列上輸入 http://technorati.com/tag/jQuery+AND+prototype?authority=n&language=n&from=http://ajaxian.com/ (中間用 jQuery+prototype 也可以)。

可惜的是查詢結果的 feed 及網站所提供的 Tag Query API 無法用上面的參數得到限制網站的結果,不過或許還有隱藏秘技沒被發現,有了這些資訊,要自己做一個多標籤限制網站的Technorati搜尋介面應該不難。

另外有的部落格較舊的文章在 Technorati 上找不到。(ps. 關於 Technorati 有一些問題,例如如何與部落格同步增減標籤及文章,或著如何以人工方式做到,如果有人知道希望能分享一下)

2. Blogger Data API(for Blogger.com 的 blog )

Blogger Data API 是 Google Data API 的一個分支,提供以 feed 的格式存取 blog 資料的功能,其中包括查詢多個標籤文章的功能,例如要查詢本站包含 Javascript 和 Cross Domain 標籤的文章,可以輸入 http://happytemplate.blogspot.com/feeds/posts/summary/-/Javascript/Cross%20Domain

要注意的是標籤的大小寫要一致,並且要經過 UTF-8 編碼,目前只支援 AND 的功能,用「/」表示。另外網頁上所列的查詢參數有一些錯誤,orderby 的值可以是 published(發佈)或 updated(更新),updated-min 和 updated-max 要與 orderby=updated 一起用才會有效,日期時間的值似乎不能加後面的時區(與 Google Data API 上說的不一樣),以上這些可在討論群組中找到。

利用這些資訊,練習寫了一個 Multiple labels search,放在側邊欄:

  • 多個標籤的 AND 以「/」表示,標籤與/之間不能有空白,例如:Javascript/Cross Domain
  • 本站查詢可以從下方標籤雲以拖拉的方式輸入
  • 可以查詢其他 Blogger.com 的 blog
  • 日期格式為YYYY-MM-DD,會跳出月曆方便選擇,不接受時間
  • 為了方便,日期範圍統一依照排序方式為發佈日期或更新日期
  • 顯示的日期時間以查詢目標網站的時區為主,不做轉換

程式方面的感想:

  • 使用 dynamic script sag 及 JSONP 方式取得資料,若是查詢失敗或產生的網址有錯,script tag 的 onload 事件好像不會觸發,所以使用 timer 來刪除失敗時的 script tag,不知道是否有更好的方法,另外不知是否有辦法取得 script tag 所載入的內容。
  • IE 真的很難搞,連簡單的產生並設定 DOM 物件的屬性的都會有問題,根據網路上的討論,似乎短時間內還不會改變。
  • 放在 Google project hosting 的 download 中的 css 檔似乎無法在網頁中直接連結,還不知道原因。
  • 會再用 Google AJAX Feed API 試試看。
  • Yahoo PipesFilter operator 也可以用來過濾標籤,但是對於 Atom 格式的 feed 會有問題,未深入研究,不知怎樣將參數導入 Filter operator。
Read more