Cómo enviar una primera solicitud

Nota: La API de Content ID de YouTube está diseñada para que la usen los socios de contenido de YouTube, y no todos los desarrolladores ni todos los usuarios de YouTube pueden acceder a ella. Si no ves la API de Content ID de YouTube como uno de los servicios enumerados en la Consola de API de Google, consulta el Centro de ayuda de YouTube para obtener más información sobre el Programa de socios de YouTube.

En este instructivo paso a paso, se explica cómo compilar una secuencia de comandos que se conecte a ContentOwnersService y recupere información sobre un propietario de contenido determinado. Al final del tutorial se incluye el código de ejemplo completo. El código está escrito en Python; sin embargo, hay bibliotecas cliente disponibles para otros lenguajes de programación.

Requisitos

Compilación de una secuencia de comandos para enviar solicitudes de API

Los siguientes pasos explican cómo crear una secuencia de comandos para enviar una solicitud de la API de Content ID de YouTube:

Paso 1: Creación de la secuencia de comandos básica

La siguiente secuencia de comandos acepta los siguientes parámetros de línea de comandos y establece valores en la variable FLAGS global:

  • El parámetro content_owner_id es obligatorio y permite identificar al propietario del contenido del CMS sobre el que recuperas información.
  • El parámetro logging_level especifica el nivel de detalle de registro de la secuencia de comandos.
  • El parámetro help hace que la secuencia de comandos genere una lista de los parámetros que comprende.
#!/usr/bin/python2.6
# -*- coding: utf-8 -*-

import gflags
import logging
import sys
import os

from datetime import *

# Define flags. The gflags module makes it easy to define command-line params
# for an application. Run this program with the '--help' argument to see all
# of the flags that it understands.
FLAGS = gflags.FLAGS
gflags.DEFINE_string('content_owner_id', None, ('Required flag. '
     'Identifies the content owner whose details are printed out.'))
gflags.MarkFlagAsRequired('content_owner_id')
gflags.DEFINE_enum('logging_level', 'ERROR',
    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
    'Set the level of logging detail.')


def main(argv):
  # Let the gflags module process the command-line arguments
  try:
    argv = FLAGS(argv)
  except gflags.FlagsError, e:
    print '%s\nUsage: %s ARGS\n%s' % (e, argv[0], FLAGS)
    sys.exit(1)

  # Set the logging according to the command-line flag
  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))

if __name__ == '__main__':
  main(sys.argv)

Paso 2: Habilitación de la autenticación de usuario y autorización

En este paso, incorporaremos la autorización de OAuth 2.0 en la secuencia de comandos. Esto permite que el usuario que ejecuta la secuencia de comandos autorice que esta realice solicitudes de API atribuidas a la cuenta del usuario.

Paso 2a: Crea un archivo client_secrets.json

La API de YouTube Content ID requiere un archivo client_secrets.json, que contiene información de la Consola de APIs, para realizar la autenticación. También es necesario registrar la aplicación. Para obtener una explicación más completa sobre el funcionamiento de la autenticación, consulta la guía de autenticación.

 {
  "web": {
    "client_id": "INSERT CLIENT ID HERE",
    "client_secret": "INSERT CLIENT SECRET HERE",
    "redirect_uris": [],
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token"
  }
}

Paso 2b: Agrega el código de autenticación a la secuencia de comandos

Para habilitar la autenticación y autorización de usuarios, debes agregar las siguientes instrucciones import:

from oauth2client.file import Storage
from oauth2client.client import flow_from_clientsecrets
from oauth2client.tools import run

A continuación, crearemos un objeto FLOW con los secretos del cliente configurados en el paso 2a. Si el usuario autoriza a nuestra aplicación para que envíe solicitudes a la API en su nombre, las credenciales resultantes se almacenan en un objeto Storage para su uso posterior. Si las credenciales caducan, el usuario tendrá que volver a autorizar nuestra aplicación.

Agrega el siguiente código al final de la función main:

  # Set up a Flow object to be used if we need to authenticate.
  FLOW = flow_from_clientsecrets('client_secrets.json',
      scope='https://www.googleapis.com/auth/youtubepartner',
      message='error message')

  # The Storage object stores the credentials. If it doesn't exist, or if
  # the credentials are invalid or expired, run through the native client flow.
  storage = Storage('yt_partner_api.dat')
  credentials = storage.get()
  
  if (credentials is None or credentials.invalid or
      credentials.token_expiry <= datetime.now()):
    credentials = run(FLOW, storage)

Paso 2c: Crea el objeto httplib2 y adjunta las credenciales

Después de que el usuario autorice nuestra secuencia de comandos, crearemos un objeto httplib2.Http, que se encargará de las solicitudes a la API, y le adjuntaremos las credenciales de autorización a ese objeto.

Agrega la siguiente instrucción de importación:

  import httplib2

Agrega este código al final de la función main:

  # Create httplib2.Http object to handle HTTP requests and
  # attach auth credentials.
  http = httplib2.Http()
  http = credentials.authorize(http)

Paso 3: Obtención de un servicio

La función build de la biblioteca cliente de Python construye un recurso que puede interactuar con una API. Después de que el usuario autorice nuestra aplicación, crearemos el objeto service, que proporciona métodos para interactuar con el ContentOwnerService.

Agrega la siguiente instrucción de importación:

from apiclient.discovery import build

Y agrega este código al final de la función main:

  service = build("youtubePartner", "v1", http=http, static_discovery=False)
  contentOwnersService = service.contentOwners()

Paso 4: Ejecución de una solicitud de API

En este paso vamos a crear una solicitud de servicio y ejecutarla. Con el siguiente código, se crea y ejecuta una solicitud contentOwnersService.get(), que recupera información sobre el propietario del contenido especificado.

Agrega el siguiente código al final de la función main:

  # Create and execute get request.
  request = contentOwnersService.get(contentOwnerId=FLAGS.content_owner_id)
  content_owner_doc = request.execute(http)
  print ('Content owner details: id: %s, name: %s, '
         'notification email: %s') % (
              content_owner_doc['id'], content_owner_doc['displayName'],
              content_owner_doc['disputeNotificationEmails'])

Solicitud completa

En esta sección, se muestra la solicitud completa con información de la licencia y comentarios adicionales en la secuencia de comandos. Puedes ejecutar el programa de dos formas:

  • Este comando abre una ventana del navegador para llevar a cabo la autenticación, si es necesario, y autorizar a la aplicación para que envíe solicitudes de API. Si se autoriza la aplicación, las credenciales se retransmiten automáticamente a la secuencia de comandos.

    python yt_partner_api.py --content_owner_id=CONTENT_OWNER_ID.

    Nota: Puedes encontrar el valor de CONTENT_OWNER_ID de tu cuenta en la página Configuración de la cuenta de tu cuenta del CMS. El valor aparece como Partner Code en la sección de información de la cuenta de esa página.

  • Este comando genera una URL que se puede abrir en un navegador y también te pedirá que escribas un código de autorización. Cuando ingresas a la URL, la página te permite autorizar que la aplicación pueda enviar solicitudes de API en tu nombre. Si concedes la autorización, la página muestra el código de autorización que debes escribir para completar el flujo de autorización.

    python yt_partner_api.py --content_owner_id=CONTENT_OWNER_ID --noauth_local_webserver.

    Nota: El módulo oauth2client reconoce el parámetro noauth_local_webserver, aunque no se mencione en la secuencia de comandos.

client_secrets.json

 {
  "web": {
    "client_id": "INSERT CLIENT ID HERE",
    "client_secret": "INSERT CLIENT SECRET HERE",
    "redirect_uris": [],
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://accounts.google.com/o/oauth2/token"
  }
}

yt_partner_api.py

#!/usr/bin/python2.6
# -*- coding: utf-8 -*-
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Simple command-line sample for YouTube Content ID API.

Command-line application that retrieves the information
about given content owner.

Usage:
  $ python yt_partner_api.py --content_owner_id=[contentOwnerId]
  $ python yt_partner_api.py --content_owner_id=[contentOwnerId] --noauth_local_webserver

You can also get help on all the command-line flags the program understands
by running:

  $ python yt_partner_api.py --help

To get detailed log output run:

  $ python yt_partner_api.py --logging_level=DEBUG \
    --content_owner_id=[contentOwnerId]
"""

import gflags
import httplib2
import logging
import sys
import os

from datetime import *
from apiclient.discovery import build
from oauth2client.file import Storage
from oauth2client.client import flow_from_clientsecrets
from oauth2client.tools import run

# Define flags. The gflags module makes it easy to define command-line options
# for an application. Run this program with the '--help' argument to see all
# of the flags that it understands.
FLAGS = gflags.FLAGS
gflags.DEFINE_string('content_owner_id', None, ('Required flag. '
     'Identifies the content owner id whose details are printed out.'))
gflags.MarkFlagAsRequired('content_owner_id')
gflags.DEFINE_enum('logging_level', 'ERROR',
    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
    'Set the level of logging detail.')

  
def main(argv):
  # Let the gflags module process the command-line arguments
  try:
    argv = FLAGS(argv)
  except gflags.FlagsError, e:
    print '%s\nUsage: %s ARGS\n%s' % (e, argv[0], FLAGS)
    sys.exit(1)
  
  # Set the logging according to the command-line flag
  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
  
  # Set up a Flow object to be used if we need to authenticate.
  FLOW = flow_from_clientsecrets('client_secrets.json',
      scope='https://www.googleapis.com/auth/youtubepartner',
      message='error message')

  # The Storage object stores the credentials. If the credentials are invalid
  # or expired and the script isn't working, delete the file specified below
  # and run the script again.
  storage = Storage('yt_partner_api.dat')
  credentials = storage.get()

  if (credentials is None or credentials.invalid or
      credentials.token_expiry <= datetime.now()):
    credentials = run(FLOW, storage)

  http = httplib2.Http()
  http = credentials.authorize(http)

  service = build("youtubePartner", "v1", http=http)
  contentOwnersService = service.contentOwners()

  # Create and execute get request.
  request = contentOwnersService.get(contentOwnerId=FLAGS.content_owner_id)
  content_owner_doc = request.execute(http)
  print ('Content owner details: id: %s, name: %s, '
         'notification email: %s') % (
              content_owner_doc['id'], content_owner_doc['displayName'],
              content_owner_doc['disputeNotificationEmails'])

if __name__ == '__main__':
  main(sys.argv)