检索youtube订阅python api

时间:2016-06-10 19:15:48

标签: python youtube-api youtube-data-api

我想使用youtube-api使用python(无显示)从命令行检索我的youtube订阅和其他数据列表,阅读谷歌开发者文档后我意识到ouath 2需要用户界面但是还有{{3可用于使用youtube tv与youtube进行交互的kodi,我认为它可能对我的情况有用。

2 个答案:

答案 0 :(得分:1)

正如您提到的,为了检索您的订阅列表,您需要首先对您的应用程序或脚本进行身份验证和授权,以“读取”您的订阅。完成此操作后,您就可以使用YouTube订阅数据API列表方法检索YouTube订阅: Subscriptions: list

使用YouTube订阅数据API插入方法Subscriptions: insert的Python示例代码的修改版本,以下代码将对用户进行身份验证和授权,然后获得授权,检索授权用户的所有YouTube订阅

虽然下面的代码没有使用命令行参数明确地工作,但如果您选择使用命令行参数,则没有理由不使用命令行参数。一些Google YouTube API Python示例包含此代码的代码。

# coding: utf-8
# https://developers.google.com/youtube/v3/docs/subscriptions/list

import math
import os
import sys

import httplib2
from apiclient.discovery import build
from apiclient.errors import HttpError
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import argparser, run_flow

# The CLIENT_SECRETS_FILE variable specifies the name of a file that contains
# the OAuth 2.0 information for this application, including its client_id and
# client_secret. You can acquire an OAuth 2.0 client ID and client secret from
# the Google Developers Console at
# https://console.developers.google.com/.
# Please ensure that you have enabled the YouTube Data API for your project.
# For more information about using OAuth2 to access the YouTube Data API, see:
#   https://developers.google.com/youtube/v3/guides/authentication
# For more information about the client_secrets.json file format, see:
#   https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
CLIENT_SECRETS_FILE = "client_secrets.json"

# This OAuth 2.0 access scope allows for full read/write access to the
# authenticated user's account.
YOUTUBE_READ_WRITE_SCOPE = "https://www.googleapis.com/auth/youtube"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

# This variable defines a message to display if the CLIENT_SECRETS_FILE is
# missing.
MISSING_CLIENT_SECRETS_MESSAGE = """
WARNING: Please configure OAuth 2.0

To make this sample run you will need to populate the client_secrets.json file
found at:

   {}

with information from the Developers Console
https://console.developers.google.com/

For more information about the client_secrets.json file format, please visit:
https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
""".format(os.path.abspath(os.path.join(os.path.dirname(__file__),
                                        CLIENT_SECRETS_FILE)))


def retrieve_youtube_subscriptions():
    # In order to retrieve the YouTube subscriptions for the current user,
    # the user needs to authenticate and authorize access to their YouTube
    # subscriptions.
    youtube_authorization = get_authenticated_service()

    try:
        # init
        next_page_token = ''
        subs_iteration = 0
        while True:
            # retrieve the YouTube subscriptions for the authorized user
            subscriptions_response = youtube_subscriptions(youtube_authorization, next_page_token)
            subs_iteration += 1
            total_results = subscriptions_response['pageInfo']['totalResults']
            results_per_page = subscriptions_response['pageInfo']['resultsPerPage']
            total_iterations = math.ceil(total_results / results_per_page)
            print('Subscriptions iteration: {} of {} ({}%)'.format(subs_iteration,
                                                                   total_iterations,
                                                                   round(subs_iteration / total_iterations * 100),
                                                                   0))
            # get the token for the next page if there is one
            next_page_token = get_next_page(subscriptions_response)
            # extract the required subscription information
            channels = parse_youtube_subscriptions(subscriptions_response)
            # add the channels relieved to the main channel list
            all_channels.extend(channels)
            if not next_page_token:
                break
        return all_channels

    except HttpError as err:
        print("An HTTP error {} occurred:\n{}".format(err.resp.status, err.content))


def get_authenticated_service():
    # Create a Storage instance to store and retrieve a single
    # credential to and from a file. Used to store the
    # oauth2 credentials for the current python script.
    storage = Storage("{}-oauth2.json".format(sys.argv[0]))
    credentials = storage.get()

    # Validate the retrieved oauth2 credentials
    if credentials is None or credentials.invalid:
        # Create a Flow instance from a client secrets file
        flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
                                       scope=YOUTUBE_READ_WRITE_SCOPE,
                                       message=MISSING_CLIENT_SECRETS_MESSAGE)
        # The run_flow method requires arguments.
        # Initial default arguments are setup in tools, and any
        # additional arguments can be added from the command-line
        # and passed into this method.
        args = argparser.parse_args()
        # Obtain valid credentials
        credentials = run_flow(flow, storage, args)

    # Build and return a Resource object for interacting with an YouTube API
    return build(YOUTUBE_API_SERVICE_NAME,
                 YOUTUBE_API_VERSION,
                 http=credentials.authorize(httplib2.Http()))


# Call youtube.subscriptions.list method
# to list the channels subscribed to.
def youtube_subscriptions(youtube, next_page_token):
    subscriptions_response = youtube.subscriptions().list(
        part='snippet',
        mine=True,
        maxResults=50,
        order='alphabetical',
        pageToken=next_page_token).execute()
    return subscriptions_response


def get_next_page(subscriptions_response):
    # check if the subscription response contains a reference to the
    # next page or not
    if 'nextPageToken' in subscriptions_response:
        next_page_token = subscriptions_response['nextPageToken']
    else:
        next_page_token = ''
    return next_page_token


def parse_youtube_subscriptions(subscriptions_response):
    channels = []

    # Add each result to the appropriate list
    for subscriptions_result in subscriptions_response.get("items", []):
        if subscriptions_result["snippet"]["resourceId"]["kind"] == "youtube#channel":
            channels.append("{} ({})".format(subscriptions_result["snippet"]["title"],
                                             subscriptions_result["snippet"]["resourceId"]["channelId"]))

    return channels


if __name__ == "__main__":
    # init
    all_channels = []

    print('Perform youtube subscriptions')
    # retrieve subscriptions
    all_channels = retrieve_youtube_subscriptions()
    print('Subscriptions complete')
    print('Subscriptions found: {}'.format(len(all_channels)))

    print("Channels:\n", "\n".join(all_channels), "\n")

注意:作为一次性操作,上述代码如果找不到用户的授权凭据,则会打开本地网址并重定向到Google进行身份验证。

其他先决条件:

  1. 要使上述Python 3代码生效,需要使用pip安装“google-api-python-client-py3”软件包。
  2. 需要创建client_secrets.json文件。这是通过遵循python脚本顶部的说​​明完成的。

答案 1 :(得分:0)

您可以使用Activities:list此方法返回与请求条件匹配的频道活动事件列表。例如,您可以检索与特定频道相关联的事件,与用户订阅和Google+朋友相关联的事件,或为每个用户自定义的YouTube主页Feed。

HTTP请求

GET https://www.googleapis.com/youtube/v3/activities

Subscription:list返回与API请求数据匹配的订阅资源。

如果成功,此方法将返回具有以下结构的响应正文:

{
"kind": "youtube#subscriptionListResponse",
"etag": etag,
"nextPageToken": string,
"prevPageToken": string,
"pageInfo": {
"totalResults": integer,
"resultsPerPage": integer
},
"items": [
subscription Resource
]
}