我们已经讨论了播放列表的前两种方法 – 列出与频道 ID 关联的所有播放列表,检索我的播放列表,即授权用户帐户的播放列表。
现在,我们将讨论另外三种方法:插入播放列表、更新播放列表和删除播放列表。这意味着我们可以只使用 API 插入,或者我们可以说创建一个新的播放列表,然后我们可以只使用 API 将视频上传到播放列表,或者我们可以对视频进行评级以将其添加到所需的播放列表。
现在我们可以通过查看事物如何相互关联以及如何使用 API 完成所有操作来推导出相关性。您只需要一组有效的凭据来授权访问。所有这些方法都需要用户授权,所以我们将首先讨论如何创建OAuth Credential ,然后我们将看看这些功能的实现。
按照以下步骤生成客户端 ID 和密钥。
- 转到 Google Google Developers Console,然后单击页面右上角的登录。使用有效 Google 帐户的凭据登录。如果您没有 google 帐户,请先设置一个帐户,然后使用详细信息在 Google Developers 主页上登录。
- 现在导航到开发人员仪表板并创建一个新项目。
- 单击启用 API 选项。
- 在搜索字段中,搜索Youtube Data API并选择下拉列表中的 Youtube Data API 选项。
- 您将被重定向到显示有关 Youtube Data API 信息的屏幕,以及两个选项: ENABLE 和 TRY API 。
- 单击启用选项以开始使用 API。
- 在 APIs & Services 下的侧边栏中,选择Credentials 。
- 在页面顶部,选择OAuth 同意屏幕选项卡。选择一个电子邮件地址,如果尚未设置,请输入产品名称,然后单击保存按钮。
- 在凭据选项卡中,选择创建凭据下拉列表,然后选择OAuth 客户端 ID 。 OAuth 通常用于需要授权的情况,例如检索用户喜欢的视频。
- 选择其他应用程序类型,输入名称“YouTube Data API Myvideos”,然后单击“创建”按钮并单击“确定”。
- 单击客户端 ID 右侧的下载按钮以下载 JSON 文件。
- 将文件保存并重命名为 client_secret.json 并将其移动到工作目录。
使用 pip命令安装其他库:
pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2
插入播放列表的代码:此示例显示如何在授权用户的帐户中插入/创建播放列表。 snippet.title是创建新播放列表时的必需属性。其他的是可选的。
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 playlists_insert(client, properties, **kwargs):
resource = build_resource(properties)
kwargs = remove_empty_kwargs(**kwargs)
response = client.playlists().insert(
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()
playlists_insert(client,
{'snippet.title':'Information Security',
'snippet.description':'This playlist contains videos \
related to Information Security and Privacy \
and Security in Online Social Media',
'snippet.tags[]':'',
'snippet.defaultLanguage':'EN',
'status.privacyStatus':''},
part='snippet,status',
onBehalfOfContentOwner='')
输出:
当您执行代码时,系统会要求您提供授权代码。要获取代码,您需要按照以下行上方的命令提示符屏幕中提到的链接进行操作:输入授权代码。
现在点击链接并复制粘贴您将通过授予权限获得的授权代码。
从上面的输出中,您可以看到我的帐户中有一个新的播放列表,其标题和描述与代码中提到的相同,但没有添加视频。
我们可以根据您的选择通过代码或从 youtube 手动将视频添加到播放列表中,或者您也可以对视频进行评分以将其添加到播放列表中。
注意:您可以从可用的库菜单中查看您拥有的播放列表列表,方法是单击您初始的 youtube 页面右上角的图标,然后转到第一个选项注册的电子邮件 ID。这将在最左侧的垂直菜单中显示库选项。库列出了您帐户中的所有播放列表。
更新播放列表的代码:此示例向您展示了如何更新播放列表属性,如标题、说明或隐私状态。 id和snippet.title是强制性属性,所有其他属性都是可选的。
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 playlists_updateproperties(client, properties, **kwargs):
resource = build_resource(properties)
kwargs = remove_empty_kwargs(**kwargs)
response = client.playlists().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()
playlists_updateproperties(client,
{'id': 'PLqAJNJC4tCYs2-uG-AqaqHAIJzm_1FEtY',
'snippet.title': 'Information Security',
'snippet.description': 'This playlist contains videos on\
topics of Information Security and Privacy and \
Security in Online Social Media',
'snippet.tags[]': '',
'status.privacyStatus': 'public'},
part='snippet,status',
onBehalfOfContentOwner='')
输出:
当您执行代码时,系统会要求您提供授权代码。要获取代码,您需要按照以下行上方的命令提示符屏幕中提到的链接进行操作:输入授权代码。
现在点击链接并复制粘贴您将通过授予权限获得的授权代码。
如果将上一个和此输出的播放列表快照进行比较,您可以看到我更新了播放列表的描述和隐私状态。
删除播放列表的代码:现在是删除我们在第一个示例中创建的播放列表的时候了。
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 playlists_delete(client, **kwargs):
kwargs = remove_empty_kwargs(**kwargs)
response = client.playlists().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()
playlists_delete(client,
id ='PLqAJNJC4tCYs2-uG-AqaqHAIJzm_1FEtY',
onBehalfOfContentOwner ='')
输出:
当您执行代码时,系统会要求您提供授权代码。要获取代码,您需要按照以下行上方的命令提示符屏幕中提到的链接进行操作:输入授权代码。
现在点击链接并复制粘贴您将通过授予权限获得的授权代码。
现在,如果您查看 youtube 中的“库”菜单,您将看到该播放列表不再存在并且已成功删除。
请查看 Youtube 数据 API 播放列表的完整文档以获取完整的属性/属性列表。
参考:
- https://developers.google.com/youtube/v3/docs/playlists/delete
- https://developers.google.com/youtube/v3/docs/playlists/insert
- https://developers.google.com/youtube/v3/docs/playlists/update