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

📅  最后修改于: 2021-10-19 05:45:24             🧑  作者: Mango

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

我们最近讨论了视频列表方法的前两种变体,按视频 ID 的视频列表和按多个视频 ID 的视频列表。现在,让我们讨论另外两个变体——

  • 视频列表最受欢迎的视频
  • 视频列表我喜欢的视频
  • 列出最流行的视频: regionCode参数说明您要检索视频的国家/地区。 videoCategoryId参数可以设置为检索特定类别中最流行的视频。
    # import libraries
    from apiclient.discovery import build
    import pprint
      
    # arguments to be passed to build function
    DEVELOPER_KEY = "Your_developer_key"
    YOUTUBE_API_SERVICE_NAME = "youtube"
    YOUTUBE_API_VERSION = "v3"
      
    # creating youtube resource object
    # for interacting with API
    youtube = build(YOUTUBE_API_SERVICE_NAME, 
                         YOUTUBE_API_VERSION,
                developerKey = DEVELOPER_KEY)
      
      
    def mostpopular_video_details():
      
        # Call the videos.list method to retrieve video info
        list_videos_byid = youtube.videos().list(
            part = "id, snippet, contentDetails, statistics",
                      chart ='mostPopular', regionCode ='IN', 
               maxResults = 2, videoCategoryId ='').execute()
      
        # extracting the results from search response
        results = list_videos_byid.get("items", [])
          
        # empty list to store video details
        videos = []
        n = 1
        for result in results:
            videos.append("% s (% s) (% s) (% s) (% s) (% s)"
                            % (n, result["snippet"]["title"],
                            result['snippet']['description'],
                            result["snippet"]["publishedAt"],
                                    result['contentDetails'],
                                       result["statistics"]))
            n = n + 1
              
        print ("Videos:\n", "\n".join(videos), "\n")
          
      
    if __name__ == "__main__":
        mostpopular_video_details()
    

    输出:

  • 列出我喜欢的视频:这需要用户授权才能检索用户喜欢的视频。通过将myRating参数设置为不喜欢,可以检索不喜欢的视频。 myRating参数指示应该在授权用户的帐户内进行搜索。由于此方法需要用户的身份验证,因此我们将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. 在 APIs & Services 下的侧边栏中,选择Credentials
    8. 在页面顶部,选择OAuth consent screen选项卡。选择一个电子邮件地址,如果尚未设置,请输入产品名称,然后单击保存按钮。
    9. 在凭据选项卡中,选择创建凭据下拉列表,然后选择OAuth Client Id 。 OAuth 通常用于需要授权的情况,例如检索用户喜欢的视频。
    10. 选择其他应用程序类型,输入名称“YouTube Data API Myvideos”,然后单击“创建”按钮并单击“确定”。
    11. 单击客户端 ID 右侧的下载按钮以下载 JSON 文件。
    12. 将文件保存并重命名为client_secret.json并将其移动到工作目录。

    pip命令安装其他库:

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

    下面是示例:

    # importing libraries
    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_list_my_liked_videos(client, **kwargs): 
        kwargs = remove_empty_kwargs(**kwargs)
        response = client.videos().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()
          
        videos_list_my_liked_videos(client,
            part ='snippet, contentDetails, statistics',
                    myRating ='like', maxResults = 2)
    

    输出:

    在执行代码时,它会询问授权码。要获取代码,我们需要按照以下行上方的命令提示符屏幕中提到的链接进行操作:输入授权代码。

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

    为方便起见,我们将maxResults参数设置为 2。

    有关完整的参数列表,请参阅 Youtube Data API Documentation-video.list()。

    参考: https://developers.google.com/youtube/v3/docs/videos/list