Cómo enviar una primera solicitud

Nota: La API de Content ID de YouTube se diseñó para que la usen los socios de contenido de YouTube, por lo que no todos los desarrolladores ni todos los usuarios de YouTube pueden acceder a ella. Si la API de Content ID de YouTube no aparece 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 línea de comandos a continuación acepta los siguientes parámetros de línea de comandos y establece valores para la variable global FLAGS:

  • El parámetro content_owner_id es obligatorio e identifica al propietario del contenido de CMS sobre el que vas a recuperar 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 entiende.
#!/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 Content ID de YouTube requiere un archivo client_secrets.json, que contiene información de la Consola de API, para realizar la autenticación. También es necesario registrar la aplicación. Para obtener una explicación más completa de cómo funciona 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 código de autenticación a tu secuencia de comandos

Para habilitar la autenticación y autorización de usuarios, debes agregar las siguientes declaraciones 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 que nuestra aplicación envíe solicitudes de API en nombre del usuario, 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 un objeto httplib2 y adjunta credenciales

Después de que el usuario autoriza nuestra secuencia de comandos, creamos un objeto httplib2.Http, que controla las solicitudes a la API, y adjuntamos las credenciales de autorización a ese objeto.

Agrega la siguiente instrucción de importación:

  import httplib2

Además, 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 autoriza nuestra aplicación, creamos el objeto service, que proporciona métodos para interactuar con ContentOwnerService.

Agrega la siguiente instrucción de importación:

from apiclient.discovery import build

Además, 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 este 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 adicional sobre licencias y comentarios 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 para tu cuenta en la página Configuración de la cuenta de tu cuenta del CMS. El valor se muestra como Partner Code en la sección de información de la cuenta en 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 el parámetro no se menciona 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)