開發人員指南:Java

重要事項: 我們將於 2024 年 9 月 30 日停止支援 2.0 版 Google Data API。 為了確保能持續運作,請更新使用 2.0 版 Google 將 Data API 升級至最新版 API。 如要使用最新版本,請使用左側的 navbar 中的連結。注意:雖然部分 GET 要求 (例如商家資訊貼文) 仍會支援動態饋給網址,但兩者的行為略有不同。如需詳細資訊,請參閱 Blogger 說明說明文件。

Blogger Data API 可讓用戶端應用程式查看及更新 Blogger Google Data API 資訊提供形式的內容。

您的用戶端應用程式可以使用 Blogger Data API 建立新網誌 文章、編輯或刪除現有網誌文章,以及查詢相符的網誌文章 或特定標準

除了提供 Blogger Data API 功能的相關背景資訊,本文件還提供使用 Java 用戶端程式庫進行基本 Data API 互動操作的範例。如果您想進一步瞭解程式庫使用的基礎通訊協定,請參閱本開發人員指南的「通訊協定」一節。

目錄

目標對象

本文件適用於想要編寫可與 Blogger 互動的 Java 用戶端應用程式的程式設計師。

本文件假設您瞭解 Google Data API 通訊協定背後的一般概念。

如要參考用戶端程式庫提供的類別和方法,請參閱 Java 用戶端程式庫 API 參考資料。Blogger Data API 一般參考資料 相關資訊,請參閱通訊協定參考資料 指南

開始使用

如需用戶端程式庫設定的相關說明,請參閱入門指南

Java 用戶端程式庫需要 Java 1.5。下載 用戶端程式庫,您可以參閱 java/lib/gdataclient-1.0.jar 檔案。

建立 Blogger 帳戶

建議您註冊 Blogger 帳戶進行測試。Blogger 會使用 Google 帳戶,因此如果您使用 已經有 Google 帳戶,這樣就大功告成了。

執行程式碼範例

完整運作的範例用戶端,內含所有程式碼範例 文件,就在 Java 用戶端程式庫發行版中,在 目錄 gdata/java/sample/blogger/BloggerClient.java。建構和執行操作說明會包含在 README.txt 檔案的相同目錄中。

範例用戶端會在提供的網誌上,執行多項作業 示範 Blogger Data API 的使用方式。

如要將這份文件中的範例編譯到您的程式碼中,您需要有 下列 import 陳述式:

import com.google.gdata.client.*;
import com.google.gdata.data.*;
import com.google.gdata.util.*;
import java.io.IOException;
import java.net.URL;

向 Blogger 服務進行驗證

您可以使用 Blogger Data API 存取公開和私人動態消息。 公開動態消息不需驗證,但目前處於唯讀狀態。如果發生以下情況: 至於要修改網誌,則您的客戶必須先完成驗證,才能要求 私人動態饋給。可使用以下三種方式進行驗證:OAuth 驗證、AuthSub Proxy 驗證或 ClientLogin 使用者名稱/密碼 驗證。

如要進一步瞭解一般使用 Google Data API 的驗證方式,請參閱驗證說明文件

本文件後續章節中的大多數範例都假設您 經過驗證的 GoogleService 物件。

OAuth 驗證

如需使用 Java GData 程式庫進行 OAuth 驗證的說明文件,請參閱「Google Data Protocol Client Libraries 中的 OAuth」。

AuthSub Proxy 驗證

以下應用程式須使用 AuthSub Proxy 驗證 驗證他們的 Google 帳戶使用者。網站營運商和用戶端 程式碼無法存取 Blogger 使用者的使用者名稱和密碼; 相反地,用戶端會取得特殊 AuthSub 權杖,讓用戶端能 代表特定使用者詳情請參閱 AuthSub 說明文件

使用者首次造訪應用程式時,尚未完成驗證程序。在這種情況下,您需要顯示一些資訊和連結,引導使用者前往 Google 頁面,驗證您要求存取其網誌的權限。Java 用戶端程式庫提供了函式來產生 指定網頁網址下方程式碼會擷取 AuthSubRequest 頁面的網址:

String next = "http://www.example.com/welcome.html";
String scope = "http://www.blogger.com/feeds/";
boolean secure = false;
boolean session = true;
String authSubLogin = AuthSubUtil.getRequestUrl(next, scope, secure, session);

getRequestUrl 方法會採用下列參數 (對應至 AuthSubRequest 處理常式使用的查詢參數):

下一個
Google 應在驗證程序後將使用者重新導向至的網頁網址。
範圍
表示應用程式正在要求存取 Blogger 動態消息的憑證。要使用的範圍字串是 http://www.blogger.com/feeds/ (當然,網址經過編碼)。
安全
指出用戶端是否要求安全權杖。
工作階段
指出是否可以將傳回的權杖換成多用途 (工作階段) 權杖。

上述範例顯示未要求安全權杖的呼叫 (secure 的值為 false)。產生的要求網址可能如下所示:

https://www.google.com/accounts/AuthSubRequest?scope=http%3A%2F%2Fwww.blogger.com%2Ffeeds%2F&session=1&secure=0&next=http%3A%2F%2Fwww.example.com%2Fwelcome.html

使用者點選連結前往 Google 網站,並驗證 Google 帳戶。

使用者通過驗證後,AuthSub 系統會將使用者重新導向至網址 您在 AuthSubRequest 的 next 查詢參數中指定 網址。AuthSub 系統會將驗證權杖附加到該網址,做為 token 查詢參數的值。例如:

http://www.example.com/welcome.html?token=yourAuthToken

這個權杖值代表單次使用的 AuthSub 權杖。在這個範例中,由於已指定 session = true,因此您可以呼叫 AuthSubSessionToken 服務,將這個權杖換成 AuthSub 工作階段權杖,如下所示:urlFromAuthSub 是 AuthSub 附加權杖的網址:

String token = AuthSubUtil.getTokenFromReply(urlFromAuthSub);
String sessionToken = AuthSubUtil.exchangeForSessionToken(token, null);

也就是說,您將一次性使用權杖和 null (註冊模式) 或私密金鑰 (未註冊模式) 一併傳送至 exchangeForSessionToken 方法,而 AuthSub 介面會傳回工作階段權杖。如要進一步瞭解已註冊的應用程式和私密金鑰,請參閱 AuthSub 說明文件中的「簽署要求」一節。

之後,應用程式就能在與 Blogger 的後續互動中使用工作階段權杖。指示 Java 用戶端程式庫自動傳送工作階段 權杖時,請呼叫 GoogleService 物件的 setAuthSubToken 方法:

GoogleService.setAuthSubToken(sessionToken, null);

之後,用戶端程式庫會自動隨著每個要求傳送權杖。

ClientLogin 使用者名稱/密碼驗證

如果用戶端是獨立的單一使用者「已安裝」用戶端 (例如桌面應用程式),請使用 ClientLogin 驗證。只要呼叫 GoogleService 物件的 setUserCredentials 方法 且所有後續與 Blogger 的互動都會經過驗證:

GoogleService myService = new GoogleService("blogger", "exampleCo-exampleApp-1");
myService.setUserCredentials("user@example.com", "secretPassword");

在上方程式碼片段中,我們將兩個參數傳遞至 GoogleService 建構函式。第一個參數是 讓使用者擁有及使用應用程式第二個參數是 填寫申請表 companyName-applicationName-versionID

如要進一步瞭解 ClientLogin 驗證 (包括要求和回應範例),請參閱「已安裝應用程式的驗證」說明文件。

注意: 提供的工作階段;則不需要為每個 Blogger 要求取得新權杖

注意:如 ClientLogin 說明文件所述,驗證要求可能會失敗,並要求人機驗證 (CAPTCHA) 挑戰。如果您希望 Google 發出並處理人機驗證挑戰,請將使用者導向 https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger (而非 ClientLogin 說明文件中提供的人機驗證處理網址)。

擷取網誌清單

Blogger Data API 提供的動態饋給會列出特定使用者的網誌,這類動態饋給稱為「metafeed」。

以下範例程式碼使用已驗證的 GoogleService 物件來擷取 metafeed,然後列印每個網誌的標題。

public static void printUserBlogs(GoogleService myService)
    throws ServiceException, IOException {

  // Request the feed
  final URL feedUrl = new URL("http://www.blogger.com/feeds/default/blogs");
  Feed resultFeed = myService.getFeed(feedUrl, Feed.class);

  // Print the results
  System.out.println(resultFeed.getTitle().getPlainText());
  for (int i = 0; i < resultFeed.getEntries().size(); i++) {
    Entry entry = resultFeed.getEntries().get(i);
    System.out.println("\t" + entry.getTitle().getPlainText());
  }
}

請記下 getFeed 方法使用的網址。這是預設的 metafeed 網址,會傳回目前已驗證使用者的部落格清單。如要存取其他使用者的動態饋給,您可以在動態饋給網址中將使用者 ID 代入 default。使用者 ID 是一串數字 。

正在建立貼文

Blogger Data API 可讓您建立和發布新網誌項目,例如: 以及建立項目草稿

注意:如要為貼文設定自訂作者, 。所有新貼文都會顯示為由目前已驗證的使用者建立。

發布網誌文章

您可以使用 Java 用戶端程式庫發布新的網誌項目。

首先,建立代表網誌文章的 Entry 物件。接著 您可以設定網誌文章的標題、內容和其他屬性。最後,請使用 GoogleService 物件插入貼文。以下是發布新部落格文章的範例:

public static Entry createPost(
    GoogleService myService, String blogID, String title,
    String content, String userName)
    throws ServiceException, IOException {
  // Create the entry to insert
  Entry myEntry = new Entry();
  myEntry.setTitle(new PlainTextConstruct(title));
  myEntry.setContent(new PlainTextConstruct(content));

  // Ask the service to insert the new entry
  URL postUrl = new URL("http://www.blogger.com/feeds/" + blogID + "/posts/default");
  return myService.insert(postUrl, myEntry);
}

insert 方法會使用服務的發布網址做為參數。然後,方法會傳回 Blogger 儲存的項目。系統會傳回您傳送的項目,但也會包含 Blogger 新增的各種元素,例如文章 ID。

如果您的要求因為某些原因而失敗,Blogger 可能會傳回不同的狀態 再也不是件繁重乏味的工作如要瞭解狀態碼,請參閱 Google Data API 通訊協定參考文件

建立網誌文章草稿

貼文草稿的建立方式與公開貼文相同,但您必須設定 Entry 物件的 draft 屬性。你可以 將上方醒目顯示的網誌文章加上醒目顯示的文字,建立與上述內容類似的草稿 行:

public static Entry createPost(GoogleService myService, String blogId,
    String title, String content, String userName,
    Boolean isDraft)
    throws ServiceException, IOException {
  // Create the entry to insert
  Entry myEntry = new Entry();
  myEntry.setTitle(new PlainTextConstruct(title));
  myEntry.setContent(new PlainTextConstruct(content));
  myEntry.setDraft(isDraft);

  // Ask the service to insert the new entry
  URL postUrl = new URL("http://www.blogger.com/feeds/" + blogID + "/posts/default");
  return myService.insert(postUrl, myEntry);
}

如要將現有的網誌文章草稿轉換成已發布的文章,您可以擷取 將草稿屬性設為 false,然後更新 張貼。以下兩節將說明如何擷取及更新貼文。

擷取貼文

下列各節將說明如何擷取網誌文章清單,並使用 以及不含查詢參數

您不需要驗證即可查詢 Blogger 公開動態消息。因此 不需要呼叫 setUserCredentials 方法,也不需要執行 AuthSub 驗證才能擷取公開網誌的文章。

擷取所有網誌文章

如要擷取使用者的貼文,請呼叫用於擷取網誌中繼動態的 getFeed 方法,但這次請傳送網誌貼文動態的網址:

public static void printAllPosts(
    GoogleService myService, String blogId)
    throws ServiceException, IOException {
  // Request the feed
  URL feedUrl = new URL("http://www.blogger.com/feeds/" + blogID + "/posts/default");
  Feed resultFeed = myService.getFeed(feedUrl, Feed.class);

  // Print the results
  System.out.println(resultFeed.getTitle().getPlainText());
  for (int i = 0; i < resultFeed.getEntries().size(); i++) {
    Entry entry = resultFeed.getEntries().get(i);
    System.out.println("\t" + entry.getTitle().getPlainText());
  }
  System.out.println();
}

使用查詢參數擷取貼文

您可以使用 Blogger Data API 要求符合指定條件的一組項目,例如要求在特定日期範圍內發布或更新的網誌文章。為此,您需要建立 Query 物件,並將其傳遞至 GoogleService.getQuery 方法。

舉例來說,如要傳送日期範圍查詢,請使用 setPublishedMinQuery 物件的 setPublishedMax 方法。 下列程式碼片段會針對在 指定開始時間和結束時間:

public static void printDateRangeQueryResults(
    GoogleService myService, String blogId,
    DateTime startTime, DateTime endTime)
    throws ServiceException, IOException {
  // Create query and submit a request
  URL feedUrl = new URL("http://www.blogger.com/feeds/" + blogID + "/posts/default");
  Query myQuery = new Query(feedUrl);
  myQuery.setPublishedMin(startTime);
  myQuery.setPublishedMax(endTime);
  Feed resultFeed = myService.query(myQuery, Feed.class);

  // Print the results
  System.out.println(resultFeed.getTitle().getPlainText() +
      " posts between " + startTime + " and " + endTime);
  for (int i = 0; i < resultFeed.getEntries().size(); i++) {
    Entry entry = resultFeed.getEntries().get(i);
    System.out.println("\t" + entry.getTitle().getPlainText());
    System.out.println("\t" + entry.getUpdated().toStringRfc822());
  }
  System.out.println();
}

請注意,Query 物件是使用用於擷取貼文的相同貼文動態饋給網址建構的。

Blogger Data API 支援下列 Query 方法:

addCategoryFilter
指定類別 (也稱為標籤) 即可篩選動態饋給結果。舉例來說,http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie 會傳回標籤為 FritzLaurie 的項目。
setMaxResults
設定要傳回的項目數量上限,
setPublishedMin、setPublishedMax
設定項目發布日期的邊界。
setStartIndex
設定要擷取第一個結果的 1 起始索引 (用於分頁)。
setUpdatedMin、setUpdatedMax
設定項目更新日期的邊界。除非 orderby 參數設為 updated,否則系統會忽略這些查詢參數。

注意orderby 查詢參數目前沒有 setter。不過,如果您需要設定此值,還是可以使用 Query.addCustomParameter() 方法。

如要進一步瞭解查詢參數,請參閱 Blogger Data API 參考指南Google Data API 參考指南

更新貼文

如要更新現有的網誌文章,請先擷取您想要 更新後,加以修改,接著使用 update 方法。以下程式碼片段會修改網誌文章的標題,假設您已從伺服器擷取該文章。

public static Entry updatePostTitle(
    GoogleService myService, Entry entryToUpdate, String newTitle)
    throws ServiceException, IOException {
  entryToUpdate.setTitle(new PlainTextConstruct(newTitle));
  URL editUrl = new URL(entryToUpdate.getEditLink().getHref());
  return myService.update(editUrl, entryToUpdate);
}

上述程式碼會傳回包含Entry 最新更新的文章。如要更新任何其他屬性,只要在 Entry 物件後再呼叫 update

注意:目前不支援修改與貼文相關聯的作者資料。

刪除訊息

如要刪除貼文,請將貼文的編輯網址傳遞至 GoogleService 物件的 delete 方法,如下所示:

public static void deletePost(
    GoogleService myService, String editLinkHref)
    throws ServiceException, IOException {
  URL deleteUrl = new URL(editLinkHref);
  myService.delete(deleteUrl);
}

留言

Blogger Data API 可用於建立、擷取及刪除留言。不支援更新留言功能 (網頁版也不支援更新功能) 介面)。

正在建立留言

如要張貼留言,請建立 Entry 物件並如下插入:

public static Entry createComment(
    GoogleService myService, String blogID, String postId,
    String commentText)
    throws ServiceException, IOException {
  // Build the comment feed URI
  String commentsFeedUri = "http://www.blogger.com/feeds/" + blogID + "/" + postId + "/comments/default";
  URL feedUrl = new URL(commentsFeedUri);

  // Create a new entry for the comment and submit it to the GoogleService
  Entry myEntry = new Entry();
  myEntry.setContent(new PlainTextConstruct(commentText));
  return myService.insert(feedUrl, myEntry);
}

注意:目前您只能在 已驗證使用者所擁有的網誌。

注意:如要為留言設定自訂作者, 。所有新評論都會顯示為 由 建立 目前已通過驗證的使用者

擷取留言

你可以透過貼文的留言動態消息網址,擷取特定貼文的留言:

public static void printAllComments(
    GoogleService myService, String blogID, String postId)
    throws ServiceException, IOException {
  // Build comment feed URI and request comments on the specified post
  String commentsFeedUri = "http://www.blogger.com/feeds/" + blogID + "/" + postId + "/comments/default";
  URL feedUrl = new URL(commentsFeedUri);
  Feed resultFeed = myService.getFeed(feedUrl, Feed.class);

  // Display the results
  System.out.println(resultFeed.getTitle().getPlainText());
  for (int i = 0; i < resultFeed.getEntries().size(); i++) {
    Entry entry = resultFeed.getEntries().get(i);
    System.out.println("\t" +
        ((TextContent) entry.getContent()).getContent().getPlainText());
    System.out.println("\t" + entry.getUpdated().toStringRfc822());
  }
  System.out.println();
}

或者,您也可以使用網誌的留言動態消息網址,取得所有貼文的留言:

http://www.blogger.com/feeds/blogID/comments/default

正在刪除留言

如要刪除留言,請將留言的編輯網址傳遞至 GoogleService 物件的 delete 方法,如下所示:

public static void deleteComment(GoogleService myService, String editLinkHref)
    throws ServiceException, IOException {
  URL deleteUrl = new URL(editLinkHref);
  myService.delete(deleteUrl);
}

返回頁首