开发者指南:Python

通过 YouTube Data API,客户端应用可以以 Google Data API Feed 的形式检索和更新 YouTube 内容。 您的客户端应用可以使用 YouTube Data API Feed 来提取、搜索和更新视频、评论、回复、播放列表、用户个人资料和用户个人资料,以及查询符合特定条件的视频。

除了提供一些关于 YouTube Data API 功能的背景信息,本文档还提供了使用 Python 客户端库与该 API 进行交互的示例。要使用 Python 客户端库,您需要安装 Python 2.0+ 以及元素树、httplib 和 urllib 模块。如需了解详情,请参阅依赖项模块

如果您在设置 Python 客户端库方面需要帮助,请参阅入门指南。如果您有兴趣详细了解 Python 客户端库与 YouTube 互动时使用的底层协议,请参阅开发者指南协议页面

关于本文档

观众

本文面向的是特定编程人员,他们希望编写可使用 Python 客户端库与 YouTube 进行交互的客户端应用。它提供了一系列基本数据 API 交互的示例。

如需了解 YouTube Data API 参考信息,请参阅参考指南

本文档假定您了解 Google Data API 协议的一般概念,并且知道如何使用 Python 进行编程。

有关 Python 类和方法的参考信息,请参阅源代码中包含的 pyDocs(适用于服务类数据类)。

文档结构

本文档包含以下几个部分:

  • 身份验证部分介绍了两种不同的身份验证方法,可用于将 API 操作与特定用户帐号相关联。本部分还概述了 YouTube Data API 与其他 Google Data API 的身份验证之间的区别。在本文档中,特定 API 函数的说明将明确指出该函数是否需要用户身份验证。一般而言,所有修改视频或 Feed 数据的请求都需要通过身份验证。公开视频的只读请求不需要进行身份验证。

  • 了解视频 Feed 和条目部分提供了示例 API 响应,并说明了如何从视频列表或一组搜索结果中提取单个视频的相关信息。本部分还介绍了如何访问有关特定视频条目的元数据。最后,本部分介绍了更新单个视频条目的机制。

  • 检索和搜索视频部分介绍了如何提取特定的视频列表,例如 YouTube 最热门的视频的标准 Feed。其他视频列表包括特定用户上传的视频以及与特定视频相关的视频列表。此部分还介绍了如何使用该 API 让用户可以根据特定搜索字词或类别在 YouTube 的视频库中进行搜索。

  • 上传视频部分简要说明了允许用户通过您的应用将视频上传到 YouTube 的两种方法。此外,此部分还介绍了如何上传视频作为对其他视频的回复。

  • 更新和删除视频部分介绍了如何使用 API 更新 YouTube 视频的相关信息。同时还说明了如何使用 API 移除视频。

  • 使用社区功能部分介绍了可让您的用户与 YouTube 视频进行互动的 API 功能。这些函数说明了对现有视频发布评分、评论或投诉的请求。您也可以使用此 API 检索视频评论列表。

  • 保存和收集视频部分介绍了如何使用该 API 访问、创建和更新收藏的视频、视频播放列表和 YouTube 频道订阅。还介绍了如何通过添加和移除视频来修改视频播放列表和收藏。

  • 启用用户互动部分介绍了如何使用 API 检索和更新用户个人资料。本部分还介绍了如何检索、添加、更新和删除用户联系人。

使用入门

要求

您的客户端应用可以使用 YouTube Data API Feed 来搜索、检索和更新视频、评论、回复、播放列表、订阅、用户个人资料等。

除了提供一些关于 YouTube Data API 功能的背景信息,本文档还提供了使用 Python 客户端库与该 API 进行交互的示例。要使用 Python 客户端库,您需要安装 Python 2.2+ 以及元素树、httplib 和 urllib 模块。如需了解详情,请参阅依赖项模块

如需详细了解如何配置您的环境,请参阅入门指南。如果您有兴趣详细了解 Python 客户端库与 YouTube 互动时使用的底层协议,请参阅开发者指南协议页面

您可以将以下代码段示例复制/粘贴到代码中,并根据需要进行修改。

您必须先初始化 gdata.youtube.service.YouTubeService 对象,然后才能使用 YouTube Data API 执行任何操作,如下所示。下面列出的 import 语句将自动从 gdata.mediagdata.geo 模块执行进一步导入。请注意,除了检索公开内容之外,其他所有操作都需要通过身份验证

import gdata.youtube
import gdata.youtube.service

yt_service = gdata.youtube.service.YouTubeService()

# Turn on HTTPS/SSL access.
# Note: SSL is not available at this time for uploads.
yt_service.ssl = True

本指南中的大部分方法示例都是对 gdata.youtube.service.YouTubeService 的实例执行操作。对来自交互式 Python 解释器的未经身份验证的请求进行测试可能会很有帮助。

注意:必须在路径中正确添加 Python 客户端库。请确保通过运行提供的 setup.py 脚本进行安装。有关详情,请参阅入门指南

身份验证

Python 客户端库可用于公共 Feed 或私有 Feed。公开 Feed 是只读的,不需要进行任何身份验证。专用 Feed 要求您向 YouTube 服务器验证身份。

身份验证可以通过 SafeFrame 身份验证(适用于桌面应用)或 AuthSub 身份验证(适用于网络应用)执行。

设置开发者密钥和客户端 ID

开发者密钥用于标识正在提交 API 请求的 YouTube 开发者。客户端 ID 用于标识您的应用程序,以便进行登录和调试。

使用 Python 客户端库发出 API 请求时,X-GData-Key 请求标头用于指定开发者密钥,X-GData-Client 标头用于指定客户端 ID。无论使用何种身份验证方案,都可以在 YouTubeService 对象上设置开发者密钥和客户端 ID:

yt_service.developer_key = 'ABCxyz123...'
yt_service.client_id = 'My-Client_id'

您需要注册 YouTube 开发者密钥。

适用于 Web 应用的 AuthSub 身份验证

需要向 YouTube/Google 帐号验证其用户身份的 Web 应用会使用 AuthSub 代理身份验证。运营商不需要访问 YouTube 用户的用户名和密码,只需要特殊的 AuthSub 令牌。

用户首次访问您的应用时,尚未通过 Google 服务的身份验证。在这种情况下,您需要提供链接,引导用户前往 Google 授权您的应用访问他们的 YouTube 帐号。Python 客户端库提供了一个用于生成此网址的函数。下面的代码会设置指向 AuthSubRequest 页面的链接。

def GetAuthSubUrl():
  next = 'http://www.example.com/video_upload.pyc'
  scope = 'http://gdata.youtube.com'
  secure = False
  session = True

yt_service = gdata.youtube.service.YouTubeService()
return yt_service.GenerateAuthSubURL(next, scope, secure, session)

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

请注意发送到服务对象的 GenerateAuthSubURL 方法的参数:

  • next - YouTube 在用户授权您的应用访问他们的帐号后,应将他们重定向到的网页的网址。
  • scope,表示应用将仅访问 YouTube API Feed。
  • secure - 表示返回的令牌不是安全令牌。
  • session - 表示此令牌可替换为多用途(会话)令牌。

返回的网址将如下所示:

https://www.google.com/accounts/AuthSubRequest?scope=http%3A%2F%2Fgdata.youtube.com&session=1&secure=0&next=http%3A%2F%2Fwww.example.com%2Fvideo_upload.pyc

然后,用户可以点击链接登录自己的 YouTube 帐号。用户授权您的应用访问其帐号后,系统会将其重定向回 next 网址。该网址会附加一个一次性令牌值作为查询参数。网址如下所示:

http://www.example.com/video_upload.pyc?token=Abc123...

下一部分将介绍如何升级此令牌。以下代码段演示了从网址中检索此令牌的方法之一:

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

升级到会话令牌

为安全起见,此令牌是一次性令牌,因此您现在需要用此一次性令牌交换会话令牌。AuthSub 文档中介绍了此过程。以下代码段展示了如何升级令牌。

yt_service = gdata.youtube.service.YouTubeService()
yt_service.SetAuthSubToken(authsub_token)
yt_service.UpgradeToSessionToken()

此令牌值表示一次性 AuthSub 令牌。由于在上面指定了 session = True,因此可以使用 UpgradeToSessionToken 方法(用于调用 AuthSubSessionToken 服务)将此令牌交换为 AuthSub 会话令牌。

您的 YouTubeService 对象现已全面通过身份验证,可以使用 YouTube API 执行进一步的请求。除非您明确提出撤消请求的请求,或者用户决定通过访问其 YouTube 帐号中的已获授权的网站页面来撤消其访问权限,否则 AuthSub 会话令牌不会过期。

针对已安装应用的 EGL 身份验证

已安装身份验证的应用会使用 EGL 身份验证,这类应用可存储或查询用户的用户名和密码。如需使用此形式的身份验证,请调用从 gdata.service.GDataService 类继承的 YouTubeServiceProgrammaticLogin 方法,并指定客户端代表其发送请求身份验证的用户的 ID 和密码。

yt_service = gdata.youtube.service.YouTubeService()
yt_service.email = 'jo@gmail.com'
yt_service.password = 'mypassword'
yt_service.source = 'my-example-application'
yt_service.ProgrammaticLogin()

凭据设置完成后,可以使用 YouTubeService 对象处理所有后续请求。为了能够向 YouTube API 执行上传操作以及任何类型的“写入”请求(添加评论等),请务必在执行身份验证时将开发者密钥和客户端 ID 传递给 yt_service 对象:

# A complete client login request
yt_service.email = 'jo@gmail.com'
yt_service.password = 'mypassword'
yt_service.source = 'my-example-application'
yt_service.developer_key = 'ABC123...'
yt_service.client_id = 'my-example-application'
yt_service.ProgrammaticLogin()

设置 developer_keyclient_id 属性时,YouTubeService 对象会自动设置正确的 X-GData-KeyX-GData-Client 标头。

注意:请参阅 Google 数据 API 身份验证文档,详细了解 AuthSub 和 Paging 机制。

了解视频供稿和条目

YouTube 数据 API 提供了几个代表视频列表的视频 Feed,例如标准 Feed、上传内容、订阅和收藏的视频。参考指南中记录了每个 Feed 的网址。

显示视频 Feed

YouTube API 中的许多 Feed 都包含视频条目。这些 Feed 可以很容易地建模为 gdata.youtube.YouTubeVideoFeed 对象,每个对象包含多个 gdata.youtube.YouTubeVideoEntry 对象。每个视频条目对应 YouTube 上的一个视频,包含视频的相关信息。

检索视频列表的基本结构是构造一个视频 Feed 的网址,然后逐一处理这些条目,类似于以下代码:

def GetAndPrintVideoFeed(uri):
  yt_service = gdata.youtube.service.YouTubeService()
  feed = yt_service.GetYouTubeVideoFeed(uri)
  for entry in feed.entry:
    PrintEntryDetails(entry) # full documentation for this function

检索和搜索视频部分详细介绍了许多常见的 Feed 网址以及如何检索各种视频 Feed。

检索特定视频条目

如果您知道特定视频条目的视频 ID,则可以只检索该条目的信息。系统会根据视频 ID 输入条目网址:

http://gdata.youtube.com/feeds/api/videos/videoID

以下代码会检索与 YouTube 上的视频对应的 gdata.youtube.YouTubeVideoEntry

entry = yt_service.GetYouTubeVideoEntry(video_id='the0KZLEacs')

视频条目内容

您可以从 gdata.youtube.YouTubeVideoEntry 对象中检索到多种元数据,例如缩略图、播放器网址和视频时长。以下代码演示了如何获取其中一些信息。Python 客户端库通过将 XML 元素映射到类来抽象化大多数功能。有关 YouTubeVideoEntry 条目的大多数重要信息都可通过该条目中的 media 属性(包含 gdata.media.Group 对象)(表示 XML media:group 元素)获得。以下示例说明了如何检索视频元数据:

def PrintEntryDetails(entry):
  print 'Video title: %s' % entry.media.title.text
  print 'Video published on: %s ' % entry.published.text
  print 'Video description: %s' % entry.media.description.text
  print 'Video category: %s' % entry.media.category[[]0].text
  print 'Video tags: %s' % entry.media.keywords.text
  print 'Video watch page: %s' % entry.media.player.url
  print 'Video flash player URL: %s' % entry.GetSwfUrl()
  print 'Video duration: %s' % entry.media.duration.seconds

  # non entry.media attributes
  print 'Video geo location: %s' % entry.geo.location()
  print 'Video view count: %s' % entry.statistics.view_count
  print 'Video rating: %s' % entry.rating.average

  # show alternate formats
  for alternate_format in entry.media.content:
    if 'isDefault' not in alternate_format.extension_attributes:
      print 'Alternate format: %s | url: %s ' % (alternate_format.type,
                                                 alternate_format.url)

  # show thumbnails
  for thumbnail in entry.media.thumbnail:
    print 'Thumbnail url: %s' % thumbnail.url

注意:如需详细了解如何生成在网页中嵌入视频的必需信息,请参阅协议指南

检索和搜索视频

检索标准 Feed

YouTube 数据 API 提供了 YouTube 最受欢迎的视频的标准 Feed。该 API 之前支持过其他已弃用的标准 Feed。有关详情,请参阅开发者指南

YouTube 上最热门视频的 Feed 的网址采用以下格式:

http://gdata.youtube.com/feeds/api/standardfeeds/most_popular

注意:您还可以指定以下格式:http://gdata.youtube.com/feeds/api/standardfeeds/localeID/feedID,以检索特定语言区域的标准 Feed。例如,日本最受欢迎的视频是:http://gdata.youtube.com/feeds/api/standardfeeds/JP/most_popular。如需查看假定的语言区域 ID 的完整列表,请参阅参考指南

def PrintVideoFeed(feed):
  for entry in feed.entry:
    PrintEntryDetails(entry)

def GetAndPrintFeedByUrl:
  yt_service = gdata.youtube.service.YouTubeService()

  # You can retrieve a YouTubeVideoFeed by passing in the URI
  uri = 'http://gdata.youtube.com/feeds/api/standardfeeds/JP/most_popular'
  PrintVideoFeed(yt_service.GetYouTubeVideoFeed(uri))

检索特定用户上传的视频

每个 YouTube 用户都有一个关联的视频 Feed,该 Feed 对应于自己在 http://gdata.youtube.com/feeds/api/users/username/uploads 上传的视频。以下代码演示了如何获取和显示用户上传的 Feed:

def GetAndPrintUserUploads(username):
  yt_service = gdata.youtube.service.YouTubeService()
  uri = 'http://gdata.youtube.com/feeds/api/users/%s/uploads' % username
  PrintVideoFeed(yt_service.GetYouTubeVideoFeed(uri))

注意:您还可以使用字符串“default”来代替 username,以检索当前经过身份验证的用户的视频。

如需检索相关视频,请将 gdata.youtube.YouTubeVideoEntry 对象的 ID 传递给 gdata.youtube.service.YouTubeService 对象的 GetYouTubeRelatedVideoFeed 方法。这将检索包含相关条目的 YouTubeVideoFeed 对象。

related_feed = yt_service.GetYouTubeRelatedVideoFeed(video_id='abc123')

搜索视频

YouTube Data API 可让您请求一组符合指定条件的条目,例如,请求由特定作者发布的视频条目、按视频格式或包含特定关键字。为此,您可以使用特定搜索条件创建 gdata.service.YouTubeVideoQuery 对象,并将其传递给 gdata.youtube.service.YouTubeServiceYouTubeQuery 方法。

以下示例展示了如何执行搜索查询,结果按照观看次数排序,其中也包含受限视频(在 API 中称为“Racy”):

def SearchAndPrint(search_terms):
  yt_service = gdata.youtube.service.YouTubeService()
  query = gdata.youtube.service.YouTubeVideoQuery()
  query.vq = search_terms
  query.orderby = 'viewCount'
  query.racy = 'include'
  feed = yt_service.YouTubeQuery(query)
  PrintVideoFeed(feed)

gdata.service.Query 类及其子类(如 YouTubeVideoQuery)负责构建 Feed 网址。上面所示的 VideoQuery 构造了一个等效于以下网址的网址:

http://gdata.youtube.com/feeds/api/videos?vq=<searchTerms>&racy=include&orderby=viewCount

以下是设置搜索参数时一些最常见的 YouTubeVideoQuery 属性:

author
设置条目的作者。Author 是 YouTube 用户名的同义词。
format
指定视频格式。接受数值参数,用于指定移动视频播放的 RTSP 流式传输网址中的一种或向可嵌入的 Flash 播放器指定 HTTP 网址。
racy
指示是否应在结果中包含受限内容。仅接受两个参数:“包含”或“排除”。
max_results
设置一次返回的条目数上限。
start_index
设置要检索的第一个结果的索引(从 1 开始,用于分页)。
orderby
设置条目的排列顺序,例如按 relevanceviewCountpublishedrating 排列。
time
设置时间段,将标准 Feed 结果限制为:todaythis_weekthis_monthall_time
vq
设置搜索查询字词。搜索所有视频元数据(例如标题、标签和说明)中指定的字符串。

注意:如需详细了解查询参数,请参阅 YouTube Data API 参考指南Google Data API 参考指南

使用类别和关键字进行搜索

您可以限制搜索结果,以仅显示与一组指定类别和关键字匹配的视频。参考指南介绍了如何指定预定义的 YouTube 类别(例如音乐、人物和博客等)和用户定义的关键字(标签)。

以下代码演示了如何通过将搜索字词更改为小写来使用关键字(标签)进行搜索。注意:由于某些字词(如“喜剧”)可能既是 YouTube 类别又是关键字,因此按照惯例,类别查询和关键字查询使用大写字词(“喜剧”)表示 YouTube 类别,而小写字词(“喜剧”)表示关键字。

def SearchAndPrintVideosByKeywords(list_of_search_terms):
  yt_service = gdata.youtube.service.YouTubeService()
  query = gdata.youtube.service.YouTubeVideoQuery()
  query.orderby = 'viewCount'
  query.racy = 'include'
  for search_term in list_of_search_terms:
    new_term = search_term.lower()
    query.categories.append('/%s' % new_term)
  feed = yt_service.YouTubeQuery(query)
  PrintVideoFeed(feed)

按开发者标记搜索

开发者标签是隐藏的关键字,可供开发者标记由最终用户通过其应用上传的内容。在上传期间,系统会将开发者标记与标头中设置的开发者密钥进行匹配。这些关键字不会向公众显示,并且可能会用于检索视频。要按特定开发者标记搜索视频,请使用您的开发者密钥发送常规 YouTube Data API 搜索请求。请务必指定类别架构和与视频必须匹配的开发者标签。您可以从以下网址检索与开发者标签匹配的视频 Feed(在本例中为 your_tag_here):

developer_tag_uri = 'http://gdata.youtube.com/feeds/videos/-/%7Bhttp%3A%2F%2Fgdata.youtube.com%2Fschemas%2F2007%2Fdevelopertags.cat%7Dyour_tag_here'
yt_service = gdata.youtube.service.YouTubeService()
PrintVideoFeed(yt_service.GetYouTubeVideoFeed(developer_tag_uri))

上传视频

请务必查看协议指南中的图表,大致了解上传流程。可以通过以下两种方法之一上传视频:

  • 通过直接上传方法直接从您的服务器上传视频
  • 或者先发送元数据,然后让用户通过基于浏览器的上传方法将视频直接上传到 YouTube

直接上传

要上传视频,您必须先构造一个新的 gdata.youtube.YouTubeVideoEntry 对象,向其传递一个包含所需元数据的 gdata.media.Group 对象。以下示例展示了将 Quicktime 视频“mytestmovies.mov”上传到具有以下属性的 YouTube 的过程:

属性价值
名称我的测试影片
类别自动
关键字汽车,有趣
说明我的说明
文件名mytestmovies.mov
文件 MIME 类型video/quicktime
视频是否设为私享?false
视频位置37,-122(纬度、经度)
开发者代码mydevelopertag、otherdevelopertag

以下代码会创建空白的 YouTubeVideoEntry 供上传。YouTubeServiceInsertVideoEntry 方法需要以下参数:

请注意,这些示例假定 yt_service 变量是经过全面身份验证的 YouTubeService 对象。

# prepare a media group object to hold our video's meta-data
my_media_group = gdata.media.Group(
  title=gdata.media.Title(text='My Test Movie'),
  description=gdata.media.Description(description_type='plain',
                                      text='My description'),
  keywords=gdata.media.Keywords(text='cars, funny'),
  category=[[]gdata.media.Category(
      text='Autos',
      scheme='http://gdata.youtube.com/schemas/2007/categories.cat',
      label='Autos')],
  player=None
)


# prepare a geo.where object to hold the geographical location
# of where the video was recorded
where = gdata.geo.Where()
where.set_location((37.0,-122.0))

# create the gdata.youtube.YouTubeVideoEntry to be uploaded
video_entry = gdata.youtube.YouTubeVideoEntry(media=my_media_group,
                                              geo=where)

# set the path for the video file binary
video_file_location = '/path/to/my/file.mov'

new_entry = yt_service.InsertVideoEntry(video_entry, video_file_location)

如果我们希望为视频添加可选开发者代码(详见按开发者代码搜索),则可以在使用 InsertVideoEntry 之前调用 AddDeveloperTags 方法:

developer_tags = [[]'some_tag_01', 'another_tag']
video_entry.AddDeveloperTags(developer_tags)

注意:要将视频作为私享视频上传,您必须将私有属性传递给 gdata.media.Group

my_media_group = gdata.media.Group(
  title=gdata.media.Title(text='My Test Movie'),
  description=gdata.media.Description(description_type='plain',
                                      text='My description'),
  keywords=gdata.media.Keywords(text='cars, funny'),
  category=[[]gdata.media.Category(
      text='Autos',
      scheme='http://gdata.youtube.com/schemas/2007/categories.cat',
      label='Autos')],
  player=None,
  private=gdata.media.Private()
)

video_entry = gdata.youtube.YouTubeVideoEntry(media=my_media_group)

# assuming that video_file_location points to a valid path
new_entry = yt_service.InsertVideoEntry(video_entry, video_file_location)

基于浏览器上传

基于浏览器的上传与直接上传的方式几乎相同,只不过在发送视频元数据时,所用请求中并没有上传文件二进制文件。您只需创建一个仅包含元数据的 YouTubeVideoEntry 即可。该视频条目随后会发布至 YouTube API 服务器上的特殊链接。XML 响应包含一个 token 和一个 url,它们之后可用于使用标准 HTML 表单上传二进制文件。

# create media group as usual
my_media_group = gdata.media.Group(
  title=gdata.media.Title(text='My Test Movie'),
  description=gdata.media.Description(description_type='plain',
                                      text='My description'),
  keywords=gdata.media.Keywords(text='cars, funny'),
  category=[[]gdata.media.Category(
      text='Autos',
      scheme='http://gdata.youtube.com/schemas/2007/categories.cat',
      label='Autos')],
  player=None
)

# create video entry as usual
video_entry = gdata.youtube.YouTubeVideoEntry(media=my_media_group)

# upload meta data only
response = yt_service.GetFormUploadToken(video_entry)

# parse response tuple and use the variables to build a form (see next code snippet)
post_url = response[[]0]
youtube_token = response[[]1]

以上代码会输出一个链接和一个令牌,用于构建要在用户浏览器中显示的 HTML 表单。下面显示一个简单的示例表单,其中 youtube_token 表示返回的令牌元素的内容,如上面的 YouTubeVideoEntry 中检索到的一样。为了让用户在提交表单后能够重定向至您的网站,请务必向 post_url 附加一个 next 参数(如下所示),其作用与 AuthSub 链接的 next 参数相同。唯一的区别在于,此处返回的是 statusid 变量,而不是网址参数,而不是一次性令牌。

next = 'http://example.com/post_video_upload.pyc'

form = """<form action="%s?nexturl=%s" method="post" enctype="multipart/form-data">
          <input name="file" type="file"/>
          <input name="token" type="hidden" value="%s"/>
          <input value="Upload Video File" type="submit" />
          </form>""" % (post_url, next, youtube_token)

上传成功的响应将如下所示:

http://example.com/post_video_upload.pyc?status=200&id=ABC123

status 参数会返回上传交易的 HTTP 交易状态。id 参数会返回分配给上传的视频的 YouTube 视频 ID。

检查上传状态

视频上传后,会立即显示在通过身份验证的用户上传的视频 Feed 中。但是,在处理完之前,它不会在网站上公开。视频遭到拒绝或上传失败,也只会包含在已通过身份验证的用户的上传 Feed 中。以下代码会检查 YouTubeVideoEntry 的状态,以查看其是否尚未发布或是否已被拒绝。

upload_status = yt_service.CheckUploadStatus(new_entry)

if upload_status is not None:
  video_upload_state = upload_status[[]0]
  detailed_message = upload_status[[]1]

更新视频和删除视频

更新视频信息

如需更新视频元数据,只需更新 YouTubeVideoEntry 对象,然后使用 YouTubeService 对象的 UpdateVideoEntry 方法即可。此方法将 YouTubeVideoEntry 作为参数,后者包含更新后的元数据。

# assuming we have a video entry that was just posted in our 'new_entry' variable
new_entry.media.title.text = 'My Updated Video Title'
new_entry.media.description.text = 'Just updated'

updated_entry = yt_service.UpdateVideoEntry(new_entry)

删除视频

删除视频非常简单,只需调用 YouTubeService 对象的 DeleteVideoEntry 即可。

response = yt_service.DeleteVideoEntry(entry_to_be_deleted)

if response:
  print 'Video successfully deleted!'

使用社区功能

添加评分

要对视频评分,请使用 YouTubeService 对象的 AddRating 方法。请注意,您不能给自己的视频分级,并且分级必须介于 1 到 5 之间(包括 1 和 5)。

video_id_to_rate = 'Ncakifd_16k'
video_entry = yt_service.GetYouTubeVideoEntry(video_id=video_id_to_rate)
response = yt_service.AddRating(3, video_entry)

评论数

检索视频的评论

如果有一个 YouTubeVideoEntry 对象或一个简单的视频 ID,您可以使用 YouTubeService 对象的 GetYouTubeVideoCommentFeed 方法检索并输出包含视频评论的 Feed。生成的 Feed 是一个由 gdata.youtube.YouTubeCommentEntry 对象组成的 gdata.youtube.YouTubeCommentFeed。Feed 可以像其他任何 Feed 一样进行解析:

video_id = 'ABC123...'
comment_feed = yt_service.GetYouTubeVideoCommentFeed(video_id=video_id)

for comment_entry in comment_feed.entry:
  print comment_entry.ToString()

添加评论

如需添加新注释,请使用 YouTubeService 对象的 AddComment 方法。该方法需要对要评论的完整 YouTubeVideoEntry 对象以及表示评论的字符串:

my_comment = 'what a boring test video'
video_id = '9g6buYJTt_g'
video_entry = yt_service.GetYouTubeVideoEntry(video_id=video_id)
yt_service.AddComment(comment_text=my_comment, video_entry=video_entry)

视频回复

YouTube 视频回复是作为回复与第二个视频相关联的视频。如此通告所述,视频回复功能已被弃用。虽然现有的视频回复仍然可用,但 YouTube 不再支持检索视频的视频回复列表、上传新的视频回复或删除视频回复,不过您可以删除视频回复中使用的视频。因此,API 也不再支持这些函数。

现在,针对视频响应操作的 API 请求会返回以下内容:

  • 检索视频的视频回复的请求会返回空列表。
  • 添加视频回复的请求会返回 403 HTTP 响应代码。
  • 删除视频回复的请求会返回 403 HTTP 响应代码。

举报视频

如需对视频提出投诉,您可以使用 YouTubeService 对象中的 AddComplaint 方法。投诉字词必须是有效的类别。有关详情,请参阅协议指南中的添加投诉部分。

video_id_to_flag = 'Ncakifd_16k'
complaint_term = 'VIOLENCE'
complaint_text = ('Please ignore this complaint. '
                  'I\'m testing a YouTube API and needed to issue '
                  'a complaint to test the add complaint function. ')

response = yt_service.AddComplaint(complaint_text, complaint_term, video_id_to_flag)

保存和收集视频

收藏的视频

检索用户收藏的视频

YouTube 用户可以选择将他们收藏的视频标记为收藏。用户喜爱的 Feed 的大致位置是以下网址。

http://gdata.youtube.com/feeds/api/users/username/favorites

要检索用户最喜欢的视频,请使用 YouTubeService 对象的 GetUserFavoritesFeed 方法。该方法将可选字符串作为 参数,代表要检索其最爱信息流的用户的 YouTube 用户名。

favorite_feed = yt_service.GetUserFavoritesFeed(username='gdpython')

返回的 Feed 是一个常规的视频 Feed,其中包含 YouTubeVideoEntry 对象。

注意:或者,您可以传入字符串 default 以检索当前通过身份验证的用户的收藏。如果未提供用户名,则此行为是 GetUserFavoritesFeed 方法的默认行为。

添加常用联系人

如需添加收藏的视频,请使用 YouTubeService 对象的 AddVideoEntryToFavorites 方法。这些参数是要添加的 YouTubeVideoEntry,也可以是要添加其用户名的用户名(默认为当前经过身份验证的用户)。

video_id = 'Ncakifd_16k'
video_entry = yt_service.GetYouTubeVideoEntry(video_id=video_id)
response = yt_service.AddVideoEntryToFavorites(video_entry)

# The response, if successfully posted is a YouTubeVideoEntry
if isinstance(response, gdata.youtube.YouTubeVideoEntry):
  print 'Video successfully added to favorites'

删除收藏项

如需删除收藏夹,只需使用 YouTubeService 对象的 DeleteVideoEntryFromFavorites 方法即可。

video_id = 'Ncakifd_16k'
response = yt_service.DeleteVideoEntryFromFavorites(video_id)
if response is True:
  print 'Video deleted from favorites'

播放列表

每位 YouTube 用户都有一个播放列表 Feed,其中包含该用户创建的所有播放列表。然后,每个播放列表都包含其上所有视频的 Feed。

检索用户播放列表

要手动提取用户所有播放列表的列表,您应使用以下网址:

http://gdata.youtube.com/feeds/api/users/username/playlists

借助 Python 客户端库,您可以使用 YouTubeService 对象的 GetYouTubePlaylistFeed 方法:

playlist_feed = yt_service.GetYouTubePlaylistFeed(username='gdpython')

# instead of passing in a username, you can also pass the URI to the playlist feed:
playlist_feed = yt_service.GetYouTubePlaylistFeed(uri='http://gdata.youtube.com/feeds/api/users/default/playlists')

注意:您还可以传递字符串 'default' 来引用当前经过身份验证的用户,而不是传递特定的用户名(如以上示例中的“gdpython”)。

gdata.youtube.YouTubePlaylistFeed 表示 gdata.youtube.YouTubePlaylistEntry 对象的 Feed。这指的是用户可以拥有的个别播放列表。特定播放列表的视频条目以 gdata.youtube.YouTubePlaylistVideoEntry 对象的形式表示。这些对象与常规 gdata.youtube.YouTubeVideoEntry 对象非常相似,但有一些例外。自定义标题和说明可以应用于视频,位置字段用于指示视频在播放列表中的位置。

检索播放列表信息

如果有一个 YouTubePlaylistEntry(表示特定播放列表),您可以获取包含 YouTubePlaylistVideoEntry 对象的 YouTubePlaylistVideoFeed。如上所述,这些对象代表播放列表中的单个视频(具有可选的自定义标题和说明)。将播放列表的 URI 传递给 YouTubeService 对象的 GetYouTubePlaylistVideoFeed 方法即可获取此 Feed:

# a typical playlist URI
playlist_uri = 'http://gdata.youtube.com/feeds/api/playlists/BCB3BB96DF51B505'

playlist_video_feed = yt_service.GetYouTubePlaylistVideoFeed(uri=playlist_uri)

# iterate through the feed as you would with any other
for playlist_video_entry in playlist_video_feed.entry:
  print playlist_video_entry.title.text

添加播放列表

如需添加新的播放列表,只需使用 YouTubeService 对象的 AddPlaylist 方法即可。此方法采用以下参数:playlist_title、playlist_description(两个字符串)和可选布尔值(如果要将播放列表标记为私享,可将其设置为 True)。

new_public_playlistentry = yt_service.AddPlaylist('my new playlist', 'a new playlist')

if isinstance(new_public_playlistentry, gdata.youtube.YouTubePlaylistEntry):
  print 'New playlist added'

# adding a private playlist
new_private_playlistentry = yt_service.AddPlaylist('new private playlist', 'a new private playlist', True)

if isinstance(new_private_playlistentry, gdata.youtube.YouTubePlaylistEntry):
  print 'New private playlist added'

更新播放列表

如需更新播放列表,请使用 YouTubeService 对象的 UpdatePlaylist 方法。该方法采用以下参数:要更新的播放列表的 ID、新的标题、新的说明、将播放列表标记为私享的可选布尔值和可选字符串,指示拥有播放列表的用户名。该字符串将默认为当前通过身份验证的用户。

# here we are updating a public playlist with a new title while also making it private

# we assume that playlist_to_be_updated here represents a YouTubePlaylistEntry object
playlist_entry_id = playlist_to_be_updated.id.text.split('/')[[]-1]

# we want to keep the original description for the playlist so we store it first
original_description = playlist_to_be_updated.description.text

updated_playlist = yt_service.UpdatePlaylist(playlist_entry_id,
                                             'a new updated title',
                                             original_playlist_description,
                                             playlist_private=True)

将视频添加到播放列表中

您可以使用 YouTubeService 对象的 AddPlaylistVideoEntryToPlaylist 方法将视频添加到播放列表中。以下代码会将视频添加到具有自定义标题和说明的播放列表中。

custom_video_title = 'my test video on my test playlist'
custom_video_description = 'this is a test video on my test playlist'
video_id = 'Ncakifd_16k'
playlist_uri = 'http://gdata.youtube.com/feeds/api/playlists/BCB3BB96DF51B505'

playlist_video_entry = yt_service.AddPlaylistVideoEntryToPlaylist(
    playlist_uri, video_id, custom_video_title, custom_video_description)

if isinstance(playlist_video_entry, gdata.youtube.YouTubePlaylistVideoEntry):
  print 'Video added'

注意:不需要自定义标题和说明。如果未指定,则使用视频的实际标题和说明。

修改播放列表中的视频信息

使用 YouTubeService 对象的 UpdatePlaylistVideoEntryMetaData 方法可更改 YouTubePlaylistVideoEntry 的元数据。在下面的示例中,我们决定为视频指定一个新的自定义标题,并将其移动到播放列表的第一个位置(位置 1)。

playlist_uri = 'http://gdata.youtube.com/feeds/api/playlists/BCB3BB96DF51B505'
playlist_entry_id = 'B0F29389E537F888'

new_video_title = 'a useful video'
new_video_description = 'updated video description'

updated_playlist_video_entry = yt_service.UpdatePlaylistVideoEntryMetaData(
    playlist_uri, playlist_entry_id, new_video_title, new_video_description, 1)

注意:如果您要将视频的说明和标题还原为原始元数据,只需为标题和说明传入 NULL 即可。

从播放列表中移除视频

如需从播放列表中移除视频,请使用 YouTubeService 对象的 DeletePlaylistVideoEntry 方法。该方法需要包含待删除条目的播放列表的 URI 以及该条目的 ID:

playlist_uri = 'http://gdata.youtube.com/feeds/api/playlists/BCB3BB96DF51B505'
playlist_entry_id = 'B0F29389E537F888'
response = yt_service.DeletePlaylistVideoEntry(playlist_uri,
                                               playlist_entry_id)
if response is True:
  print 'Entry successfully deleted'

删除播放列表

要删除播放列表,只需使用 YouTubeService 对象的 DeletePlaylist 方法,并传入要删除的播放列表的 URI 即可:

playlist_uri = 'http://gdata.youtube.com/feeds/api/playlists/BCB3BB96DF51B505'
response = yt_service.DeletePlaylist(playlist_uri)

if response is True:
  print 'Playlist successfully deleted'

订阅

如需提取指定用户订阅的频道、搜索和收藏列表,请使用以下 URI:

http://gdata.youtube.com/feeds/api/users/username/subscriptions

注意:或者,您可以传入字符串 default 以检索当前通过身份验证的用户的收藏。

检索用户订阅

以下代码演示了如何检索和输出给定用户的订阅列表。订阅表示为由 gdata.youtube.YouTubeSubscriptionEntry 对象组成的 gdata.youtube.YouTubeSubscriptionFeed。要检索订阅,请使用 YouTubeService 对象的 GetYouTubeSubscriptionFeed 方法,传入订阅 Feed 的 URI 或要检索订阅 Feed 的用户名。用户名参数默认为当前经过身份验证的用户。

subscription_feed = yt_service.GetYouTubeSubscriptionFeed(username='gdpython')

if isinstance(subscription_feed, gdata.youtube.YouTubeSubscriptionFeed)):
  # given a YouTubeSubscriptionEntry we can determine it's type (channel, favorite, or query)
  for entry in subscription_feed.entry:
    print entry.GetSubscriptionType()

添加订阅

通过在经过身份验证的用户的“订阅”Feed 中插入新的YouTubeSubsciptionEntry,您可以创建新的订阅。我们可以创建三种类型的订阅:对用户的渠道的订阅(使用 AddSubscriptionToChannel)、在用户收藏夹的订阅(使用 AddSubscriptionToFavorites)或对特定关键字的订阅(使用 AddSubscriptionToQuery)。以下代码将已通过身份验证的用户订阅到“GoogleDevelopers” 渠道。

new_subscription = yt_service.AddSubscriptionToChannel(
      username_to_subscribe_to='GoogleDevelopers')

if isinstance(new_subscription, gdata.youtube.YouTubeSubscriptionEntry):
  print 'New subscription added'

您还可以订阅“GoogleDevelopers”用户的最爱:

new_subscription = yt_service.AddSubscriptionToFavorites(
    username='GoogleDevelopers')
if isinstance(new_subscription, gdata.youtube.YouTubeSubscriptionEntry):
  print 'New subscription added'

最后,您还可以订阅特定的搜索字词。此处,我们订阅的是对标记为“python”的视频的查询。

new_subscription = yt_service.AddSubscriptionToQuery(query='python')

if isinstance(new_subscription, gdata.youtube.YouTubeSubscriptionEntry):
  print 'New subscription added'

删除订阅

如需删除用户订阅,请使用 YouTubeService 对象的 DeleteSubscription 方法。

sample_subscription_uri = ('http://gdata.youtube.com/feeds/api/users/'
                           'gdpython/subscriptions/c0c77ca6102a7479')

response = yt_service.DeleteSubscription(sample_subscription_uri)

if response is True:
  print 'Subscription successfully deleted'

启用用户互动

用户配置文件

检索用户的个人资料

要手动提取用户的 YouTube 个人资料,请使用以下 URI:

http://gdata.youtube.com/feeds/api/users/username

您可以使用 YouTubeService 对象的 GetYouTubeUserEntry 方法检索 gdata.youtube.YouTubeUserEntry

user_entry = yt_service.GetYouTubeUserEntry(username='gdpython')

# we can then write a helper function to print out the user details
def PrintUserEntry(entry):
  # print required fields where we know there will be information
  print 'URI: %s\n' % entry.id.text
  print 'Age: %s\n' % entry.age.text
  print 'Gender: %s\n' % entry.gender.text
  print 'Location: %s\n' % entry.location.text

  # check if there is information in the other fields and if so print it
  if user.first_name: 
    print 'First Name: %s\n' % user.first_name.text
  if user.last_name:
    print 'Last Name: %s\n' % user.last_name.text
  if user.relationship:
    print 'Relationship: %s\n' % user.relationship.text
  if user.description:
    print 'About me: %s\n' % user.description.text
  for link in user.link:
    if link.rel == 'related':
      print 'Website: %s\n' % link.href
  if user.company:
    print 'Company: %s\n' % user.company.text
  if user.occupation:
    print 'Occupation: %s\n' % user.occupation.text
  if user.school:
    print 'School: %s\n' % user.school.text
  if user.hobbies:
    print 'Hobbies: %s\n' % user.hobbies.text
  if user.movies:
    print 'Movies: %s\n' % user.movies.text
  if user.music:
    print 'Music: %s\n' % user.music.text
  if user.books:
    print 'Books: %s\n' % user.books.text
  if user.hometown:
    print 'Hometown: %s\n' % user.hometown.text

联系人

可以通过以下网址检索指定用户的联系人列表:

http://gdata.youtube.com/feeds/api/users/username/contacts

检索用户联系人

YouTubeService 对象的 GetYouTubeContactFeed 方法可用于检索 gdata.youtube.YouTubeContactFeed,其中包含 gdata.youtube.YouTubeContactEntry 对象。

contact_feed = yt_service.GetYouTubeContactFeed(username='GoogleDevelopers')
for entry in contact_feed.entry:
  print entry.title.text
  # find the apprpriate category element to find out the contact type
  for category in entry.category:
    if category.scheme == 'http://gdata.youtube.com/schemas/2007/contact.cat':
      print category.term

添加联系人

如需向用户联系人 Feed 添加新的联系人,请使用 YouTubeService 对象的 AddContact 方法。

new_contact = yt_service.AddContact(contact_username='GoogleDevelopers')

if isinstance(new_contact, gdata.youtube.YouTubeContactEntry)
  print 'New contact added'

接受/拒绝联系人

如需更新联系人,请使用 YouTubeService 对象的 UpdateContact 方法。此方法可用于接受/拒绝联系人请求,以及将联系人归类为“好友”或“家庭”。在下面的示例中,我们接受联系人,然后将其类别设置为“Family”(家庭):

# in this case user 'gdpython' has requested to be our contact
#so the original contact status is 'pending'
updated_contact = yt_service.UpdateContact('gdpython', 'accepted', 'Family')

if isinstance(updated_contact, gdata.youtube.YouTubeContactEntry)
  print 'New contact added'

删除联系人

要删除联系人,请使用 YouTubeService 对象的 DeleteContact 方法,并传入您要删除的联系人的用户名。

response = yt_service.DeleteContact(contact_username='gdpython')

if response is True:
  print 'Contact deleted'

返回页首