Megacurso programación en Python3 | 1. Wrapper para la API de Youtube

in #spanish7 years ago (edited)

En esta clase aprenderemos a crear un wrapper para hacer llamadas a la API pública de Youtube. En la carpeta del proyecto puedes encontrar todo el código explicado a continuación.

<p dir="auto"><center><span><img src="https://images.hive.blog/768x0/https://s22.postimg.org/4kj1zdqvl/portada.png" srcset="https://images.hive.blog/768x0/https://s22.postimg.org/4kj1zdqvl/portada.png 1x, https://images.hive.blog/1536x0/https://s22.postimg.org/4kj1zdqvl/portada.png 2x" /> <h3><center><a href="https://github.com/mondeja/megacurso_python/tree/master/packages/video" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Carpeta del proyecto <h5><center>En <a href="https://github.com/mondeja/megacurso_python" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">la carpeta del curso encontrarás el índice con las clases publicadas. <hr /> <h3>Los endpoints <p dir="auto">Lo primero que debemos hacer es añadir las URLs base a las que haremos las llamadas. Creamos un archivo <code>.py y añadimos el siguiente código: <pre><code>#!/usr/bin/env python3 # -*- coding: utf-8 -*- YOUTUBE_COMMENT_URL = 'https://www.googleapis.com/youtube/v3/commentThreads' YOUTUBE_SEARCH_URL = 'https://www.googleapis.com/youtube/v3/search' <h3>El objeto <code>YoutubeApi <p dir="auto">Luego creamos una clase la cual usaremos para llamar a la API de Youtube. Usaremos la biblioteca urllib para abrir las URLs, que se incluye entre las bibliotecas de python3, así tendremos un código más portable. <blockquote> <p dir="auto"><a href="https://docs.python.org/3/library/urllib.html#module-urllib" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Desde aquí puedes acceder a la documentación de urllib. <blockquote> <p dir="auto">Si no sabes cómo obtener tu clave para la API de Youtube puedes leer <a href="https://www.webempresa.com/blog/como-obtener-la-api-key-de-youtube-sin-aburrirse-en-el-proceso.html" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">este artículo. <pre><code>class YoutubeApi(object): def __init__(self, API_KEY): self.api_key = API_KEY def _openURL(self, url, parms): from urllib.request import urlopen from urllib.parse import urlencode f = urlopen(url + '?' + urlencode(parms)) data = f.read() f.close() matches = data.decode("utf-8") return matches <p dir="auto">El parámetro <code>url tomará la url base de la llamada y <code>parms será un diccionario con los parámetros de la llamada. La función urlencode se encarga de formatear la parte de los parámetros. <blockquote> <p dir="auto">Si no entiendes qué significa pasar parámetros a una URL puedes leer <a href="https://www.sistrix.es/preguntale-a-sistrix/optimizacion-onpage/cual-es-la-diferencia-entre-un-url-dominio-subdominio-hostname-etc/" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">este artículo. <h3>Los métodos <p dir="auto">Entonces comenzamos a añadir la funcionalidad a nuestro objeto. Para empezar vamos a crear un método que tome el ID de un canal de Youtube y nos devuelva la información de tantos vídeos de un canal como máximo le indiquemos. <pre><code> def channel_videos(self, channel_id, max_res=50): ''' Toma una id de canal y devuelve todos los vídeos con su información en un diccionario. Se le puede pasar un número para indicar el límite máximo de resultados''' from json import loads parms = { 'part': 'id,snippet', 'channelId': channel_id, 'maxResults': max_res, 'key': self.api_key } matches = self._openURL(YOUTUBE_SEARCH_URL, parms) search_response = loads(matches) videos = [] for search_result in search_response.get('items', []): if search_result["id"]["kind"] == "youtube#video": videos.append(search_result['snippet']) return videos <p dir="auto">Lo que hace el método anterior es crear un diccionario de parámetros para la llamada. Luego llamamos a la función que creamos antes y le pasamos la URL base y los parámetros. <blockquote> <p dir="auto">Para acceder a todos los posibles parámetros podemos ir a la <a href="https://developers.google.com/youtube/v3/docs/?hl=es-419" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">documentación de la API de Youtube. <p dir="auto">Luego lo cargamos en JSON gracias a la función <code>loads que importamos al principio y de los resultados obtenidos rescatamos los que son del tipo <code>"youtube#video" mediante un bucle. <hr /> <h3>Construyendo las llamadas <p dir="auto">Si somos capaces de entender este tipo de código, podemos crear el resto de llamadas fácilmente. Aquí puedes ver todas las que he diseñado yo: <p dir="auto"><center><span><img src="https://images.hive.blog/768x0/https://s14.postimg.org/ahrsr0v41/metodos_api.png" srcset="https://images.hive.blog/768x0/https://s14.postimg.org/ahrsr0v41/metodos_api.png 1x, https://images.hive.blog/1536x0/https://s14.postimg.org/ahrsr0v41/metodos_api.png 2x" /> <h5><center>Puedes ver el código completo <a href="https://github.com/mondeja/megacurso_python/blob/master/packages/video/youtube.py" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">desde aquí <hr /> <h4>Contáctame <p dir="auto">Cualquier duda o sugerencia házmelo saber en un comentario o envíame un correo a mondejar1994@gmail.com. ¡Un saludo y hasta la próxima!
Sort:  

Buen post! He escuchado mucho sobre python...

No me queda muy claro qué hace o qué es snippet. Podrías aclararlo?

<p dir="auto">Y tengo otra duda, yo personalmente suelo hacer los <code>import de manera global al principio del documento, por qué prefieres hacerlo dentro de la definición de los métodos? Es sólo costumbre, o existe alguna ventaja? :) <p dir="auto">Excelente post, me gusta tu contenido!

Hola me alegro de que te guste. Snippet significa "fragmento", es el diccionario donde la API de youtube trae la parte de información del elemento que estés buscando. Entiendo que es una buena práctica hacer las importaciones locales para cada función para que así sólo se importe la parte de las bilibotecas que vayas a usar en ese momento y consumes menos memoria. Un saludo!

me interesa aprender Python.. te sigo..