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
- Python: Instalado e pronto para usar.
- ChromeDriver:
Baixe-o em Chrome for Testing, extraia-o e atualize o script com o caminho para o seu driver. - 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.
- Crie um arquivo CSV com uma coluna chamada
- 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()