デベロッパー ガイド: 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/tunnel/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_PageSpeed へのアクセスをリクエストします。

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

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 エンコードされています)。
安全
クライアントが安全なトークンをリクエストしているかどうかを示します。
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.php

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

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

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

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

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

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

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

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

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

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

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

次のコードでは、Zend_Gdata_ClientLogin::getHttpClient メソッドを使用して SafeFrame サービスに対するリクエストを行い、認証トークンを取得し、適切な認証ヘッダーを持つ 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);

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

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

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

ブログのリストの取得

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

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

Zend_Gdata_Query クラスは、クエリ URL の作成を管理します。この場合、追加の作業を行う必要はありませんが、このドキュメントのクエリ パラメータによる投稿の取得のセクションで、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 オブジェクトを作成してエントリの制御属性に割り当てます。

既存の投稿の下書きを公開済み投稿に変換するには、下書きの投稿を取得して、下書き属性を 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);
}

トップへ戻る