借助 YouTube Data API,客户端应用可以以 Google Data API Feed 的形式检索和更新 YouTube 内容。 您的客户端应用可以使用 YouTube Data API Feed 提取、搜索和更新视频、评论、回复、播放列表、用户个人资料和用户联系信息,以及查询与特定条件匹配的视频。
除了介绍 YouTube Data API 功能的一些背景信息之外,本文档还提供了使用 Python 客户端库与该 API 交互的示例。如需使用 Python 客户端库,您需要 Python 2.0 及更高版本以及 Element Tree、httplib 和 urllib 模块。如需了解详情,请参阅依赖项模块。
如果您需要有关设置 Python 客户端库的帮助,请参阅使用入门指南。如果您有兴趣详细了解 Python 客户端库与 YouTube 交互时所使用的底层协议,请参阅“开发者指南”协议页面。
关于此文档
受众群体
本文档适用于想要编写可使用 Python 客户端库与 YouTube 交互的客户端应用的程序员。其中提供了一系列基本数据 API 交互示例。
如需了解 YouTube Data API 参考信息,请参阅参考指南。
本文档假设您了解 Google Data API 协议背后的一般概念,并且知道如何使用 Python 编程。
如需有关 Python 类和方法的参考信息,请参阅源代码中包含的 pyDoc(适用于服务类和数据类)。
文档结构
本文档包含以下几个部分:
-
身份验证部分介绍了可用于将 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 及更高版本,以及 Element Tree、httplib 和 urllib 模块。如需了解详情,请参阅依赖项模块。
如需详细了解如何配置环境,请参阅入门指南。如果您有兴趣详细了解 Python 客户端库与 YouTube 交互时所使用的底层协议,请参阅“开发者指南”协议页面。
您可以将以下示例代码段复制/粘贴到您的代码中,并根据需要进行修改。
您必须先初始化 gdata.youtube.service.YouTubeService
对象,然后才能使用 YouTube Data API 执行任何操作,如下所示。下面列出的 import
语句将自动从 gdata.media
和 gdata.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,您需要向 YouTube 服务器进行身份验证。
您可以通过 ClientLogin 身份验证(适用于桌面应用)或 AuthSub 身份验证(适用于 Web 应用)执行身份验证。
设置开发者密钥和客户端 ID
开发者密钥用于标识提交 API 请求的 YouTube 开发者。客户端 ID 用于标识您的应用程序,以便进行登录和调试。
使用 Python 客户端库发出 API 请求时,X-GData-Key
请求标头用于指定开发者密钥,X-GData-Client
标头用于指定客户端 ID。开发者密钥和客户端 ID 可在 YouTubeService
对象上设置,不受所使用的身份验证方案的影响:
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 执行所有后续请求。AuthSub 会话令牌不会过期,除非您明确发出撤消令牌的请求,或者用户决定通过访问其 YouTube 账号中的已获授权的网站页面撤消访问权限。
针对已安装的应用的 ClientLogin 身份验证
ClientLogin 身份验证用于已安装的应用,这些应用可以存储或查询用户的用户名和密码。如需使用这种身份验证方式,请调用从 gdata.service.GDataService
类继承的 YouTubeService
的 ProgrammaticLogin
方法,指定您的客户端代表哪个用户发送身份验证请求的 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_key
和 client_id
属性后,YouTubeService
对象会自动设置正确的 X-GData-Key
和 X-GData-Client
标头。
注意:如需详细了解 AuthSub 和 ClientLogin 机制,请参阅 Google Data API 身份验证文档。
了解视频供稿和条目
YouTube Data 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
条目中的大部分重要信息都可以从该条目(表示 XML media:group
元素)内的 media
属性(包含 gdata.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 Data API 提供 YouTube 最热门视频的标准 Feed。该 API 之前支持其他标准 Feed,但这些 Feed 现已废弃。如需了解详情,请参阅开发者指南。
YouTube 最热门视频动态的网址格式如下:
http://gdata.youtube.com/feeds/api/standardfeeds/most_popular
注意:您还可以通过指定格式为 http://gdata.youtube.com/feeds/api/standardfeeds/localeID/feedID
的语言区域 ID 来检索特定于语言区域的标准 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,其中包含与其上传的视频对应的 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.YouTubeService
的 YouTubeQuery
方法。
以下示例展示了如何执行搜索查询,并按观看次数对结果进行排序,包括受限视频(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
- 设置条目的作者。“作者”与“YouTube 用户名”同义。
format
- 指定视频格式。接受数字参数,用于指定用于移动视频播放的两种 RTSP 流式传输网址之一,或指向可嵌入的 Flash 播放器的 HTTP 网址。
racy
- 指示结果中是否应包含受限内容。仅接受两个参数:“include”或“exclude”。
max_results
- 设置一次可返回的条目数上限。
start_index
- 设置要检索的第一个结果的索引(从 1 开始,用于分页)。
orderby
- 设置列出条目的顺序,例如按
relevance
、viewCount
、published
或rating
进行排序。 time
- 设置一个时间段,以将标准 Feed 结果限制为:
today
、this_week
、this_month
或all_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 搜索请求。请务必指定视频必须匹配的类别架构和开发者标记。您可以通过以下网址检索与您的开发者代码(在我们的示例中为“your_tag_here”)匹配的视频 Feed:
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 视频“mytestmovie.mov”上传到 YouTube,并使用以下属性:
属性 | 值 |
---|---|
标题 | My Test Movie |
类别 | 汽车 |
关键字 | 汽车、搞笑 |
说明 | 我的说明 |
文件名 | mytestmovie.mov |
文件 MIME 类型 | video/quicktime |
视频设为私享? | false |
视频位置 | 37,-122 (lat,long) |
开发者代码 | mydevelopertag、anotherdevelopertag |
以下代码会创建一个要上传的空白 YouTubeVideoEntry
。 YouTubeService
上的 InsertVideoEntry
方法需要以下参数:
video_entry
- 包含元数据的gdata.youtube.VideoEntry
对象filename_or_handle
- 类文件对象或要从中读取视频的文件名youtube_username
- 一个可选字符串,用于指定要将此视频上传到的账号的用户名。当然,您的账号需要拥有适当的权限。默认值为当前已通过身份验证的用户的账号。content_type
- 一个可选字符串,用于指定要上传的视频的 MIME 类型。
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
检索的示例所示。为了在用户提交表单后将其重定向到您的网站,请务必将 next
参数附加到 post_url
(如下所示),该参数的运作方式与 AuthSub 链接的 next
参数相同。唯一的区别在于,此处会以网址参数的形式返回 status
和 id
变量,而不是一次性令牌。
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 中。不过,在处理完毕之前,该评价不会在网站上公开显示。被拒绝或上传失败的视频也只会显示在经过身份验证的用户的上传动态中。以下代码会检查 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 之间(包括这两个数值):
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.YouTubeCommentFeed
,由 gdata.youtube.YouTubeCommentEntry
对象组成。该 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
方法的默认行为是返回 null。
添加收藏夹
如需添加收藏的视频,请使用 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()
添加订阅
您可以通过将新的 YouTubeSubsciptionEntry
插入已验证用户的订阅 Feed 中来创建新的订阅。我们可以创建三种类型的订阅:订阅用户的频道(使用 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.YouTubeContactEntry
对象组成的 gdata.youtube.YouTubeContactFeed
。
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
方法。此方法可用于接受/拒绝联系请求,还可将联系人分类为“朋友”或“家人”。在以下示例中,我们接受了联系人,然后将其类别设置为“家庭”:
# 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'