デベロッパー ガイド: PHP

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

クライアント アプリケーションで Blogger Data API を使用すると、新しいブログ投稿の作成、既存のブログ投稿の編集または削除、特定の条件に一致するブログ投稿の検索を行うことができます。

このドキュメントでは、Blogger Data API の機能の概要に加えて、Zend Google Data API クライアント ライブラリを使用した Data API の基本的な操作例も紹介します。ライブラリが使用する基礎となるプロトコルの詳細については、このデベロッパー ガイドのプロトコルのセクションをご覧ください。

目次

対象読者

このドキュメントは、Blogger とやり取りできる PHP クライアント アプリケーションを作成するプログラマーを対象としています。

このドキュメントは、Google Data API プロトコルの背後にある一般的な概念を理解していることを前提としています。

クライアント ライブラリによって提供されるクラスとメソッドのリファレンス情報については、PHP クライアント ライブラリの API リファレンスをご覧ください。Blogger Data API の一般的なリファレンス情報については、プロトコルのリファレンス ガイドをご覧ください。

ご利用にあたって

クライアント ライブラリの設定については、スタートガイドをご覧ください。

Zend クライアント ライブラリには PHP 5.1.4 以降が必要です。Zend Framework の一部として入手できます。また、別途ダウンロードすることもできます。Blogger を操作するには、バージョン 1.0.0 以降のクライアント ライブラリを使用します。

Blogger アカウントを作成する

テスト目的で Blogger アカウントに登録することもできます。Blogger では Google アカウントを使用するので、Google アカウントをすでにお持ちであれば問題ありません。

サンプルコードの実行

このドキュメントに記載されているすべてのサンプルコードを含む、完全に機能するサンプル クライアントは Zend Framework SVN リポジトリから入手できます。サンプルは /framework/standard/trunk/demos/Zend/Gdata/Blogger.php にあります。 サンプルには、このドキュメントで説明するすべての関数が含まれています。これはコマンドラインからのみ実行できます。

php Blogger.php -- --user=[email_address] --pass=[password]

このサンプルを実行する前、または Zend Framework を使用して独自のコードを開発する前に、include_path を設定して適切なクラスを読み込む必要があります。インクルード パスを設定するには、php.ini 設定または set_include_path メソッドを使用します。このコードは、コアの Zend_Gdata クラス、Zend_Gdata_Query クラス、認証クラス Zend_Gdata_ClientLogin へのアクセスをリクエストします。

require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_Query');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

マジック ゲッターとマジック セッターの使用

PHP クライアント ライブラリ全体で、デベロッパーの便宜上、マジック セッター/ゲッターのサポートが追加されています。これにより、従来のセッター/ゲッター メソッドを使用するか、プロパティにアクセスして、クラスのプロパティに安全にアクセスできます。たとえば、$gdataObject がこのライブラリ内のオブジェクトのインスタンスである場合、次の 2 行のコードの効果は同じです。

$gdataObject->setFoo("bar");
$gdataObject->foo = "bar";

同様に、次の 2 行のコードでも同じ効果があります。

$baz = $gdataObject->getFoo();
$baz = $gdataObject->foo;

同様に、マジック ファクトリ メソッドを使用すると、新しいオブジェクトの宣言が容易になります。Zend の命名規則で義務付けられている長いクラス名を覚えておく代わりに、Zend サービス クライアントで newObject(); を呼び出して新しい object を作成できます。たとえば、次の 2 つのスニペットは、どちらも新しい draft 拡張機能オブジェクトを宣言しています。drafts について詳しくは、投稿の作成セクションをご覧ください。

// Traditional instantiation
$gdClient = new Zend_Gdata();
$draft = new Zend_Gdata_App_Extension_Draft();

// Magic factory instantiation
$gdClient = new Zend_Gdata();
$draft = $gdClient->newDraft();

マジック セッター / ゲッター / ファクトリはオプションであるため、最適な方法を使用してください。

その他のリソース

Zend Framework の Google Data API コンポーネント(Zend_Gdata)に関するその他のリソース:

Blogger サービスの認証

Blogger Data API を使用すると、公開フィードと非公開フィードの両方にアクセスできます。 公開フィードは認証を必要としませんが、読み取り専用です。ブログを変更する場合は、非公開フィードをリクエストする前にクライアントが認証を受ける必要があります。認証には、OAuth 認証、AuthSub プロキシ認証、ClientLogin ユーザー名とパスワードによる認証のいずれかの方法を使用できます。

Google Data API での認証に関する一般的な情報については、認証のドキュメントをご覧ください。

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

OAuth 認証

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

AuthSub プロキシ認証

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

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

function getAuthSubUrl()
{
  $next = getCurrentUrl();
  $scope = 'http://www.google.com/blogger/feeds/';
  $secure = false;
  $session = true;
  return Zend_Gdata_AuthSub::getAuthSubTokenUri($next, $scope, $secure, $session);
}

$authSubUrl = getAuthSubUrl();
echo '<a href=\"$authSubUrl\">login to your Google account</a>';

getAuthSubTokenUri メソッドは、次のパラメータ(AuthSubRequest ハンドラで使用されるクエリ パラメータに対応)を受け取ります。

次へ
認証後に Google がユーザーをリダイレクトするページの URL。
スコープ
アプリケーションが Blogger フィードにアクセスするためのトークンをリクエストしていることを示します。使用するスコープ文字列は http://www.blogger.com/feeds/ です(もちろん URL エンコードされています)。
安全
クライアントがセキュア トークンをリクエストしているかどうかを示します。
セッション
返されたトークンを複数回使用(セッション)トークンと交換できるかどうかを示します。

上記の例は、セキュア トークンをリクエストしない呼び出しを示しています(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.php

ユーザーはリンクをクリックして Google のサイトにアクセスし、Google アカウントで認証を行います。

ユーザーが認証されると、AuthSub システムは AuthSubRequest URL の next クエリ パラメータで指定した URL にユーザーをリダイレクトします。AuthSub システムは、token クエリ パラメータの値として、その URL に認証トークンを追加します。次に例を示します。

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

トークン値は $_GET['token'] を使用して取得できます。

このトークン値は、1 回限りの AuthSub トークンを表します。この例では、$session = true が指定されているため、AuthSubSessionToken サービスを呼び出す Zend_Gdata_AuthSub::getAuthSubSessionToken メソッドを使用して、このトークンを AuthSub セッション トークンと交換できます。

if(! isset($_SESSION['sessionToken']) && isset($_GET['token'])) {
  $_SESSION['sessionToken'] =
      Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
}

このコード スニペットは、まず AuthSub セッション トークンがすでに存在するかどうかを確認します。そのように指定されておらず、1 回限りのトークンが URL で指定されている場合、コード スニペットは 1 回限りのトークンを getAuthSubSessionToken メソッドに渡し、AuthSub インターフェースはセッション トークンを返します。その後、このコードはセッション トークンの値をセッション変数 $_SESSION['sessionToken'] に格納します。

これにより、アプリケーションはセッション トークンの値を以降の Blogger の操作で使用できるようになります。Zend_Gdata_AuthSub::getHttpClient メソッドを使用して、AuthSub 認証情報を含めるために Authorization ヘッダーがプリセットされている Zend_Http_Client オブジェクトを取得できます。

$client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['sessionToken']);

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

クライアントがスタンドアロンのシングル ユーザーの「インストール」クライアント(デスクトップ アプリケーションなど)の場合は、ClientLogin 認証を使用します。

次のコードでは、Zend_Gdata_ClientLogin::getHttpClient メソッドを使用して ClientLogin サービスへのリクエストを実行し、認証トークンを取得して、適切な認証ヘッダーを含む Zend_Http_Client オブジェクトを作成します。次に、このメソッドによって返された HttpClient を使用して、Zend_Gdata サービス オブジェクトが作成されます。

$accountType が明示的に GOOGLE に設定されていることに注意してください。このパラメータを設定しないと、G Suite ユーザーは Blogger API を正常に使用できなくなります。

$user = 'user@example.com';
$pass = 'secretPasswd';
$service = 'blogger';

$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service, null,
        Zend_Gdata_ClientLogin::DEFAULT_SOURCE, null, null,
        Zend_Gdata_ClientLogin::CLIENTLOGIN_URI, 'GOOGLE');
$gdClient = new Zend_Gdata($client);

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

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

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

ブログのリストの取得

Blogger Data API には、特定のユーザーのブログを一覧表示するフィードがあります。このフィードは「メタフィード」と呼ばれます。

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

クエリ URL の作成は Zend_Gdata_Query クラスが行います。この場合は、追加の作業を行う必要はありませんが、Query クラスの有用性については、このドキュメントのクエリ パラメータによる投稿の取得のセクションをご覧ください。

function printAllBlogs()
{
  $query = new Zend_Gdata_Query('http://www.blogger.com/feeds/default/blogs');
  $feed = $gdClient->getFeed($query);
  printFeed($feed);
}

function printFeed($feed)
{
  $i = 0;
  foreach($feed->entries as $entry) {
    print $i ." ". $entry->title->text . "\n";
    $i++;
  }
}

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

次のコード スニペットは、フィードからブログ ID を抽出する方法を示しています。投稿とコメントに対して作成、更新、削除のオペレーションを実行するには、ブログ ID が必要です。$index 変数は、ユーザーのブログフィード内のどのブログが使用されているかを表します。id フィールドの形式は tag:blogger.com,1999:user-userID.blog-blogID であるため、「-」文字に split を指定すると、結果の配列の最後の要素にブログ ID が配置されます。

$idText = split('-', $feed->entries[$index]->id->text);
$blogID = $idText[2];

投稿の作成

Blogger Data API を使用すると、新しいブログエントリを作成、公開したり、エントリの下書きを作成したりすることができます。

: 現在のところ、投稿にカスタムの作成者を設定することはできません。新しい投稿はすべて、現在認証されているユーザーによって作成されたかのように表示されます。

ブログ投稿を公開する

新しいブログエントリを公開するには、PHP クライアント ライブラリを使用します。

まず、ブログ投稿を表すエントリ インスタンスを作成します。その後、ブログ投稿のタイトル、コンテンツ、その他の属性を設定できます。最後に、insertEntry メソッドを呼び出して投稿を挿入します。ここでは、マジック ファクトリのインスタンス化が新しい Zend_Gdata_EntryZend_Gdata_App_Extension_TitleZend_Gdata_App_Extension_Content オブジェクトで機能しています。

function createPublishedPost($title='Hello, world!', $content='I am blogging on the internet.')
{
  $uri = 'http://www.blogger.com/feeds/' . $blogID . '/posts/default';
  $entry = $gdClient->newEntry();
  $entry->title = $gdClient->newTitle($title);
  $entry->content = $gdClient->newContent($content);
  $entry->content->setType('text');

  $createdPost = $gdClient->insertEntry($entry, $uri);
  $idText = split('-', $createdPost->id->text);
  $newPostID = $idText[2];

  return $newPostID;
}

ブログ投稿の下書きを作成する

下書きの投稿は一般公開の投稿と同じ方法で作成されますが、エントリ オブジェクトの下書き属性を設定する必要があります。上記のようなブログ投稿を下書きとして作成するには、ハイライト表示された行を追加します。

function createDraftPost($title='Salutations, world!', $content='Hmm ... not quite right, must rework the title later.')
{
  $uri = 'http://www.blogger.com/feeds/' . $blogID . '/posts/default';
  $entry = $gdClient->newEntry();

  $entry->title = $gdClient->newTitle(trim($title));
  $entry->content = $gdClient->newContent($content);
  $entry->content->setType('text');

  $control = $gdClient->newControl();
  $draft = $gdClient->newDraft('yes');
  $control->setDraft($draft);
  $entry->control = $control;

  $createdPost = $gdClient->insertEntry($entry, $uri);
  $idText = split('-', $createdPost->id->text);
  return $idText[2];
}

投稿のタイトルやコンテンツを設定する場合とほぼ同じ方法で、新しい Zend_Gdata_App_Extension_Control オブジェクトと Zend_Gdata_App_Extension_Draft オブジェクトを作成して、エントリの control 属性に割り当てます。

既存のブログ投稿の下書きを公開済みの投稿にするには、投稿の下書きを取得し、Draft 属性を no に設定してから投稿を更新します。投稿の取得と更新については、次の 2 つのセクションで説明します。

投稿を取得する

以降のセクションでは、クエリ パラメータを使用する場合と使用しない場合で、ブログ投稿のリストを取得する方法について説明します。

認証なしで Blogger の公開フィードにクエリを実行できます。そのため、公開ブログから投稿を取得する前に、認証情報の設定や AuthSub 認証を行う必要はありません。

すべてのブログ投稿を取得しています

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

function printAllPosts($gdClient, $blogID)
{
  $query = new Zend_Gdata_Query('http://www.blogger.com/feeds/' . $blogID . '/posts/default');
  $feed = $gdClient->getFeed($query);
  printFeed($feed);
}

クエリ パラメータを使用して投稿を取得する

Blogger Data API では、特定の期間に公開または更新されたブログ投稿など、指定した条件に一致する一連のエントリをリクエストできます。そのためには、クエリ オブジェクトを作成して getFeed メソッドに渡します。

たとえば、日付範囲のクエリを送信するには、クエリ オブジェクトの published-min パラメータと published-max パラメータを設定します。次のコード スニペットは、指定した開始時間から終了時間の間に公開された各ブログ投稿のタイトルと内容を出力します。

function printPostsInDateRange($gdClient, $blogID, $startDate='2007-04-01', $endDate='2007-04-25')
{
  $query = new Zend_Gdata_Query('http://www.blogger.com/feeds/' . $blogID . '/posts/default');
  $query->setParam('published-min', $startDate);
  $query->setParam('published-max', $endDate);

  $feed = $gdClient->getFeed($query);
  printFeed($feed);
}

Zend_Gdata_Query クラスの便利なデバッグ メソッドに getQueryUrl() があります。これは、作成されたエンコードされた URL を表示します。

: 現在、published-min クエリ パラメータと published-max クエリ パラメータのマジック セッターはありません。ただし、setStartIndexsetMaxResults は使用できます。

Blogger Data API では、次のクエリ パラメータがサポートされています。

categories
カテゴリ(ラベル)を指定して、フィード結果をフィルタします。たとえば、http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie は、FritzLaurie の両方のラベルを持つエントリを返します。
max-results
返されるエントリの最大数。
publish-min、Published-max
エントリの公開日の境界。
start-index
ページングのために最初に取得する結果の 1 から始まるインデックス。

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

投稿を更新しています

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

public function updatePost($postID, $updatedTitle='Hello, World?',
                           $updatedContent='UPDATE: Still blogging',
                           $isDraft=False)
{
  $query = new Zend_Gdata_Query('http://www.blogger.com/feeds/' . $blogID . '/posts/default/' . $postID);
  $postToUpdate = $dClient->getEntry($query);
  $postToUpdate->title->text = $this->gdClient->newTitle($updatedTitle);
  $postToUpdate->content->text = $this->gdClient->newContent($updatedContent);

  if ($isDraft) {
    $draft = $gdClient->newDraft('yes');
  } else {
    $draft = $gdClient->newDraft('no');
  }

  $control = $gdClient->newControl();
  $control->setDraft($draft);
  $postToUpdate->control = $control;

  $updatedPost = $postToUpdate->save();
  return $updatedPost;
}

: 現在のところ、投稿に関連付けられている作成者データの変更はサポートされていません。

投稿を削除しています

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

public function deletePost($gdClient, $blogID, $postID)
{
  $uri = 'http://www.blogger.com/feeds/' . $blogID . '/posts/default/' . $postID;
  $gdClient->delete($uri);
}

コメント

Blogger Data API を使用すると、コメントの作成、取得、削除ができます。 コメントの更新はサポートされていません(ウェブ インターフェースでは利用できません)。

コメントの作成

コメントを投稿するには、エントリ オブジェクトを作成して、次のように挿入します。

function createComment($gdClient, $blogID, $postID, $commentText)
{
  $uri = 'http://www.blogger.com/feeds/' . $blogID . '/' . $postID . '/comments/default';

  $newComment = $gdClient->newEntry();
  $newComment->content = $gdClient->newContent($commentText);
  $newComment->content->setType('text');
  $createdComment = $gdClient->insertEntry($newComment, $uri);

  $editLink = split('/', $createdComment->getEditLink()->href);
  $newCommentID = $editLink[8];

  return $newCommentID; 
}

: 現在、コメントを投稿できるのは、認証されたユーザーが所有するブログのみです。

: 現在のところ、コメントにカスタムの作成者を設定することはできません。すべての新しいコメントは、現在認証されているユーザーによって作成されたかのように表示されます。

コメントの取得

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

public function printPostComments($gdClient, $blogID, $postID)
{
  $query = new Zend_Gdata_Query('http://www.blogger.com/feeds/' . $blogID . '/' . $postID . '/comments/default');
  $feed = $gdClient->getFeed($query);
  $printFeed($feed);
}

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

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

コメントの削除

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

public function deleteComment($gdClient, $blogID, $postID, $commentID)
{
  $uri = 'http://www.blogger.com/feeds/' . $blogID . '/' . $postID . '/comments/default/' . $commentID;
  $gdClient->delete($uri);
}

トップへ戻る