開發人員指南: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 Framework SVN 存放區中找到完整的本文件範例,其中包含本文件中列出的所有程式碼範例。範例位於 /framework/standard/中繼/demos/Zend/Gdata/Blogger.php。範例包含本文件所述的所有函式。只能透過指令列執行:

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

執行此範例或使用 Zend 架構開發您自己的程式碼之前,您可能需要設定 include_path 並載入適當的類別。您可以使用 php.ini 設定或使用 set_include_path 方法來設定 include 路徑。這個程式碼會要求存取核心 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');

使用魔法 getter 和 setter

在整個 PHP 用戶端程式庫中,我們已為開發人員提供對魔術 setter/getter 的支援。這可讓系統使用傳統的 setter/getter 方法或存取屬性,安全地存取類別的屬性。舉例來說,如果 $gdataObject 是這個資料庫中物件的執行個體,則以下兩行程式碼具有相同的效果:

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

同樣地,這兩行程式碼也具有相同的效果:

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

同樣地,魔術工廠方法還能更輕鬆地宣告新物件。您不必記住 Zend 命名慣例強制執行的完整類別名稱,只要呼叫 Zend 服務用戶端上的 newObject();,即可建立新的 object。舉例來說,以下兩個程式碼片段都宣告了新的 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();

魔術 setter/getter 和工廠是選擇性的,因此請選用最適合您的方法。

其他資源

Zend Framework's Google Data API 元件 (Zend_Gdata) 的其他資源:

驗證 Blogger 服務

使用 Blogger Data API 就能存取公開和私人的動態消息。 公開動態饋給不需要驗證,但處於唯讀狀態。如要修改網誌,則用戶端必須先進行驗證,才能要求私人動態饋給。可以透過三種方式進行驗證:OAuth 驗證、AuthSub Proxy 驗證或 ClientLogin 使用者名稱/密碼驗證。

如要進一步瞭解如何使用 Google Data API 進行驗證,請參閱驗證說明文件

本文件後續後續章節中的大部分範例假設您都有一個名為 $gdClient 的已驗證用戶端物件。

OAuth 驗證

如需使用 Zend PHP GData 程式庫提供的 OAuth 驗證說明文件,請參閱 Google Data Protocol 用戶端程式庫中的 OAuth

AuthSub Proxy 驗證

需要驗證使用者提供給 Google 帳戶的網頁應用程式會使用 AuthSub Proxy 驗證。網站運算子和用戶端代碼無法存取 Blogger 使用者的使用者名稱和密碼;用戶端則會取得特殊的 AuthSub 權杖,允許用戶端代表特定使用者採取行動。詳情請參閱 AuthSub 說明文件

使用者第一次造訪您的應用程式時,尚未通過驗證。在這種情況下,您必須顯示某些資訊,以及透過連結將使用者帶往 Google 頁面的連結,以便我們驗證您的網誌存取要求。Zend 用戶端程式庫提供了一個函式,可用於產生 Google 頁面的網址。下列程式碼會擷取 AuthSubRequest 頁面的網址:

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 會在驗證完成後將使用者重新導向至的網頁網址。
範圍
表示應用程式要求存取權杖,以便存取 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.php

使用者點選 Google 網站的連結並驗證自己的 Google 帳戶。

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

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

您可以使用 $_GET['token'] 擷取權杖值。

這個權杖值代表一次性的 AuthSub 權杖。在這個範例中,由於指定 $session = true,所以您可以使用 Zend_Gdata_AuthSub::getAuthSubSessionToken 方法交換這個權杖,以便呼叫 AuthSubSessionToken 服務:

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

程式碼片段會先檢查 AuthSub 工作階段符記是否已存在。如果不能,但網址中指定了單次使用權杖,則程式碼片段會將一次性使用權杖傳送至 getAuthSubSessionToken 方法,且 AuthSub 介面會傳回工作階段符記。接著,程式碼會將工作階段符記值放入工作階段變數 $_SESSION['sessionToken']

之後,您的應用程式即可在後續與 Blogger 的互動中使用工作階段符記值。您可以使用 Zend_Gdata_AuthSub::getHttpClient 方法取得包含 Authorization 標頭預設設定的 Zend_Http_Client 物件,以便納入 AuthSub 憑證:

$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) 處理網址)。

擷取網誌清單

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

下列程式碼範例使用已驗證的 $gdClient 物件來擷取中繼動態饋給,然後列印每個網誌的標題。

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 方法使用的網址。這是預設的中繼動態饋給網址,會傳回目前已驗證使用者的網誌清單。如要存取其他使用者的動態饋給,請在中繼動態饋給網址中以使用者的 ID 取代 default。使用者的 ID 是使用者個人資料網址結尾的數字字串。

下列程式碼片段示範如何從動態饋給中擷取網誌 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_ControlZend_Gdata_App_Extension_Draft 物件,然後指派給物件的控制屬性。

您可以將現有的草稿網誌文章轉換成已發布的文章,方法是擷取草稿文章,將草稿屬性設為 no,然後更新文章。我們將在接下來兩節中介紹如何擷取及更新貼文。

擷取貼文

下列各節說明如何擷取包含及不含查詢參數的網誌文章清單。

您不必驗證就能查詢 Blogger 公開動態饋給。因此,在從公開網誌擷取貼文之前,您不需要設定憑證或進行 AuthSub 驗證。

擷取所有網誌文章

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

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-minpublished-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(),用來顯示已建構的編碼網址。

注意published-minpublished-max 查詢參數目前沒有魔術 setter。不過,您可以使用 setStartIndexsetMaxResults

Blogger Data API 支援下列查詢參數:

categories
指定類別 (也就是標籤) 可篩選動態饋給結果。例如,http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie 會傳回同時包含 FritzLaurie 標籤的項目。
最大結果
要傳回的項目數量上限。
發布-分鐘,發布上限
項目發布日期的邊界。
起始索引
要擷取的第一個結果以 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;
}

注意:目前無法修改與貼文相關的作者資料。

刪除貼文

如要刪除貼文,請將貼文的編輯網址傳遞至 $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; 
}

注意:目前你只能將留言張貼到由已驗證使用者擁有的網誌。

注意:目前不支援為留言設定自訂作者。所有新留言都會顯示為目前已驗證使用者所建立的留言。

擷取註解

您可以從文章的留言動態消息網址擷取特定貼文的留言:

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

或者,你可以使用網誌的留言動態饋給網址,接收所有貼文的留言:

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

刪除留言

如要刪除註解,請將註解的編輯網址傳遞至 $gdClient 物件的 delete 方法,如下所示:

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

返回頁首