用于处理视频的 Youtube Data API |第 4 组
先决条件:用于处理视频的 Youtube Data API |第 1 组、第 2 组、第 3 组
在本文中,我们将讨论与视频相关的两种方法:更新视频、删除视频。
更新视频和删除上传的视频需要用户授权,因此我们将为此示例创建 OAuth 类型的凭据。按照以下步骤生成客户端 ID 和密钥。
- 转到 Google Google Developers Console,然后单击页面右上角的登录。使用有效 Google 帐户的凭据登录。如果您没有 google 帐户,请先设置一个帐户,然后使用详细信息在 Google Developers 主页上登录。
- 现在导航到开发人员仪表板并创建一个新项目。
- 单击启用 API 选项。
- 在搜索字段中,搜索 Youtube Data API 并选择下拉列表中的 Youtube Data API 选项。
- 您将被重定向到显示有关 Youtube Data API 的信息的屏幕,以及两个选项:ENABLE 和 TRY API。
- 单击启用选项以开始使用 API。
- 在 API 和服务下的侧栏中,选择凭据。
- 在页面顶部,选择 OAuth 同意屏幕选项卡。选择一个电子邮件地址,输入产品名称(如果尚未设置),然后单击保存按钮。
- 在 Credentials 选项卡中,选择 Create credentials 下拉列表,然后选择 OAuth Client Id。 OAuth 通常用于需要授权的情况,例如检索用户喜欢的视频。
- 选择应用类型Other,输入名称“YouTube Data API Myvideos”,点击创建按钮,点击确定。
- 单击客户端 ID 右侧的下载按钮以下载 JSON 文件。
- 将文件保存并重命名为 client_secret.json 并将其移动到工作目录。
使用pip命令安装其他库:
pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2
更新视频的代码:此示例显示如何使用 Id(Video ID) 作为 Key 属性来更新视频属性。我们更新了之前上传视频的属性。进行了以下更新:
- CategoryId:从 27(教育)更改为 24(娱乐)
- 说明:从“示例学习 ABC 视频”更改为“这是 ABC 学习视频”
- 标题:从“示例测试视频上传”更改为“ABC 学习视频”
属性 id、snippet.title、snippet.categoryId 是必需的,所有其他属性都是可选的。视频 ID 可以通过在 youtube 中播放视频并复制粘贴 = 符号后出现的字母数字系列来确定。例如,在 URL - https://www.youtube.com/watch?v=rfscVS0vtbw (视频 ID 为 - rfscVS0vtbw)。
下面是代码:
import os
import google.oauth2.credentials
import google_auth_oauthlib.flow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google_auth_oauthlib.flow import InstalledAppFlow
# The CLIENT_SECRETS_FILE variable specifies
# the name of a file that contains
# client_id and client_secret.
CLIENT_SECRETS_FILE = "client_secret.json"
# This scope allows for full read/write
# access to the authenticated user's account
# and requires requests to use an SSL connection.
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'
def get_authenticated_service():
flow = InstalledAppFlow.from_client_secrets_file(
CLIENT_SECRETS_FILE, SCOPES)
credentials = flow.run_console()
return build(API_SERVICE_NAME, API_VERSION, credentials = credentials)
def print_response(response):
print(response)
# Build a resource based on a list of
# properties given as key-value pairs.
# Leave properties with empty values
# out of the inserted resource.
def build_resource(properties):
resource = {}
for p in properties:
# Given a key like "snippet.title", split
# into "snippet" and "title", where
# "snippet" will be an object and "title"
# will be a property in that object.
prop_array = p.split('.')
ref = resource
for pa in range(0, len(prop_array)):
is_array = False
key = prop_array[pa]
# For properties that have array values,
# convert a name like "snippet.tags[]" to
# snippet.tags, and set a flag to handle
# the value as an array.
if key[-2:] == '[]':
key = key[0:len(key)-2:]
is_array = True
if pa == (len(prop_array) - 1):
# Leave properties without values
# out of inserted resource.
if properties[p]:
if is_array:
ref[key] = properties[p].split(', ')
else:
ref[key] = properties[p]
elif key not in ref:
# For example, the property is "snippet.title",
# but the resource does not yet have a "snippet"
# object. Create the snippet object here.
# Setting "ref = ref[key]" means that in the
# next time through the "for pa in range ..." loop,
# we will be setting a property in the
# resource's "snippet" object.
ref[key] = {}
ref = ref[key]
else:
# For example, the property is
# "snippet.description", and the resource
# already has a "snippet" object.
ref = ref[key]
return resource
# Remove keyword arguments that are not set
def remove_empty_kwargs(**kwargs):
good_kwargs = {}
if kwargs is not None:
for key, value in kwargs.items():
if value:
good_kwargs[key] = value
return good_kwargs
def videos_update(client, properties, **kwargs):
resource = build_resource(properties)
kwargs = remove_empty_kwargs(**kwargs)
response = client.videos().update(
body = resource, **kwargs).execute()
return print_response(response)
if __name__ == '__main__':
# When running locally, disable
# OAuthlib's HTTPs verification.
# When running in production * do not *
# leave this option enabled.
os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
client = get_authenticated_service()
# We will be changing categoryId, Description
# and Title of the video specified using videoID
videos_update(client,
{'id': 'QbEEuL-nWaE',
'snippet.categoryId': '24',
'snippet.defaultLanguage': '',
'snippet.description': 'This is the ABC Learning Video',
'snippet.tags[]': '',
'snippet.title': 'ABC Learn Video',
'status.privacyStatus': ''},
part ='snippet, status')
输出:
当您将执行代码时,您将被要求提供授权代码。要获取代码,您需要按照行上方命令提示屏幕中提到的链接:输入授权码。
现在点击链接并复制粘贴您将通过授予权限获得的授权代码。
我附上了两个程序的输出插入视频和更新视频。正如您通过比较图像所看到的,视频的标题和描述发生了变化。
删除视频的代码:此示例显示如何从授权用户的帐户中删除视频。 id 参数是必须提供的。
import os
import google.oauth2.credentials
import google_auth_oauthlib.flow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
from google_auth_oauthlib.flow import InstalledAppFlow
# The CLIENT_SECRETS_FILE variable specifies the name of a file that contains
# client_id and client_secret.
CLIENT_SECRETS_FILE = "client_secret.json"
# This scope allows for full read / write access to the
# authenticated user's account and requires requests to use an SSL connection.
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
API_SERVICE_NAME = 'youtube'
API_VERSION = 'v3'
def get_authenticated_service():
flow = InstalledAppFlow.from_client_secrets_file(
CLIENT_SECRETS_FILE, SCOPES)
credentials = flow.run_console()
return build(API_SERVICE_NAME, API_VERSION, credentials = credentials)
def print_response(response):
print(response)
# Remove keyword arguments that are not set
def remove_empty_kwargs(**kwargs):
good_kwargs = {}
if kwargs is not None:
for key, value in kwargs.items():
if value:
good_kwargs[key] = value
return good_kwargs
def videos_delete(client, **kwargs):
kwargs = remove_empty_kwargs(**kwargs)
response = client.videos().delete(
**kwargs).execute()
return print_response(response)
if __name__ == '__main__':
# When running locally, disable OAuthlib's
# HTTPs verification. When running in production
# * do not * leave this option enabled.
os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
client = get_authenticated_service()
videos_delete(client, id ='QbEEuL-nWaE',
onBehalfOfContentOwner ='')
输出:
当您将执行代码时,您将被要求提供授权代码。要获取代码,您需要按照行上方命令提示屏幕中提到的链接:输入授权码。
现在点击链接并复制粘贴您将通过授予权限获得的授权代码。
从帐户中可以看出,上传部分没有视频。
参考:
- https://developers.google.com/youtube/v3/docs/videos/update
- https://developers.google.com/youtube/v3/docs/videos/delete