开发者指南:.NET

重要提示:我们将于 2024 年 9 月 30 日停止对 2.0 版 Google Data API 的支持。为确保可继续使用相关功能,请将依赖 v2.0 Google Data API 的应用更新到最新 API 版本。如需获取最新版本,请使用左侧导航栏中的链接。注意:虽然某些 GET 请求(例如商家信息帖子)作为 Feed 网址继续受到支持,但这些请求的行为方式略有不同。 如需了解详情,请参阅 Blogger 帮助文档。

Blogger 数据 API 允许客户端应用以 Google Data API Feed 的形式查看和更新 Blogger 内容。

您的客户端应用可以使用 Blogger Data API 创建新的博文、修改或删除现有博文,以及查询符合特定条件的博文。

除了提供有关 Blogger Data API 功能的一些背景信息以外,本文档还提供了使用 .NET 客户端库进行基本 Data API 交互的示例。如果您有兴趣详细了解该库使用的底层协议,请参阅本开发者指南的协议部分

目录

观众群

本文档面向想要编写可与 Blogger 互动的 .NET 客户端应用的编程人员。

本文假定您了解 Google 数据 API 协议背后的一般概念。

如需了解客户端库提供的类和方法的参考信息,请参阅 .NET 客户端库 API 参考文档。如需一般的 Blogger Data API 参考信息,请参阅 Protocol 参考指南

使用入门

如果在设置客户端库方面需要帮助,请参阅入门指南

如需使用 .NET 客户端库,您需要安装 .NET 1.1 运行时,并且还应及时更新所有补丁。下载客户端库后,您可以在分发版的 lib/Release 子目录中找到开始操作所需的 DLL。

创建 Blogger 账号

您可能需要注册 Blogger 帐号进行测试。Blogger 使用 Google 帐号,因此如果您已拥有 Google 帐号,那就万事俱备了。

运行示例代码

.NET 客户端库项目中提供了一个可正常工作的完整示例客户端,其中包含本文档中显示的所有示例代码。该示例位于 SVN 代码库的“来源”标签页的 /trunk/clients/cs/samples/blogger/ConsoleSample.cs 下。

在编译和运行此示例之前,请使用适当的值更新 usernamepasswordblogNamepostId 的值。usernamepassword 值代表用于登录 Blogger 的凭据。blogName 值是博客博客网址的开头。

示例客户端对提供的博客执行多项操作,以演示如何使用 Blogger Data API。

如需将本文档中的示例编译成您自己的代码,您需要以下 using 语句:

using Google.GData.Client;
using System.Net;
using System.Xml;
using System.Text.RegularExpressions;

在 Blogger 服务中进行身份验证

您可以使用 Blogger Data API 访问公开和私有 Feed。 公开 Feed 不需要任何身份验证,但会处于只读状态。如果您想要修改博客,则您的客户端需要在请求不公开 Feed 之前进行身份验证。它可以使用以下两种方法之一进行身份验证:AuthSub 代理身份验证或 ClientLogin 用户名/密码身份验证。

如需从整体上了解使用 Google 数据 API 进行身份验证的更多信息,请参阅身份验证文档

AuthSub 代理身份验证

需要向 Google 帐号验证其用户身份的 Web 应用会使用 AuthSub 代理身份验证。网站运营商和客户端代码无权访问 Blogger 用户的用户名和密码;相反,客户端会获取特殊的 AuthSub 令牌,以便客户端能够代表特定用户执行操作。如需了解详情,请参阅 AuthSub 文档

用户首次访问您的应用时尚未进行身份验证。在这种情况下,您需要显示一些信息和一个将用户引导至 Google 页面的链接,以验证您访问其博客的请求。

假设您的网页中定义了以下 ASP 超链接:

<asp:HyperLink ID="GotoAuthSubLink" runat="server"/>

然后,要为您的应用构建 AuthSubRequest 网址,请按如下方式进行 .NET 客户端库调用:

GotoAuthSubLink.Text = "Login to your Google Account";
GotoAuthSubLink.NavigateUrl =
  AuthSubUtil.getRequestUrl("http://www.example.com/RetrieveToken",
  "http://www.blogger.com/feeds/",
  false,
  true);

getRequestUrl 方法采用以下参数(对应于 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%2FRetrieveToken

用户通过该链接转到 Google 网站,并对其 Google 帐号进行身份验证。

用户进行身份验证后,AuthSub 系统会将他们重定向到您在 AuthSubRequest 网址的 next 查询参数中指定的网址。AuthSub 系统会在该网址上附加一个身份验证令牌,作为 token 查询参数的值。因此,该令牌可作为 ASP 页面的 Request.QueryString 对象中的变量进行访问。用户将重定向到如下所示的网址:

http://www.example.com/RetrieveToken?token=yourAuthToken

此令牌值代表一个单次使用的 AuthSub 令牌。在此示例中,因为指定了 session = true,所以此令牌可以交换为 AuthSub 会话令牌,如下所示:

SessionsessionToken = AuthSubUtil.exchangeForSessionToken(Request.QueryStringtoken, null);

也就是说,您需要将一次性令牌与 null(对于未注册模式)或私钥(对于注册模式)一起传递给 exchangeForSessionToken 方法,然后 AuthSub 接口会返回会话令牌。如需详细了解已注册的应用和私钥,请参阅 AuthSub 文档的对请求进行签名部分。

然后,您的应用就可以在与 Blogger 的后续交互中使用该会话令牌值了。如需告知 .NET 客户端库自动随每个请求发送 Authorization 标头(包含会话令牌),请执行以下操作:

GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("blogger", "BloggerSampleApp");
authFactory.Token = SessionsessionToken.ToString();
Service service = new Service(authFactory.ApplicationName);
service.RequestFactory = authFactory;

ClientLogin 用户名/密码身份验证

如果您的客户端是独立的单用户“已安装”客户端(如桌面应用),请使用 CMEK 身份验证。请按如下方式设置服务对象的凭据:

Service service = new Service("blogger", "exampleCo-exampleApp-1");
service.Credentials = new GDataCredentials("user@example.com", "secretPassword");
GDataGAuthRequestFactory factory = (GDataGAuthRequestFactory) service.RequestFactory;
factory.AccountType = "GOOGLE";

在上面的代码段中,我们将两个参数传递给 Service 构造函数。第一个参数是我们想要与之交互的服务的名称。第二个参数是应用的名称,格式为 companyName-applicationName-versionID。我们还将 Service.RequestFactory 设置为仅使用 GOOGLE 帐号类型,以便允许 G Suite 用户进行正确的身份验证。

如需详细了解 CMEK 身份验证(包括示例请求和响应),请参阅针对已安装应用的身份验证文档。

注意:给定会话中的所有请求应使用同一令牌;不要为每个 Blogger 请求获取一个新令牌。

注意:如 CMEK 文档中所述,身份验证请求可能会失败,并请求人机识别系统质询。如果您希望 Google 发出并处理人机识别系统验证,则请将用户转到 https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger(而不是 接 目标每次转化费用文档中指定的人机识别系统处理网址)。

检索博客列表

Blogger Data API 提供的 Feed 会列出特定用户的博客;该 Feed 称为“元 Feed”。

以下示例代码使用经过身份验证的 Service 对象检索元 Feed,然后输出每个博客的标题。

query.Uri = new Uri("http://www.blogger.com/feeds/default/blogs");
AtomFeed feed = null;
try
{
  feed = service.Query(query);
  foreach (AtomEntry entry in feed.Entries)
  {
    Console.WriteLine("Blog Title: " + entry.Title.Text);
  }
}

请注意 getFeed 方法使用的网址。这是默认的元 Feed 网址;它会返回当前经过身份验证的用户的博客列表。如需访问其他用户的 Feed,您可以在元 Feed 网址中用该用户的 ID 代替 default。用户的 ID 是用户个人资料网址末尾的一串数字。

创建帖子

借助 Blogger Data API,您可以创建和发布新的博客条目,以及创建条目草稿。

以下所有示例均假定您有一个经过身份验证的 Service 对象。

注意:目前不支持为帖子设置自定义作者。所有新帖子看起来就像是由当前经过身份验证的用户创建的。

发布博文

您可以使用 .NET 客户端库发布新的博客条目。

首先,创建一个 AtomEntry 对象来表示博文。然后,您可以设置博文的标题、内容和其他属性。 最后,使用 Service 对象插入博文。以下示例说明了如何发布新博文:

AtomEntry newPost = new AtomEntry();
newPost.Title.Text = "Marriage!";
newPost.Content = new AtomContent();
newPost.Content.Content = "<div xmlns='http://www.w3.org/1999/xhtml'>" +
  "<p>Mr. Darcy has <em>proposed marriage</em> to me!</p>" +
  "<p>He is the last man on earth I would ever desire to marry.</p>" +
  "<p>Whatever shall I do?</p>" +
  "</div>";
newPost.Content.Type = "xhtml";

Uri blogFeedUri = new Uri("http://www.blogger.com/feeds/" + blogId + "/posts/default");
AtomEntry createdEntry = service.Insert(blogFeedUri, newPost);

Insert 方法将服务的博文网址作为参数。然后,该方法会返回 Blogger 存储的条目。返回的条目就是您发送的条目,但其中还包含由 Blogger 添加的各种元素,例如博文 ID。

如果您的请求由于某种原因失败,Blogger 可能会返回其他状态代码。如需了解状态代码,请参阅 Google Data API 协议参考文档

创建博文草稿

草稿帖子的创建方式与公开帖子相同,但您需要设置 AtomEntry 对象的 draft 属性。上述博文可以作为草稿创建,只需添加下面突出显示的代码行即可:

AtomEntry newPost = new AtomEntry();
newPost.Title.Text = "Marriage!";
newPost.Content = new AtomContent();
newPost.Content.Content = "<div xmlns='http://www.w3.org/1999/xhtml'>" +
    "<p>Mr. Darcy has <em>proposed marriage</em> to me!</p>" +
    "<p>He is the last man on earth I would ever desire to marry.</p>" +
    "<p>Whatever shall I do?</p>" +
    "</div>";
newPost.Content.Type = "xhtml";
newPost.IsDraft = true;

Uri blogFeedUri = new Uri("http://www.blogger.com/feeds/" + blogId + "/posts/default");
AtomEntry createdEntry = service.Insert(blogFeedUri, newPost);

您可以通过检索草稿博文,将草稿属性设置为 false,然后更新这篇博文,将现有博文草稿转换为已发布的博文。我们将在接下来的两部分中介绍如何检索和更新帖子。

检索帖子

以下部分介绍了如何使用查询参数和不使用查询参数来检索博文列表。

您可以在不进行身份验证的情况下查询 Blogger 公开 Feed。因此,在从公开博客中检索博文之前,您无需设置凭据或执行 AuthSub 身份验证。

检索所有博文

如需检索用户的博文,请调用用于检索博客元 Feed 的同一 getFeed 方法,但这次发送博文 Feed 网址:

query.Uri = new Uri("http://www.blogger.com/feeds/" + blogId + "/posts/default");
feed = service.Query(query);
Console.WriteLine(feed.Title.Text);
foreach (AtomEntry entry in feed.Entries)
{
  Console.WriteLine("Entry Title: " + entry.Title.Text);
}

使用查询参数检索博文

通过 Blogger Data API,您可以请求一组符合指定条件的条目,例如请求在给定日期范围内发布或更新的博文。为此,请创建一个 FeedQuery 对象并将其传递给 Service.Query() 方法。

例如,如需发送日期范围查询,请设置 FeedQuery 对象的 MinPublicationMaxPublication 成员。以下代码段将输出在指定的开始时间和结束时间之间发布的每篇博文的标题:

FeedQuery query = new FeedQuery();
query.Uri = new Uri("http://www.blogger.com/feeds/" + blogId + "/posts/default");
query.MinPublication = new DateTime(2006, 1, 1);
query.MaxPublication = new DateTime(2007, 4, 12);
AtomFeed feed = service.Query(query);
foreach (AtomEntry entry in feed.Entries)
{
  Console.WriteLine("  Entry Title: " + entry.Title.Text);
}

请注意,FeedQuery 对象是使用检索帖子时所用的帖子 Feed 网址构造的。

Blogger 数据 API 支持以下查询参数:

alt
要返回的 Feed 类型,例如 atom(默认值)或 rss
/category
指定类别(也称为标签)以过滤 Feed 结果。例如,http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie 返回同时具有 FritzLaurie 标签的条目。
max-results
要返回的最大条目数。
orderby
返回条目的顺序,例如 lastmodified(默认)、starttimeupdated
Publish-min、publish-max
条目发布日期的限制。
start-index
要检索的第一个结果的索引(从 1 开始,用于分页)。
已更新-最小、已更新-最大
条目更新日期的边界。除非 orderby 参数设置为 updated,否则系统会忽略这些查询参数。

如需详细了解查询参数,请参阅 Blogger Data API 参考指南Google Data API 参考指南

正在更新帖子

如需更新现有博文,请先检索要更新的条目,然后对其进行修改,再使用该条目的 Update() 方法将其发送到 Blogger。以下代码段会修改某个博客条目的标题,并假定您已从服务器检索到该条目。

static AtomEntry EditEntry(AtomEntry toEdit)
{
  // Edit the entry by changing the Title and calling Update().
  if (toEdit != null)
  {
    toEdit.Title.Text = "Marriage Woes!";
    toEdit = toEdit.Update();
  }
  return toEdit;
}

上述代码会返回包含更新后的整个帖子的 AtomEntry。如需更新任何其他属性,只需在调用 Update() 之前在 AtomEntry 对象中设置这些属性即可。

注意:目前不支持修改与帖子关联的作者数据。

正在删除帖子

如需删除博文,请对现有 AtomEntry 对象调用 Delete 方法,如下所示:

static void DeleteEntry(AtomEntry toDelete)
{
  // Delete the edited entry
  if (toDelete != null)
  {
    toDelete.Delete();
  }
}

注释

Blogger Data API 可用于创建、检索和删除评论。 不支持更新评论(网页界面中也不支持更新评论)。

正在创建评论

若要发布评论,请创建一个 AtomEntry 对象,并按如下方式插入该对象:

AtomEntry comment;
comment = new AtomEntry();
comment.Title.Text = "This is my first comment";
comment.Content.Content = "This is my first comment";
Uri commentPostUri = new Uri("http://www.blogger.com/feeds/" + blogId + "/" + entryId + "/comments/default");
postedComment = service.Insert(commentPostUri, comment);

注意:目前,您只能向经过身份验证的用户拥有的博客发布评论。

注意:目前不支持为评论设置自定义作者。所有新评论将显示为由当前经过身份验证的用户创建。

检索评论

您可以通过博文的评论 Feed 网址检索特定博文的评论:

static void ListEntryComments(Service service, Uri commentUri)
{
  if (commentUri != null)
  {
    // Retrieve all comments on a blog entry
    FeedQuery query = new FeedQuery();
    query.Uri = commentUri;
    AtomFeed feed = service.Query(query);
    foreach (AtomEntry entry in feed.Entries)
    {
      Console.WriteLine("  Comment Title: " + entry.Title.Text);
    }
  }
}

或者,您可以使用博客的评论 Feed 网址获取所有博文的评论:

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

正在删除评论

如需删除评论,请对现有评论 AtomEntry 对象调用 Delete() 方法,如下所示:

static void DeleteComment(AtomEntry commentEntry)
{
  if (commentEntry != null)
  {
    // Delete the comment.
    commentEntry.Delete();
  }
}

返回页首