デベロッパー ガイド: Java

Blogger Data API を使用すると、クライアント アプリケーションは Google Data API フィードの形式で Blogger のコンテンツを表示、更新できます。

クライアント アプリケーションは、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 を使用すると、公開フィードと限定公開フィードの両方にアクセスできます。 公開フィードは認証は不要ですが、読み取り専用です。ブログを変更する場合は、クライアントが限定公開フィードをリクエストする前に認証を行う必要があります。この API は、OAuth 認証、AuthSub プロキシ認証、SafeFrame ユーザー名 / パスワード認証のいずれかによって認証できます。

Google Data API を使用した認証全般については、認証のドキュメントをご覧ください。

このドキュメントの次のセクションのほとんどのサンプルでは、認証済みの GoogleService オブジェクトがあることを前提としています。

OAuth 認証

Java GData ライブラリを使用した OAuth 認証に関するドキュメントについては、Google Data Protocol クライアント ライブラリの OAuth をご覧ください。

AuthSub プロキシ認証

AuthSub プロキシ認証は、Google アカウントでユーザーを認証する必要があるウェブ アプリケーションで使用されます。ウェブサイトの運営者とクライアント コードは、Blogger ユーザーのユーザー名とパスワードにアクセスできません。クライアントは代わりに、特定の AuthSub トークンを取得して、クライアントが特定のユーザーの代わりに操作できるようにします。詳細については、AuthSub のドキュメントをご覧ください。

ユーザーが初めてアプリケーションにアクセスしたときに、まだ認証されていません。この場合、ブログへのアクセス リクエストを認証するために、いくつかの情報と、ユーザーを Google ページに誘導するリンクを表示する必要があります。Java クライアント ライブラリには、Google のページ URL を生成する関数が用意されています。次のコードは、AuthSubRequest ページの URL を取得します。

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 によってユーザーがリダイレクトされるページの URL。
スコープ
アプリケーションが Blogger フィードにアクセスするためのトークンをリクエストしていることを示します。使用するスコープ文字列は http://www.blogger.com/feeds/ です(もちろん、URL エンコードされています)。
安全
クライアントが安全なトークンをリクエストしているかどうかを示します。
session
返されたトークンを多目的(セッション)トークンと交換できるかどうかを指定します。

上記の例は、安全なトークンをリクエストしない呼び出しを示しています(secure の値は false です)。生成されるリクエスト URL は次のようになります。

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 URL の next クエリ パラメータで指定した URL にリダイレクトします。AuthSub システムは、その URL に token クエリ パラメータの値として認証トークンを追加します。例:

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

このトークン値は、1 回限りの AuthSub トークンを表します。この例では、session = true が指定されているため、次のように AuthSubSessionToken サービスを呼び出すことによって、このトークンを AuthSub セッション トークンと交換できます。ここで、urlFromAuthSub はトークンを付加した URL です。

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

つまり、1 回限りのトークンを exchangeForSessionToken メソッド(null は未登録モードの場合)または秘密鍵(登録モードの場合)と一緒に渡すと、AuthSub インターフェースがセッション トークンを返します。登録済みアプリケーションと秘密鍵の詳細については、AuthSub ドキュメントの「署名リクエスト」をご覧ください。

その後、アプリケーションは Blogger とのインタラクションでセッション トークンを使用できます。リクエストごとにセッション トークンを自動的に送信するように Java クライアント ライブラリに指示するには、GoogleService オブジェクトの setAuthSubToken メソッドを呼び出します。

GoogleService.setAuthSubToken(sessionToken, null);

その後、クライアント ライブラリは、すべてのリクエストと一緒にトークンを自動的に送信します。

ClientLogin ユーザー名/パスワード認証

クライアントがスタンドアロンのシングル ユーザー(デスクトップ アプリケーションなど)のクライアントである場合は、SafeFrame 認証を使用します。GoogleService オブジェクトで setUserCredentials メソッドを呼び出すだけで、Blogger でのすべての操作が認証されます。

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

上記のスニペットでは、2 つのパラメータを GoogleService コンストラクタに渡します。最初のパラメータは、操作するサービスの名前です。2 番目のパラメータは、アプリケーションの名前です(companyName-applicationName-versionID の形式)。

サンプル リクエストやサンプル レスポンスなど、SafeFrame 認証の詳細については、インストール済みアプリケーションの認証のドキュメントをご覧ください。

: 特定のセッションのすべてのリクエストで同じトークンを使用します。Blogger のリクエストごとに新しいトークンを取得しないでください。

: SafeFrame のドキュメントに記載されているように、認証リクエストが失敗して CAPTCHA チャレンジが要求される場合があります。Google にキャプチャ キャプチャを発行して処理する場合は、ユーザーを https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger にリダイレクトします(Blobstore のドキュメントに記載されているキャプチャ処理用 URL ではなく)。

ブログのリストの取得

Blogger Data API は、特定のユーザー向けにブログを公開するためのフィードを提供しています。このフィードは「メタフィード」と呼ばれています。

次のサンプルコードでは、認証済みの GoogleService オブジェクトを使用してメタフィードを取得し、各ブログのタイトルを出力します。

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 メソッドで使用される URL をメモします。これはデフォルトのメタフィードの URL です。現在認証されているユーザーのブログのリストを返します。別のユーザーのフィードにアクセスするには、メタフィードの URL の default の代わりにそのユーザーの ID を入力します。ユーザーの ID は、ユーザーのプロフィール URL の末尾にある数字列です。

投稿の作成

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 メソッドは、サービスの投稿 URL をパラメータとして受け取ります。その後、このメソッドは、Blogger によって保存されたエントリを返します。返されるエントリは、送信したものと同じですが、投稿 ID など、Blogger で追加されたさまざまな要素も含まれています。

なんらかの理由でリクエストが失敗した場合、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 に設定し、投稿を更新します。次の 2 つのセクションでは、投稿の取得と更新について説明します。

投稿の取得

以下のセクションでは、クエリ パラメータの有無にかかわらず、ブログ投稿のリストを取得する方法について説明します。

Blogger の公開フィードに対して、認証なしでクエリを実行できます。したがって、公開ブログから投稿を取得する前に、setUserCredentials メソッドを呼び出すことや AuthSub 認証を行う必要はありません。

すべてのブログ投稿の取得

ユーザーの投稿を取得するには、ブログのメタフィードを取得する場合と同じ getFeed メソッドを呼び出します。今回は、ブログ投稿の URL を送信します。

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 メソッドに渡します。

たとえば、期間クエリを送信するには、Query オブジェクトの setPublishedMin メソッドと 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 オブジェクトは、投稿の取得に使用したのと同じ投稿フィードの URL を使用して構築されています。

Blogger Data API では、次の Query メソッドがサポートされています。

addCategoryFilter
カテゴリ(ラベル)を指定して、フィードの検索結果をフィルタします。たとえば、http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie は、FritzLaurie の両方のラベルを持つエントリを返します。
setMaxResults
返されるエントリの最大数を設定します。
setpublishMin、setpublishMax
エントリ公開日の期間を設定します。
setStartIndex
最初に取得される結果の 1 ベースのインデックスを設定します(ページング用)。
setUpdatedMin、setUpdatedMax
エントリの更新日に境界を設定する。orderby パラメータが updated に設定されていない限り、これらのクエリ パラメータは無視されます。

: 現在、orderby クエリ パラメータのセッターはありません。ただし、設定する必要がある場合は、引き続き Query.addCustomParameter() メソッドを使用できます。

クエリ パラメータの詳細については、Blogger Data API リファレンス ガイドGoogle Data API リファレンス ガイドをご覧ください。

投稿の更新

既存のブログ投稿を更新するには、まず更新するエントリを取得して変更し、update メソッドを使用して Blogger に送信します。次のコード スニペットは、サーバーからエントリをすでに取得していると仮定して、ブログのタイトルを変更します。

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 を返します。他のプロパティを更新するには、update を呼び出す前に Entry オブジェクトで設定するだけです。

: 現在、投稿に関連付けられた著者データの変更はサポートされていません。

投稿の削除

投稿を削除するには、次のように、投稿の編集 URL を 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);
}

: 現時点では、認証済みユーザーが所有しているブログにのみコメントを投稿できます。

: 現在、コメントのカスタム作成者の設定はサポートされていません。新しいコメントはすべて、現在認証されているユーザーが作成したコメントとして表示されます。

コメントの取得

特定の投稿に対するコメントは、投稿のコメント フィード URL から取得できます。

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();
}

または、ブログのコメント フィード URL を使用して、すべての投稿からコメントを取得することもできます。

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

コメントの削除

コメントを削除するには、次のように、コメントの編集 URL を GoogleService オブジェクトの delete メソッドに渡します。

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

トップへ戻る