Blogger Data API を使用すると、クライアント アプリケーションは Google Data API フィード形式で Blogger コンテンツを表示および更新できます。
クライアント アプリケーションは Blogger Data API を使用して、新しいブログ投稿の作成、既存のブログ投稿の編集または削除、特定の条件に一致するブログ投稿のクエリを実行できます。
このドキュメントでは、Blogger Data API の機能に関する背景情報に加えて、Zend Google Data APIs クライアント ライブラリを使用した Data API の基本的な操作例も説明します。ライブラリが使用する基盤となるプロトコルについて詳しくは、このデベロッパー ガイドのプロトコル セクションをご覧ください。
目次
オーディエンス
このドキュメントは、Blogger とやり取りできる PHP クライアント アプリケーションを作成するプログラマを対象としています。
このドキュメントは、Google Data APIs プロトコルの基本的な考え方を理解していることを前提としています。
クライアント ライブラリで提供されるクラスとメソッドに関するリファレンス情報については、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 クライアント ライブラリ全体で、デベロッパーの利便性向上のため、マジック セッター/ゲッターのサポートが追加されました。これにより、従来の setter/getter メソッドを使用するか、プロパティにアクセスすることで、クラスのプロパティに安全にアクセスできます。たとえば、$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 APIs コンポーネント(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 ハンドラで使用されるクエリ パラメータに対応する次のパラメータを受け取ります。
- 次へ
- 認証後にユーザーをリダイレクトするページの 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
が指定されているため、このトークンは 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
メソッドに渡し、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 チャレンジの発行と処理を任せる場合は、ユーザーを https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger
にリダイレクトします(ClientLogin のドキュメントに記載されている CAPTCHA 処理 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_Entry
、Zend_Gdata_App_Extension_Title
、Zend_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
クエリ パラメータのマジック セッターはありません。ただし、setStartIndex
と setMaxResults
は使用できます。
Blogger Data API は、次のクエリ パラメータをサポートしています。
- categories
- フィード結果をフィルタするカテゴリ(ラベル)を指定します。たとえば、
http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie
は、ラベルFritz
とLaurie
の両方を含むエントリを返します。 - max-results
- 返されるエントリの最大数。
- published-min、published-max
- エントリの公開日の範囲。
- start-index
- 取得される最初の結果のインデックス(1 から始まる)(ページング用)。
クエリ パラメータの詳細については、Blogger Data API リファレンス ガイドと Google Data APIs リファレンス ガイドをご覧ください。
投稿の更新
既存のブログ投稿を更新するには、まず更新するエントリを取得し、変更してから、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); }