📌  相关文章
📜  用于处理视频的 Youtube Data API |第 4 组

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

用于处理视频的 Youtube Data API |第 4 组

先决条件:用于处理视频的 Youtube Data API |第 1 组、第 2 组、第 3 组

在本文中,我们将讨论与视频相关的两种方法:更新视频、删除视频。

更新视频和删除上传的视频需要用户授权,因此我们将为此示例创建 OAuth 类型的凭据。按照以下步骤生成客户端 ID 和密钥。

  1. 转到 Google Google Developers Console,然后单击页面右上角的登录。使用有效 Google 帐户的凭据登录。如果您没有 google 帐户,请先设置一个帐户,然后使用详细信息在 Google Developers 主页上登录。
  2. 现在导航到开发人员仪表板并创建一个新项目。
  3. 单击启用 API 选项。
  4. 在搜索字段中,搜索 Youtube Data API 并选择下拉列表中的 Youtube Data API 选项。
  5. 您将被重定向到显示有关 Youtube Data API 的信息的屏幕,以及两个选项:ENABLE 和 TRY API。
  6. 单击启用选项以开始使用 API。
  7. 在 API 和服务下的侧栏中,选择凭据。
  8. 在页面顶部,选择 OAuth 同意屏幕选项卡。选择一个电子邮件地址,输入产品名称(如果尚未设置),然后单击保存按钮。
  9. 在 Credentials 选项卡中,选择 Create credentials 下拉列表,然后选择 OAuth Client Id。 OAuth 通常用于需要授权的情况,例如检索用户喜欢的视频。
  10. 选择应用类型Other,输入名称“YouTube Data API Myvideos”,点击创建按钮,点击确定。
  11. 单击客户端 ID 右侧的下载按钮以下载 JSON 文件。
  12. 将文件保存并重命名为 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 ='')

输出:

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

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

从帐户中可以看出,上传部分没有视频。

参考:

  1. https://developers.google.com/youtube/v3/docs/videos/update
  2. https://developers.google.com/youtube/v3/docs/videos/delete