Necessità di migrare immagini da Zendesk Community a Discourse? Ecco uno script Python!
Ciao a tutti,
Ho lavorato alla migrazione di una Zendesk Community a Discourse e mi sono imbattuto in un problema frustrante: l’esportazione di immagini da Zendesk. Il problema? Il CDN di Zendesk inizia a bloccare l’accesso dopo aver recuperato alcune immagini direttamente, rendendo il download in blocco una vera sfida.
Dopo aver provato diversi approcci, ho finito per creare uno script Python (con l’aiuto dell’AI) che aggira questa limitazione. Lo script utilizza Selenium per aprire ogni URL dell’immagine in un browser, cattura uno screenshot dell’immagine e lo salva localmente. Non è elegante come scaricare direttamente le immagini, ma funziona in modo affidabile e le immagini risultano di alta qualità.
Se stai affrontando una migrazione simile, spero che questo ti sia d’aiuto!
Cosa ti serve
- Python: Installato e pronto all’uso.
- ChromeDriver:
Scaricatelo da Chrome for Testing, estraetelo e aggiornate lo script con il percorso del vostro driver. - File CSV:
- Create un file CSV con una colonna denominata
URL. - Popolatelo con gli URL diretti delle immagini che volete esportare da Zendesk.
- Aggiornate lo script con il percorso di questo file.
- Create un file CSV con una colonna denominata
- Una posizione di salvataggio:
Aggiornate lo script con il percorso della cartella in cui volete salvare le immagini.
Infine, dovrete installare un paio di librerie Python:
pip install selenium pillow
Lo Script
Ecco lo script Python. Sentitevi liberi di modificarlo per adattarlo alla vostra configurazione:
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
# Funzione per estrarre l'ID dell'immagine dall'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'
# Funzione per scaricare e salvare un'immagine da un URL
def download_image(driver, image_url, download_folder):
driver.get(image_url)
# Attendi il caricamento dell'immagine
wait = WebDriverWait(driver, 20)
img_element = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'img')))
# Ottieni la posizione e le dimensioni dell'elemento immagine
location = img_element.location
size = img_element.size
# Scatta uno screenshot dell'intera pagina
screenshot = driver.get_screenshot_as_png()
# Converti lo screenshot in un'immagine PIL
screenshot_image = Image.open(io.BytesIO(screenshot))
# Definisci il riquadro di delimitazione per l'immagine (sinistra, sopra, destra, sotto)
left = location['x']
top = location['y']
right = left + size['width']
bottom = top + size['height']
bbox = (left, top, right, bottom)
# Ritaglia l'immagine nel riquadro di delimitazione
cropped_image = screenshot_image.crop(bbox)
# Estrai l'ID dell'immagine dall'URL
image_id = extract_image_id(image_url)
# Salva l'immagine ritagliata con l'ID dell'immagine come nome del file nella cartella di download
cropped_image.save(os.path.join(download_folder, f'{image_id}.png'))
# Funzione per caricare gli URL da un file 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']) # Si presume che il CSV abbia le colonne 'id' e 'url'
return urls
# Imposta il servizio ChromeDriver
service = Service("C:\\Users\\tslam\\Downloads\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe")
driver = webdriver.Chrome(service=service)
try:
# Massimizza la finestra del browser a schermo intero
driver.maximize_window()
# Carica gli URL dal file CSV
csv_file = 'C:\\Users\\tslam\\Zendesk Migration\\image_urls.csv'
image_urls = load_urls_from_csv(csv_file)
# Definisci il percorso della cartella di download
download_folder = 'C:\\Users\\tslam\\Zendesk Migration\\downloads'
# Assicurati che la cartella di download esista
if not os.path.exists(download_folder):
os.makedirs(download_folder)
# Elabora ogni URL dell'immagine
for url in image_urls:
download_image(driver, url, download_folder)
finally:
driver.quit()