开发者指南:.NET

重要提示: 我们将于 2024 年 9 月 30 日停止支持 2.0 版 Google Data API。 为了确保正常运行,请更新依赖于 2.0 版 Google Data API 更新到最新的 API 版本。 如需使用最新版本,请使用左侧导航栏中的链接。 注意:虽然我们仍会继续支持某些 GET 请求(如列出帖子) 那么它们的行为存在细微的差异。 如需了解详情,请参阅 Blogger 帮助文档。

通过 Blogger 数据 API,客户端应用程序可以查看和更新 Blogger 以 Google Data API Feed 的形式导出内容。

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

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

目录

受众群体

本文档面向希望编写 .NET 客户端程序的程序员 可与 Blogger 互动的应用

本文假定您了解 Google 数据 API 协议

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

使用入门

如需有关设置客户端库的帮助,请参阅使用 入门指南

要使用 .NET 客户端库,您需要 .NET 1.1 运行时 也应为所有补丁上的最新版本下载客户端库后,您会在发行版的 lib/Release 子目录中找到开始使用所需的 DLL。

创建 Blogger 账号

您可能需要注册 Blogger 账号。Blogger 使用 Google 账号,因此, 已经拥有 Google 账号,那就大功告成了。

运行示例代码

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

在编译和运行此示例之前,请更新 usernamepasswordblogName和 将 postId 替换为适当的值。usernamepassword 值表示用于登录 Blogger。blogName 值是博客的 blogspot 网址的开头部分。

该示例客户端会对提供的博客执行多项操作, 演示 Blogger 数据 API 的用法。

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

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

在 Blogger 服务中进行身份验证

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

如需详细了解如何使用 Google Data API 进行身份验证,请参阅身份验证文档

AuthSub 代理身份验证

需要对用户进行 Google 账号身份验证的 Web 应用会使用 AuthSub 代理身份验证。网站运营者和客户 代码无法访问 Blogger 用户的用户名和密码; 而是会获取允许客户端执行操作的特殊 AuthSub 令牌 访问该 API。如需了解详情,请参阅 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/(当然,是经过网址编码的)。
安全
表示客户端是否正在请求安全令牌。
会话
指示返回的令牌是否可以交换为可多次使用的(会话)令牌。

上面的示例展示了一个未请求安全令牌的调用(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 用户名/密码身份验证

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

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 用户进行正确的身份验证。

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

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

注意:正如 ClientLogin 中所述 身份验证请求可能会失败,并请求进行人机识别系统验证, 挑战。如果您希望 Google 发出并处理人机识别系统验证,请将用户发送到 https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger(而不是 ClientLogin 文档中提供的人机识别系统验证处理网址)。

检索博客列表

Blogger 数据 API 提供了一个供稿,用于列出某个特定 user;该 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 方法使用的网址。这是默认的 MetaFeed 网址;它会返回当前已通过身份验证的用户的博客列表。如需访问其他用户的 Feed,您可以在元 Feed 网址中将用户的 ID 替换为 default。用户的 ID 是用户个人资料网址末尾的一串数字。

创建帖子

使用 Blogger 数据 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 方法将服务的 post 网址作为参数。 然后,该方法会返回 Blogger 存储的条目。条目 与您发送的相同,但其中还包含了添加的各种元素 例如博文 ID。

如果您的请求因某种原因而失败,Blogger 可能会返回其他状态代码。有关状态代码的信息,请参阅 Google 数据 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 数据 API 可让您请求一组与指定 条件,例如请求在指定日期发布或更新的博文 范围。为此,您需要创建一个 FeedQuery 对象,并将其传递给 Service.Query() 方法。

例如,如需发送日期范围查询,请将 MinPublicationFeedQuery 对象的 MaxPublication 成员。 以下代码段将输出在 指定的开始时间和结束时间:

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 Data 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 开始,用于分页)。
updated-min、update-max
条目更新日期的边界。除非将 orderby 参数设置为 updated,否则系统会忽略这些查询参数。

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

更新帖子

要更新现有的博文,首先您要检索要 然后对其进行修改,然后使用条目的 Update() 方法结合使用。以下代码段修改了 假设您已从 服务器。

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,其中包含整个 一篇博文。要更新任何其他属性,只需在 AtomEntry 对象,然后再调用 Update()

注意:修改与以下内容相关的作者数据: 目前不支持帖子。

正在删除帖子

要删除帖子,请在现有帖子上调用 Delete 方法 AtomEntry 对象,如下所示:

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

正在删除评论

如需删除评论,请对现有评论调用 Delete() 方法 像下面这样评论 AtomEntry 对象:

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

返回页首