Script en Python para exportar imágenes desde la Comunidad de Zendesk

¿Necesitas migrar imágenes de Zendesk Community a Discourse? ¡Aquí tienes un script de Python!

Hola a todos,

He estado trabajando en la migración de una comunidad de Zendesk a Discourse y me encontré con un problema frustrante: exportar imágenes de Zendesk. ¿El problema? La CDN de Zendesk comienza a bloquear el acceso después de recuperar algunas imágenes directamente, lo que hace que la descarga masiva sea un verdadero desafío.

Después de probar varios enfoques, terminé creando un script de Python (con algo de ayuda de la IA) que sortea esta limitación. El script utiliza Selenium para abrir cada URL de imagen en un navegador, toma una captura de pantalla de la imagen y la guarda localmente. No es tan limpio como descargar las imágenes directamente, pero funciona de manera confiable y las imágenes salen con alta calidad.

Si te enfrentas a una migración similar, ¡espero que esto te ayude!


Lo que necesitarás

  1. Python: Instalado y listo para usar.
  2. ChromeDriver:
    Descárgalo desde Chrome for Testing, extráelo y actualiza el script con la ruta de tu driver.
  3. Archivo CSV:
    • Crea un archivo CSV con una columna llamada URL.
    • Rellénalo con las URL directas de las imágenes que deseas exportar desde Zendesk.
    • Actualiza el script con la ruta de este archivo.
  4. Una ubicación para guardar:
    Actualiza el script con la ruta de la carpeta donde deseas que se guarden las imágenes.

Por último, necesitarás instalar un par de bibliotecas de Python:

pip install selenium pillow

El Script

Aquí tienes el script de Python. Siéntete libre de modificarlo para adaptarlo a tu configuración:

import csv
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from PIL import Image
import io
import re
import os

# Función para extraer el ID de la imagen de la URL
def extract_image_id(url):
    match = re.search(r'/([^/]+)\.(png|jpg|jpeg|gif)$', url, re.IGNORECASE)
    if match:
        return match.group(1)
    return 'image'

# Función para descargar y guardar una imagen desde una URL
def download_image(driver, image_url, download_folder):
    driver.get(image_url)
    
    # Esperar a que la imagen se cargue
    wait = WebDriverWait(driver, 20)
    img_element = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'img')))

    # Obtener la ubicación y el tamaño del elemento de la imagen
    location = img_element.location
    size = img_element.size

    # Tomar una captura de pantalla de toda la página
    screenshot = driver.get_screenshot_as_png()
    
    # Convertir la captura de pantalla a imagen PIL
    screenshot_image = Image.open(io.BytesIO(screenshot))

    # Definir el cuadro delimitador para la imagen (izquierda, arriba, derecha, abajo)
    left = location['x']
    top = location['y']
    right = left + size['width']
    bottom = top + size['height']
    bbox = (left, top, right, bottom)

    # Recortar la imagen al cuadro delimitador
    cropped_image = screenshot_image.crop(bbox)

    # Extraer el ID de la imagen de la URL
    image_id = extract_image_id(image_url)

    # Guardar la imagen recortada con el ID de la imagen como nombre de archivo en la carpeta de descarga
    cropped_image.save(os.path.join(download_folder, f'{image_id}.png'))

# Función para cargar URLs desde un archivo CSV
def load_urls_from_csv(csv_file):
    urls = []
    with open(csv_file, mode='r', newline='', encoding='utf-8') as file:
        reader = csv.DictReader(file)
        for row in reader:
            urls.append(row['URL'])  # Asumiendo que el CSV tiene columnas 'id' y 'url'
    return urls

# Configurar el servicio de ChromeDriver
service = Service("C:\\Users\\tslam\\Downloads\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe")
driver = webdriver.Chrome(service=service)

try:

    # Maximizar la ventana del navegador a pantalla completa
    driver.maximize_window()
    
    # Cargar las URLs desde el archivo CSV
    csv_file = 'C:\\Users\\tslam\\Zendesk Migration\\image_urls.csv'
    image_urls = load_urls_from_csv(csv_file)
    
    # Definir la ruta de la carpeta de descarga
    download_folder = 'C:\\Users\\tslam\\Zendesk Migration\\downloads'
    
    # Asegurarse de que la carpeta de descarga exista
    if not os.path.exists(download_folder):
        os.makedirs(download_folder)

    # Procesar cada URL de imagen
    for url in image_urls:
        download_image(driver, url, download_folder)

finally:
    driver.quit()

6 Me gusta

¡Genial! Esto podría incluso usarse para otras migraciones que enfrentan el mismo problema, no solo Zendesk. Muchas gracias por compartir.

3 Me gusta