开发者指南:Python

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

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

除了提供有关 Blogger 功能的一些背景信息之外, Google Data API 中,本文档提供了使用 Python 客户端 库。如果您有兴趣详细了解该库使用的底层协议,请参阅本开发者指南的“协议”部分

目录

受众群体

本文档面向想要编写 Python 客户端程序的程序员 可与 Blogger 互动的应用

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

有关 Blogger Data API 的一般参考信息,请参阅协议参考指南

使用入门

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

Python 客户端库需要 Python 2.2 或更高版本。下载之后 客户端库,还需要下载并安装 ElementTree 软件包。

创建 Blogger 账号

您可能需要注册一个 Blogger 账号以进行测试。Blogger 使用 Google 账号,因此如果您已经拥有 Google 账号,则无需再做任何准备。

运行示例代码

BloggerExample.py 文件的 gdata-python-client/samples/blogger/ 目录下提供了一个完整的有效示例客户端,其中包含本文档中显示的所有示例代码。

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

您可以使用以下参数运行该示例:

python BloggerExample.py --email [email_address] --password [password]

要在您自己的代码中使用本文档中的示例, 以下 import 语句:

from gdata import service
import gdata
import atom

向 Blogger 服务进行身份验证

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

有关一般使用 Google 数据 API 进行身份验证的详细信息, 请参阅身份验证 文档

本文档后续部分中的大部分示例假定您 一个经过身份验证的 GDataService 实例。

OAuth 身份验证

有关使用 Python GData 库进行 OAuth 身份验证的文档, 请参阅 Google Data Protocol 客户端库

AuthSub 代理身份验证

AuthSub 代理身份验证适用于需要 对用户进行身份验证网站运营商和客户端代码无权访问 Blogger 用户的用户名和密码;而是,客户端会获取特殊的 AuthSub 令牌,以便客户端代表特定用户执行操作。如需了解详情,请参阅 AuthSub 文档

用户首次访问您的应用时,尚未进行身份验证。在本示例中,您需要显示一些信息和链接 将用户定向到一个 Google 网页,以验证您对访问 自己的博客。Python 客户端库提供了一个函数来生成 Google 网页的网址。以下代码会检索 AuthSubRequest 的网址。 页面:

def GetAuthSubUrl():
  next = 'http://www.example.com/welcome.pyc'
  scope = 'http://www.blogger.com/feeds/'
  secure = False
  session = True
  blogger_service = service.GDataService()
  return blogger_service.GenerateAuthSubURL(next, scope, secure, session);

authSubUrl = GetAuthSubUrl();
print '<a href="%s">Login to your Google account</a>' % authSubUrl

GenerateAuthSubURL 方法采用以下参数(对应于 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%2Fwelcome.pyc

用户点击指向 Google 网站的链接,然后对其 Google 账号进行身份验证。

用户完成身份验证后,AuthSub 系统会将其重定向到您在 AuthSubRequest 网址的 next 查询参数中指定的网址。AuthSub 系统会将身份验证令牌附加到该网址,作为 token 查询参数的值。例如:

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

您可以通过多种方式从网址检索令牌值,例如:

import cgi

parameters = cgi.FieldStorage()
authsub_token = parameters['token']

此令牌值代表一个单次使用的 AuthSub 令牌。在此示例中,由于指定了 session = True,因此可以使用 UpgradeToSessionToken 方法(该方法会调用 AuthSubSessionToken 服务)将此令牌换取 AuthSub 会话令牌:

blogger_service = service.GDataService()
blogger_service.auth_token = authsub_token
blogger_service.UpgradeToSessionToken()

也就是说,您将一次性令牌传递给 UpgradeToSessionToken 方法,AuthSub 接口会返回一个会话令牌。

然后,您的应用可以在与 Blogger 的后续互动中使用会话令牌值。客户端库会自动发送令牌 以及请求

ClientLogin 用户名/密码身份验证

如果您的客户端是独立的单用户“已安装”客户端(例如桌面应用),请使用 ClientLogin 身份验证。只需在 GDataService 实例上调用 ProgrammaticLogin() 方法,之后与 Blogger 的所有后续互动都将经过身份验证:

blogger_service = service.GDataService('user@example.com', 'secretPassword')
blogger_service.source = 'exampleCo-exampleApp-1.0'
blogger_service.service = 'blogger'
blogger_service.account_type = 'GOOGLE'
blogger_service.server = 'www.blogger.com'
blogger_service.ProgrammaticLogin()

在上面的代码段中,我们在 GDataService 实例上设置了三个属性。第一个是应用的名称,格式为 companyName-applicationName-versionID。第二个是我们要与之交互的服务的名称;第三个是服务器的地址。

请注意,account_type 已明确设置为 GOOGLE。如果未设置此参数,G Suite 用户将无法成功使用 Blogger API。

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

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

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

检索博客列表

Blogger 数据 API 提供了一个供稿,用于列出某个特定 user;该 Feed 就称为“元 Feed”。

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

def PrintUserBlogTitles(blogger_service):
  query = service.Query()
  query.feed = '/feeds/default/blogs'
  feed = blogger_service.Get(query.ToUri())

  print feed.title.text
  for entry in feed.entry:
    print "\t" + entry.title.text

请记下 Get 方法使用的网址。这是默认设置 元供稿网址;它会返回当前已验证用户的博客列表。 如需访问其他用户的 Feed,您可以在元 Feed 网址中将用户的 ID 替换为 default。用户的 ID 是用户个人资料网址末尾的一串数字。

以下代码段演示了如何从 Feed。您需要有博客 ID 才能执行创建、更新和删除操作 对帖子和评论执行的操作。以下代码段选择第一个博客 用户所检索的内容

blog_id = feed.entry[0].GetSelfLink().href.split("/")[-1]

BloggerExample.py 示例中,创建了 BloggerExample 类,并在构造函数中设置了博客 ID,以便日后轻松访问。对于本文档中的大部分示例, blog_id 作为变量传入。

创建帖子

使用 Blogger 数据 API,您可以创建和发布新的博客条目, 以及创建评注草稿

注意:目前不支持为帖子设置自定义作者。所有新帖子都会显示为由以下用户创建: 当前经过身份验证的用户。

发布博文

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

首先,创建一个 GDataEntry 实例来表示这篇博文。 然后,您可以设置博文的标题、内容和其他属性。 最后,使用 GDataService 实例插入博文。以下示例展示了如何发布新的博文:

def CreatePublicPost(blogger_service, blog_id, title, content):
  entry = gdata.GDataEntry()
  entry.title = atom.Title('xhtml', title)
  entry.content = atom.Content(content_type='html', text=content)
  return blogger_service.Post(entry, '/feeds/%s/posts/default' % blog_id)

blogEntry = CreatePublicPost(blogger_service, blog_id,
    title='I have the answer', content='Eureka! It is 42!')

创建博文草稿

草稿帖子的创建方式与公开帖子相同,但您需要在 GDataEntry 实例中设置 draft 扩展元素。您可以通过添加突出显示的行,将上述博文作为草稿创建:

def CreateDraftPost(blogger_service, blog_id, title, content):
  entry = gdata.GDataEntry()
  entry.title = atom.Title('xhtml', title)
  entry.content = atom.Content(content_type='html', text=content)

  control = atom.Control()
  control.draft = atom.Draft(text='yes')
  entry.control = control

  return blogger_service.Post(entry, '/feeds/%s/posts/default' % blog_id)

draftEntry = CreateDraftPost(blogger_service, blog_id,
    title='I have the question',
    content='What do you get if you multiply six by nine?')

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

检索帖子

以下部分介绍了如何使用 而没有查询参数。

您无需进行身份验证即可查询 Blogger 公开 Feed。因此,您 不需要设置凭据或执行 AuthSub 身份验证, 来自公开博客的 个帖子。

检索所有博客帖子

要检索用户的帖子,请使用GetFeed 博文 Feed 网址:

def PrintAllPosts(blogger_service, blog_id):
  feed = blogger_service.GetFeed('/feeds/' + blog_id + '/posts/default')

  print feed.title.text
  for entry in feed.entry:
    print "\t" + entry.title.text
    print "\t" + entry.content.text
    print "\t" + entry.updated.text
  print

使用查询参数检索帖子

借助 Blogger Data API,您可以请求一组符合指定条件的条目,例如请求在指定日期范围内发布或更新的博文。为此,您需要创建一个 Query 实例,然后调用 Get() 方法。

例如,如需发送日期范围查询,请将 published_minQuery 实例的 published_min 属性。 以下代码段显示每篇博文的标题和内容 在指定的开始时间和结束时间之间发布的以下事件:

def PrintPostsInDateRange(blogger_service, blog_id, start_time='2007-04-01', end_time='2007-04-25'):
  query = service.Query()
  query.feed = '/feeds/' + blog_id + '/posts/default'
  query.published_min = start_time
  query.published_max = end_time
  feed = blogger_service.Get(query.ToUri())

  print feed.title.text + " posts between " + start_time + " and " + end_time
  for entry in feed.entry:
    print "\t" + entry.title.text
    print "\t" + entry.content.text
    print "\t" + entry.updated.text
  print

请注意,Query 对象是使用用于检索帖子的帖子 Feed 网址构建的。

Blogger Data API 支持以下 Query 属性:

categories
指定用于过滤 Feed 结果的类别(也称为标签)。例如,http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/Laurie 会返回同时带有标签 FritzLaurie 的条目。如需在 Python 客户端库中指定该类别查询,您可以使用 query.categories = ['Fritz','Laurie',]
max_results
要返回的条目数上限。
published_min、publish_max
条目发布日期的边界。
start_index
要检索的第一个结果的索引(从 1 开始,用于分页)。
updated_min、updated_max
条目更新日期的边界。除非将 orderby 参数设置为 updated,否则系统会忽略这些查询参数。

有关查询参数的更多信息,请参阅 Blogger 数据 API 参考 指南Google Data API 参考指南

更新帖子

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

def UpdatePostTitle(blogger_service, entry_to_update, new_title='The REAL answer'):
  entry_to_update.title = atom.Title('xhtml', new_title)
  return blogger_service.Put(entry_to_update, entry_to_update.GetEditLink().href)

上述代码会返回一个包含新更新的整个帖子的 GDataEntry。如需更新任何其他属性,只需在调用 Put 之前在 GDataEntry 实例中设置它们即可。

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

正在删除帖子

如需删除帖子,请将帖子的修改网址传递给 GDataService 对象的 Delete 方法,如下所示:

def DeletePost(blogger_service, edit_link_href):
  blogger_service.Delete(edit_link_href)

评论

您可以使用 Blogger Data API 创建、检索和删除评论。 不支持更新评论(此功能也不适用于网页版) 界面)。

创建评论

如需发布评论,请创建一个 GDataEntry 对象并按如下所示插入该对象:

def CreateComment(blogger_service, blog_id, post_id, comment_text='Mostly harmless'):
  feed_uri = '/feeds/' + blog_id + '/' + post_id + '/comments/default'

  entry = gdata.GDataEntry()
  entry.content = atom.Content(content_type='xhtml', text=comment_text)
  return blogger_service.Post(entry, feed_uri)

注意:目前,您只能对以下内容发表评论: 。

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

正在检索评论

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

def PrintAllComments(blogger_service, blog_id, post_id):
  feed_url = '/feeds/' + blog_id + '/' + post_id + '/comments/default'
  feed = blogger_service.Get(feed_url)

  print feed.title.text
  for entry in feed.entry:
    print "\t" + entry.title.text
    print "\t" + entry.updated.text
  print 

您也可以使用博客的评论供稿网址获取所有帖子的评论:

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

删除评论

如需删除评论,请将评论的修改网址传递给 GDataService 对象的 Delete 方法,如下所示:

def DeleteComment(blogger_service, post_id, comment_id):
  feed_url = '/feeds/' + post_id + '/comments/default/' + comment_id
  blogger_service.Delete(feed_url)

返回页首