Blogger Data API 可让客户端应用以 Google Data API Feed 的形式查看和更新 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 框架运行此示例或开发您自己的代码之前,您可能需要设置 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 客户端库中添加了对 magic setter/getter 的支持。借助这些 API,可以使用传统的 setter/getter 方法或通过访问属性来安全地访问类的属性。例如,如果 $gdataObject
是此库中某个对象的实例,则以下两行代码具有相同的效果:
$gdataObject->setFoo("bar"); $gdataObject->foo = "bar";
同样,以下两行代码也具有相同的效果:
$baz = $gdataObject->getFoo(); $baz = $gdataObject->foo;
同样,魔术工厂方法可以更轻松地声明新对象。您可以通过对 Zend 服务客户端调用 newObject();
来创建新的 object
,而无需记住 Zend 命名惯例要求的长类名称。例如,以下两个代码段均声明了新的 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 的 Google 数据 API 组件 (Zend_Gdata) 的其他资源:
在 Blogger 服务中进行身份验证
您可以使用 Blogger 数据 API 访问公开和私有 Feed。公开 Feed 不需要任何身份验证,但会处于只读状态。如果您想修改博客,您的客户端需要先进行身份验证,然后才能请求不公开 Feed。它可以使用以下三种方法中的任意一种进行身份验证:OAuth 身份验证、AuthSub 代理身份验证或 ClientLogin 用户名/密码身份验证。
如需全面详细地了解使用 Google Data API 进行身份验证的信息,请参阅身份验证文档。
本文档后续部分中的大多数示例都假定您有一个名为 $gdClient
且经过身份验证的客户端对象。
OAuth 身份验证
有关使用 Zend PHP GData 库进行 OAuth 身份验证的文档,请参阅 Google Data Protocol 客户端库中的 OAuth。
AuthSub 代理身份验证
需要向 Google 帐号验证用户身份的 Web 应用会使用 AuthSub 代理身份验证。网站运营商和客户端代码无权访问 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 Feed。使用的范围字符串是
http://www.blogger.com/feeds/
(当然,是经过网址编码的)。 - 安全
- 指示客户端是否请求安全令牌。
- session
- 指示返回的令牌是否可以交换为可多次使用的(会话)令牌。
上面的示例展示了一个未请求安全令牌(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 系统会将用户重定向到您在 AuthSub 请求网址的 next
查询参数中指定的网址。AuthSub 系统会在该网址上附加一个身份验证令牌,作为 token
查询参数的值。例如:
http://www.example.com/welcome.php?token=yourAuthToken
您可以使用 $_GET['token']
检索令牌值。
此令牌值代表一个单次使用的 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 会话令牌是否已存在。如果不是,您在网址中指定了一次性令牌,代码段会将该一次性令牌传递给 getAuthSubSessionToken
方法,而 AuthSub 接口会返回会话令牌。然后,代码会将会话令牌值放在会话变量 $_SESSION['sessionToken']
中。
然后,您的应用就可以在与 Blogger 的后续互动中使用会话令牌值了。您可以使用 Zend_Gdata_AuthSub::getHttpClient
方法获取预设 Authorization
标头以包含 AuthSub 凭据的 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 文档中所述,身份验证请求可能会失败并请求进行人机识别系统质询。如果您希望 Google 发出并处理人机识别系统质询,请将用户发送到 https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger
(而不是 ClientLogin 文档中提供的人机识别系统处理网址)。
检索博客列表
Blogger 数据 API 提供了一个列出特定用户的博客的 Feed;该 Feed 称为“元 Feed”。
以下示例代码使用经过身份验证的 $gdClient
对象检索元 Feed,然后输出每个博客的标题。
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
方法使用的网址。这是默认的元 Feed 网址;它会返回当前已验证用户的博客列表。如需访问其他用户的 Feed,您可以在元 Feed 网址中用用户的 ID 来代替 default
。用户的 ID 是用户个人资料网址末尾的数字字符串。
以下代码段演示了如何从 Feed 中提取博客 ID。您需要博客 ID 才能对博文和评论执行创建、更新和删除操作。$index
变量表示正在使用用户的博客 Feed 中的哪个博客。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
对象,并将它们分配给相应条目的控件属性。
您可以检索现有的博文草稿,将 draft 属性设置为 no
,然后更新该博文,从而将其转换为已发布的博文。在接下来的两个部分中,我们将介绍如何检索和更新帖子。
检索帖子
以下部分介绍了如何检索博文列表(无论是否使用查询参数)。
您可以在不进行身份验证的情况下查询 Blogger 公开 Feed。因此,您无需设置凭据或执行 AuthSub 身份验证,即可检索公开博客中的博文。
检索所有博客帖子
如需检索用户的博文,请调用用于检索博客元 Feed 的相同 getFeed
方法,但这次要发送博文 Feed 网址:
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); }
getQueryUrl()
是适用于 Zend_Gdata_Query
类的实用调试方法,它会向您显示已构建的编码网址。
注意:published-min
和 published-max
查询参数目前没有魔法 setter。不过,您可以使用 setStartIndex
和 setMaxResults
。
Blogger 数据 API 支持以下查询参数:
- categories
- 指定用于过滤 Feed 结果的类别(也称为标签)。例如,
http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie
会返回同时带有Fritz
和Laurie
标签的条目。 - max-results
- 要返回的最大条目数。
- “publish-min”“publish-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; }
注意:目前不支持修改与帖子关联的作者数据。
正在删除帖子
如需删除某个博文,请将该博文的修改网址传递给 $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; }
注意:目前,您只能在经过身份验证的用户所拥有的博客上发表评论。
注意:目前不支持为评论设置自定义作者。所有新评论都会显示为由当前经过身份验证的用户创建的。
正在检索评论
您可以从特定帖子的评论 Feed 网址检索该帖子的评论:
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); }