Megacurso programación en Python3 | 3. Cómo publicar en Steemit desde Github

in #steemit7 years ago (edited)

Esta vez vamos a aprender cómo publicar un artículo en Steemit escribiéndolo desde el editor de texto de Github. Para ello, vamos a construir código jugando con las APIs de Steemit y de Github.

<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/publisher" 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 /> <p dir="auto">Lo que haremos será crear este mismo artículo que estás leyendo en Github como un proyecto <code>.md (markdown), y lo subiremos a Steemit mediante el código que diseñaremos. <p dir="auto"><center><span><img src="https://images.hive.blog/768x0/https://s3.postimg.org/q0f8sw7bn/metarticulo.png" srcset="https://images.hive.blog/768x0/https://s3.postimg.org/q0f8sw7bn/metarticulo.png 1x, https://images.hive.blog/1536x0/https://s3.postimg.org/q0f8sw7bn/metarticulo.png 2x" /> <h2>API Wrappers <p dir="auto">Lo primero será instalar las envolturas. Ejecutamos: <pre><code>pip3 install uritemplate pip3 install --pre github3.py git clone https://github.com/xeroc/piston-lib/ cd piston-lib python3 setup.py install --user <blockquote> <p dir="auto"><a href="https://github3py.readthedocs.io/en/master/" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Documentación de github3 - <a href="https://github.com/xeroc/piston-lib" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">Repositorio de piston-lib <hr /> <h2>Extraer el contenido de Github <p dir="auto">El siguiente paso será extraer el código de un archivo de nuestra carpeta de Github. Para ello, vamos a utilizar la biblioteca github3: <pre><code># Introduce here your Github username and password GITHUB_USERNAME = '' GITHUB_PASSWORD = '' # Introduce here your Steemit username and keys STEEMIT_ACCOUNT_NAME = '' STEEMIT_POSTING_KEY = '' # Global imports import github3 git = github3.login(GITHUB_USERNAME, GITHUB_PASSWORD) from piston.steem import Steem wif = {"posting": STEEMIT_POSTING_KEY'} steem = Steem(nobroadcast=True, keys=wif) # ------------------------------------------------- def get_code(username, repo, filepath): # Devuelve el contenido del archivo del repo indicado repository_selected = git.repository(username, repo) content = repository_selected.file_contents(filepath) try: response = content.__dict__['decoded'].decode('utf-8') except KeyError: message='El archivo {} no existe en el repositorio' print(message.format(path)) return None else: return response <blockquote> <p dir="auto">Todo el código compartido se encuentra en <a href="https://github.com/mondeja/megacurso_python/blob/master/packages/publisher/publisher.py" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">este archivo. <p dir="auto">Introducimos nuestro usuario y contraseña de github, nos logueamos en la API y creamos una función que nos devuelve el contenido de un fichero de un usuario. En ella seleccionamos un repositorio de un usuario con <code>repository y con <code>file_contents(filepath) extraemos el contenido de un archivo. Como este viene en un objeto <code>Content, extraemos sus datos con el método <code>__dict__, y de ellos el parámetro <code>decoded del diccionario para extraer el contenido descodificado. Para rematar, lo descodificamos en <code>utf-8 para que no nos dé problemas. <p dir="auto">Si salta un <code>KeyError significa que no ha podido extraer nada del diccionario porque no existe un archivo con ese nombre. Si no, retornamos el código. <hr /> <h2>Procesar el código <h4>Extraer las imágenes <p dir="auto">Ahora vamos a extraer las urls de las imágenes del artículo para luego poder mostrarlas en Steemit centradas. Para ello utilizaremos la bilioteca de expresiones regulares de Python3, regex. <blockquote> <p dir="auto">Es importante que las rutas de las imágenes de los artículos estén <a href="http://postimages.org/" target="_blank" rel="nofollow noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">alojadas en la nube, no tengan una dirección local a una carpeta de github del mismo proyecto, si no no se mostrarán en Steemit. <p dir="auto">Creamos la siguiente función: <pre><code>def extract_url_images(code): from re import findall extensions = ('png', 'jpg', 'bmp', 'gif', 'jpeg') images = [] urls = findall(r'http.*\.[png|jpg|jpeg|bmp|gif]*', code) print(urls) for u in urls: if u[-3:] in extensions: images.append(u) return images <p dir="auto">Tomamos como parámetro el código que hemos extraído, importamos <code>findall para buscar todas las coincidencias de un patrón y creamos una tupla con extensiones de imágenes. Entonces buscamos todos los patrones que empiecen con <code>'http' y terminen con una extensión de imagen, y de ellos nos quedamos con los que tienen una de las extensiones al final, para asegurarnos acertar. <blockquote> <p dir="auto"><a href="https://docs.python.org/3/library/re.html" 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 regex, para expresiones regulares en python. <h4>Centrar las imágenes en Steemit <blockquote> <p dir="auto">Al publicar un artículo en Steemit podemos centrar las imágenes usando las etiquetas HTML <code><center></center>. Sin embargo, en Github no funciona esto. <p dir="auto">En lugar de escribir en Github las etiquetas, que luego no se renderizan y nos afectan en la legibilidad de nuestro artículo, vamos a centrar todas las imágenes automáticamente por defecto al publicar en Steemit. Creamos una última función de apoyo: <pre><code>def center_images(image_urls_list, code): from re import sub for i in image_urls: code = sub(r'![[].*[]][(]' + i + '[)]', '<center>' + i + '</center>', code) return code <p dir="auto">Le pasamos la lista de urls y el código del artículo, para, usando la función <code>sub de regex, substituir el código url de una imagen en Github (de este estilo: <code><center>https://s3.postimg.org/q0f8sw7bn/metarticulo.png</center>) a su versión simplificada y centrada en Steemit (<code><center>https://s3.postimg.org/q0f8sw7bn/metarticulo.png</center>). <hr /> <h2>Crear un publicador <p dir="auto">Ya podemos crear un objeto que nos permita publicar un artículo en Steemit desde nuestro repositorio en Github. Para ello, debajo del código hasta ahora creamos una clase <code>Publisher: <pre><code>class Publisher(object): def __init__(self, repo, filepath, git_user=GITHUB_USERNAME, verbose=False): self.git_user = git_user self.repo = repo self.filepath = filepath self.verbose = verbose def github_to_steem(self, title, tags=[], image_center=True) # Primero extraemos el código del archivo de github code = get_code(self.git_user, self.repo, self.filepath) if code: # Extraemos las urls de las imágenes del contenido image_urls = extract_url_images(code) # Centramos las imágenes en Steemit if image_center == True: code = center_images(image_urls, code) if self.verbose == True: print(code) # Publicamos en Steemit meta = {'allow_votes': True, 'allow_curation_rewards': True, 'percent_steem_dollars': 10000} steem.post(title, code, author=STEEMIT_ACCOUNT_NAME, tags=tags, meta=meta) <blockquote> <p dir="auto">Esta sería la llamada que voy a realizar para publicar este artículo:<br /> <center><span><img src="https://images.hive.blog/768x0/https://s12.postimg.org/v2m4knevx/codigo_publicar.png" srcset="https://images.hive.blog/768x0/https://s12.postimg.org/v2m4knevx/codigo_publicar.png 1x, https://images.hive.blog/1536x0/https://s12.postimg.org/v2m4knevx/codigo_publicar.png 2x" /> <p dir="auto">Al instanciar la clase indicamos el repositorio y el path al archivo que queremos publicar en Steemit. <blockquote> <p dir="auto">Cambiando el parámetros <code>verbose a <code>True y comentando la última línea, podemos ver el resultado antes de publicarlo: <p dir="auto"><center><span><img src="https://images.hive.blog/768x0/https://s12.postimg.org/qlmx73t59/codigo_publicar2.png" srcset="https://images.hive.blog/768x0/https://s12.postimg.org/qlmx73t59/codigo_publicar2.png 1x, https://images.hive.blog/1536x0/https://s12.postimg.org/qlmx73t59/codigo_publicar2.png 2x" /> <p dir="auto">Tú mism@ puedes adaptar el programa a tus necesidades. ¡Un saludo y hasta la próxima!