📌  相关文章
📜  Youtube 数据 API 播放列表 |第一组

📅  最后修改于: 2022-05-13 01:55:48.497000             🧑  作者: Mango

Youtube 数据 API 播放列表 |第一组

在涵盖了所有类型的搜索和视频方法之后,我们将在本文中讨论有关播放列表的内容。每个人都必须知道 Youtube 中的播放列表是什么。使用 Youtube Data API 检索播放列表有两种方法:

  • 检索所有播放列表
  • 检索我的播放列表

我们将使用完整的代码和输出详细讨论这些方法。

按照以下步骤生成客户端 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 同意屏幕选项卡。选择一个电子邮件地址,输入产品名称(如果尚未设置),然后单击保存按钮。
  • Credentials 选项卡中,选择 Create credentials 下拉列表,然后选择OAuth Client Id 。 OAuth 通常用于需要授权的情况,例如检索用户喜欢的视频。
  • 选择应用类型Other,输入名称“YouTube Data API Myvideos”,点击Create按钮,点击OK。
  • 单击客户端 ID 右侧的下载按钮以下载 JSON 文件。
  • 将文件保存并重命名为 client_secret.json 并将其移动到工作目录。

使用pip命令安装其他库:

pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2

注意:我们忘记讨论的一件事是如何找到频道 ID 以将其用作第一个代码中的参数 - 列出与 Youtube 频道 ID 关联的所有播放列表。

请按照以下步骤查找频道 ID:

  • 登录您的 Youtube 帐户。
  • 在左上角,单击三行图标并转到设置。

  • 现在在左侧的同一菜单中,它将显示高级设置选项。

  • 您将在Account Information下看到您的频道 ID。

检索所有播放列表的代码:此示例显示如何检索由参数列表中提到的频道标识的Youtube频道拥有的所有播放列表。

Python3
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_list_by_channel_id(client, **kwargs):
  kwargs = remove_empty_kwargs(**kwargs)
 
  response = client.playlists().list(*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_list_by_channel_id(client,
    part ='snippet, contentDetails',
     
    # Replace with your Youtube Channel Id
    channelId ='UCqoMU8lNdUq63ZmTJFd620b',
    maxResults = 25)


Python3
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_mine(client, **kwargs):
kwargs = remove_empty_kwargs(**kwargs)
 
response = client.playlists().list(**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_mine(client,
    part ='snippet, contentDetails',
    mine = True,
    maxResults = 10,
    onBehalfOfContentOwner ='',
    onBehalfOfContentOwnerChannel ='')


输出:
当您将执行代码时,您将被要求提供授权代码。要获取代码,您需要按照行上方命令提示屏幕中提到的链接:输入授权码。

现在点击链接并复制粘贴您将通过授予权限获得的授权代码。

列出我的播放列表的代码:此示例显示如何打印授权用户的播放列表。它使用的参数来显示 API 应该只打印来自授权请求的用户的 Youtube 频道的播放列表。

Python3

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_mine(client, **kwargs):
kwargs = remove_empty_kwargs(**kwargs)
 
response = client.playlists().list(**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_mine(client,
    part ='snippet, contentDetails',
    mine = True,
    maxResults = 10,
    onBehalfOfContentOwner ='',
    onBehalfOfContentOwnerChannel ='')
  

输出:
当您将执行代码时,您将被要求提供授权代码。要获取代码,您需要按照行上方命令提示屏幕中提到的链接:输入授权码。

现在点击链接并复制粘贴您将通过授予权限获得的授权代码。

从输出中可以看出,授权用户的帐户中有 2 个播放列表,即在我的帐户中有两个播放列表。从总结果参数可以看出这一点。通过分析输出,您还可以找到播放列表 ID,即与每个播放列表相关联的唯一标识。

注意:请参阅与 Playlist.list() 方法关联的完整属性列表。随意尝试使用不同的属性值。

参考:

  1. https://developers.google.com/youtube/v3/docs/playlists/list
  2. https://support.google.com/youtube/answer/3250431?hl=en