Este blog post fue creado de manera automatica utilizando Python y el poder de Azure AI Text Translator.
La traducción y publicación de contenido en diferentes plataformas puede ser un proceso tedioso y que consume bastante tiempo. Sin embargo, gracias a los avances en la inteligencia artificial y el desarrollo de software, este proceso puede automatizarse. En este artículo, exploraremos cómo la integración de Azure AI para la traducción de textos y la automatización de publicaciones en Medium con Python.
Esto surge de una necesidad personal, ya que actualmente estoy publicando contenido de IT tanto en español (en este blog) como en ingles (en en.multiclouds.tech, mi blog de Medium). Luego de realizar este proceso de manera manual algunas veces comencé a pensar en automatizarlo. Para esto comencé a explorar una solución utilizando Python y Azure AI.
Aunque se trata de un Work In Progress, el llegado a una solución bastante solida para automatizar casi el %100 del proceso.
Aquí el repositorio: (aún no tiene configurado el pasaje automatico de Links, ¡ja! , pronto incorporaré esta funcionalidad).
https://github.com/mdiloreto/translate-blog-html-and-post-to-medium
El repo
Este proyecto, llamado “translate-blog-html-and-post-to-medium”, automatiza la traducción de publicaciones de blogs en HTML y su publicación en Medium. Su objetivo es ayudar a los bloggers y creadores de contenido a alcanzar una audiencia más amplia traduciendo y publicando sus blogs en diferentes idiomas.
Características
- Extrae contenido HTML de una publicación de blog especificada.
- Traduce el contenido utilizando los servicios de Traducción de Azure AI.
- Convierte el contenido traducido al formato Markdown.
- Publica la entrada traducida en Medium como borrador.
Traducir HTML de Blog y Publicar en Medium
Descripción
Este proyecto, llamado “translate-blog-html-and-post-to-medium”, automatiza la traducción de publicaciones de blogs en HTML y su publicación en Medium. Su objetivo es ayudar a los bloggers y creadores de contenido a alcanzar una audiencia más amplia traduciendo y publicando sus blogs en diferentes idiomas.
Características
- Extrae contenido HTML de una publicación de blog especificada.
- Traduce el contenido utilizando los servicios de Traducción de Azure AI.
- Convierte el contenido traducido al formato Markdown.
- Publica la entrada traducida en Medium como borrador.
Prerrequisitos
- Python 3.x
- Clave y Endpoint de API de Traducción de Azure AI
- Token de acceso a la API de Medium
Instalación
Clona el repositorio:
git clone https://github.com/mdiloreto/translate-blog-html-and-post-to-medium
Navegar al directorio:
cd translate-blog-html-and-post-to-medium
Instala las dependencias:
pip install -r requirements.txt
Uso
Establece la URL en el archivo `main.py
` en la línea #16:
scraper = Scraper('https://madsblog.net/2023/11/24/storage-persistente-en-gke/') # <<<<< <<<<<<<<< ESTABLECE LA URL
Establece las variables de entorno necesarias para Azure AI y los tokens de la API de Medium.
$env:AZUREAI_ENDPOINT='<TU_ENDPOINT_AZUREAI>' $env:AZUREAI_CREDENTIAL='<TU_CREDENCIAL_AZUREAI>' $env:MEDIUM_ACCESS_TOKEN='<TU_TOKEN_ACCESSO_MEDIUM>'
Luego, ejecuta el script main.py
:
python main.py
Traducción con Azure Text Translator
En esta publicación no nos enfocaremos en cada una de las partes del codigo, pero si le daremos un vistazo al codigo utilizado para realizar al traducción con Azure Text Translator:
from azure.ai.translation.document import DocumentTranslationClient
from azure.core.credentials import AzureKeyCredential
import requests, uuid, json
class Translator:
def __init__(self, endpoint, key):
self.endpoint = endpoint # Store the endpoint as an instance variable
self.key = key # Store the key as an instance variable
self.client = DocumentTranslationClient(endpoint, AzureKeyCredential(key))
def translate(self, text):
# Your code to translate text
location = "eastus"
path = '/translate'
constructed_url = self.endpoint + path
params = {
'api-version': '3.0',
'from': 'es',
'to': ['en']
}
headers = {
'Ocp-Apim-Subscription-Key': self.key,
'Ocp-Apim-Subscription-Region': location,
'Content-type': 'application/json',
'X-ClientTraceId': str(uuid.uuid4())
}
# You can pass more than one object in body.
body = [{
'text': text
}]
try:
request = requests.post(constructed_url, params=params, headers=headers, json=body)
request.raise_for_status() # Raise exception for HTTP errors
response = request.json()
# Assuming response contains the translated text
return response[0]['translations'][0]['text']
except Exception as e:
print(f"Error during translation: {e}")
return None
1. Clase Translator
: Define una clase en Python para manejar la traducción de textos.
2. Importaciones de Azure AI y Utilidades: Utiliza bibliotecas de Azure AI (DocumentTranslationClient
, AzureKeyCredential
) y módulos estándar de Python (requests
, uuid
, json
) para realizar operaciones de red y manejo de datos.
3. Constructor __init__
: Inicializa la clase con variables para el endpoint y la clave de Azure AI, y crea una instancia de DocumentTranslationClient
para la interacción con Azure AI.
4. Método translate
:
- Construye la URL para la API de Azure AI.
- Prepara los parámetros y encabezados del request HTTP, incluye la versión de la API, el idioma idiomas de origen y destino, la clave de suscripción, y un identificador único para la traza del cliente.
- Realiza una petición POST para traducir el texto, manejando la respuesta y errores posibles.
5. Manejo de Respuestas y Excepciones: Convierte la respuesta JSON en texto traducido y maneja las excepciones para asegurar la robustez del código.
Esta clase es llamada desde el archivo principal main.py
:
from translator_azureai import Translator
## ...
## ...... resto del codigo .... #####
## ...
# Check Enviroment Variables
if not endpoint:
raise ValueError("No endpoint found in environment variables")
if not credential:
raise ValueError("No credential found in environment variables")
# Initialize Translator
translator = Translator(endpoint, credential)
# Translate Content
content_en = []
print("Translation in progress...")
for element in content:
if element['type'] != 'image': # Skip translation for images
translated_text = translator.translate(element['content'])
content_en.append({'type': element['type'], 'content': translated_text})
else:
content_en.append(element) # Add images as-is
print("Translation finished...")
print("Showing translation...")
for element in content_en:
print(f"{element['type']}: {element['content']}\n")
Este fragmento de código realiza las siguientes operaciones:
1. Verificación de Variables de Entorno: Comprueba si las variables endpoint
y credential
están definidas. Si no están presentes, se levanta un error.
2. Inicialización del Traductor: Crea una instancia de la clase Translator
usando las variables endpoint
y credential
.
3. Traducción del Contenido: Recorre una lista de elementos de contenido (content
), traduce cada elemento que no sea una imagen usando el traductor creado, y agrega los resultados a una nueva lista (content_en
).
4. Visualización de Resultados: Imprime el contenido traducido, mostrando tanto el tipo de elemento como su contenido traducido.
Publicación a Medium
Para la publicación a Medium utilizamos la Medium API.
import requests
class MediumPublisher:
def __init__(self, access_token):
self.base_url = "https://api.medium.com/v1"
self.headers = {
"Authorization": f"Bearer {access_token}",
"Content-Type": "application/json",
"Accept": "application/json"
}
def create_post(self, user_id, title, content,):
url = f"{self.base_url}/users/{user_id}/posts"
data = {
"title": title,
"contentFormat": "markdown",
"content": content,
"tags": [],
"publishStatus": "draft"
}
response = requests.post(url, json=data, headers=self.headers)
return response.json()
def get_user_id(self):
url = f"{self.base_url}/me"
response = requests.get(url, headers=self.headers)
return response.json().get("data").get("id")
El código define la clase MediumPublisher
para publicar contenido en Medium usando su API:
1. Inicialización: La clase se inicializa con un token de acceso y prepara los encabezados necesarios para las solicitudes HTTP a la API de Medium.
2. Publicación de Contenidos:
create_post
: Publica un nuevo artículo en Medium. Toma el ID del usuario, el título y el contenido del artículo, y lo envía a Medium mediante una solicitud POST.- La publicación se crea en formato Markdown y se establece como borrador.
3. Obtención de ID de Usuario:
get_user_id
: Obtiene el ID del usuario de Medium a través de una solicitud GET a la API.
Esta clase es llamada desde el archivo principal main.py
:
from publish_medium import MediumPublisher
## ...
## ...... resto del codigo .... #####
## ...
# Medium publish
print("Initializing Medium posting...")
access_token = os.getenv('MEDIUM_ACCESS_TOKEN')
if not access_token:
raise ValueError("No Medium access token found in environment variables")
Medium_publisher = MediumPublisher(access_token)
# Get content for the file
with open("C:\\Users\\mateo\\OneDrive\\vscode\\py-chatgpt-translate-webpost\\output.md", "r", encoding="utf-8") as file:
file_content = file.read()
markdown_file_path = 'C:\\Users\\mateo\\OneDrive\\vscode\\py-chatgpt-translate-webpost\\output.md'
# Prepare Medium publish
user_id = Medium_publisher.get_user_id()
title = ""
for element in content_en:
if element['type'] == 'title':
title = element['content']
break
print("Posting content to Medium as Draft...")
# Publish
post = Medium_publisher.create_post(user_id, title, file_content)
print("Medium post draft was created sucessfully!")
1. Inicialización de la Publicación en Medium: Comienza con un mensaje que indica que se está inicializando la publicación en Medium.
2. Obtención del Token de Acceso: Recupera el token de acceso de Medium desde las variables de entorno. Si no encuentra el token, genera un error.
3. Creación de una Instancia para Publicar en Medium: Crea una instancia de MediumPublisher
utilizando el token de acceso.
4. Lectura del Contenido del Archivo: Abre y lee el contenido del archivo Markdown (output.md
) que se va a publicar.
5. Obtención del ID de Usuario en Medium: Utiliza la instancia creada para obtener el ID del usuario en Medium.
6. Determinación del Título del Artículo: Recorre los elementos del contenido traducido (content_en
) para encontrar y asignar el título del artículo.
7. Publicación en Medium: Llama al método create_post
de la instancia de MediumPublisher
para publicar el contenido leído como un borrador en Medium, utilizando el ID de usuario y el título obtenidos.
8. Confirmación de Publicación: Imprime un mensaje indicando que el borrador de la publicación se creó con éxito en Medium.
Leave a Reply