Script em Python para exportar imagens da Zendesk Community

Precisa Migrar Imagens do Zendesk Community para o Discourse? Aqui está um Script Python!

Olá a todos,

Estive trabalhando na migração de uma Comunidade Zendesk para o Discourse e me deparei com um problema frustrante: exportar imagens do Zendesk. O problema? O CDN do Zendesk começa a bloquear o acesso após recuperar algumas imagens diretamente, tornando o download em massa um verdadeiro desafio.

Depois de tentar várias abordagens, acabei criando um script Python (com alguma ajuda da IA) que contorna essa limitação. O script usa o Selenium para abrir cada URL de imagem em um navegador, tirar uma captura de tela da imagem e salvá-la localmente. Não é tão limpo quanto baixar as imagens diretamente, mas funciona de forma confiável e as imagens saem em alta qualidade.

Se você está lidando com uma migração semelhante, espero que isso ajude!


O que Você Vai Precisar

  1. Python: Instalado e pronto para usar.
  2. ChromeDriver:
    Baixe-o em Chrome for Testing, extraia-o e atualize o script com o caminho para o seu driver.
  3. Arquivo CSV:
    • Crie um arquivo CSV com uma coluna chamada URL.
    • Preencha-o com os URLs diretos das imagens que você deseja exportar do Zendesk.
    • Atualize o script com o caminho para este arquivo.
  4. Um Local para Salvar:
    Atualize o script com o caminho da pasta onde você deseja que as imagens sejam salvas.

Por último, você precisará instalar algumas bibliotecas Python:

pip install selenium pillow

O Script

Aqui está o script Python. Sinta-se à vontade para ajustá-lo para se adequar à sua configuração:

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

# Função para extrair o ID da imagem da 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'

# Função para baixar e salvar uma imagem de uma URL
def download_image(driver, image_url, download_folder):
    driver.get(image_url)
    
    # Aguarda a imagem carregar
    wait = WebDriverWait(driver, 20)
    img_element = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'img')))

    # Obtém a localização e o tamanho do elemento da imagem
    location = img_element.location
    size = img_element.size

    # Tira uma captura de tela da página inteira
    screenshot = driver.get_screenshot_as_png()
    
    # Converte a captura de tela para imagem PIL
    screenshot_image = Image.open(io.BytesIO(screenshot))

    # Define a caixa delimitadora para a imagem (esquerda, topo, direita, inferior)
    left = location['x']
    top = location['y']
    right = left + size['width']
    bottom = top + size['height']
    bbox = (left, top, right, bottom)

    # Corta a imagem para a caixa delimitadora
    cropped_image = screenshot_image.crop(bbox)

    # Extrai o ID da imagem da URL
    image_id = extract_image_id(image_url)

    # Salva a imagem cortada com o ID da imagem como nome do arquivo na pasta de download
    cropped_image.save(os.path.join(download_folder, f'{image_id}.png'))

# Função para carregar URLs de um arquivo 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'])  # Assumindo que o CSV tem colunas 'id' e 'url'
    return urls

# Configura o serviço do ChromeDriver
service = Service("C:\\Users\\tslam\\Downloads\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe")
driver = webdriver.Chrome(service=service)

try:

    # Maximiza a janela do navegador para tela cheia
    driver.maximize_window()
    
    # Carrega URLs do arquivo CSV
    csv_file = 'C:\\Users\\tslam\\Zendesk Migration\\image_urls.csv'
    image_urls = load_urls_from_csv(csv_file)
    
    # Define o caminho da pasta de download
    download_folder = 'C:\\Users\\tslam\\Zendesk Migration\\downloads'
    
    # Garante que a pasta de download exista
    if not os.path.exists(download_folder):
        os.makedirs(download_folder)

    # Processa cada URL de imagem
    for url in image_urls:
        download_image(driver, url, download_folder)

finally:
    driver.quit()

6 curtidas

Legal! Isso poderia até ser usado para outras migrações que enfrentam o mesmo problema, não apenas o Zendesk. Muito obrigado por compartilhar.

3 curtidas