Besoin de migrer des images de la communauté Zendesk vers Discourse ? Voici un script Python !
Salut tout le monde,
J’ai travaillé sur la migration d’une communauté Zendesk vers Discourse et j’ai rencontré un problème frustrant : l’exportation d’images depuis Zendesk. Le problème ? Le CDN de Zendesk commence à bloquer l’accès après avoir récupéré quelques images directement, ce qui rend le téléchargement en masse un véritable défi.
Après avoir essayé plusieurs approches, j’ai fini par créer un script Python (avec l’aide de l’IA) qui contourne cette limitation. Le script utilise Selenium pour ouvrir chaque URL d’image dans un navigateur, prend une capture d’écran de l’image et l’enregistre localement. Ce n’est pas aussi propre que de télécharger directement les images, mais cela fonctionne de manière fiable et les images sont de haute qualité.
Si vous êtes confronté à une migration similaire, j’espère que cela vous aidera !
Ce dont vous aurez besoin
- Python : Installé et prêt à l’emploi.
- ChromeDriver :
Téléchargez-le depuis Chrome for Testing, extrayez-le et mettez à jour le script avec le chemin de votre pilote. - Fichier CSV :
- Créez un fichier CSV avec une colonne nommée
URL. - Remplissez-le avec les URL directes des images que vous souhaitez exporter depuis Zendesk.
- Mettez à jour le script avec le chemin de ce fichier.
- Créez un fichier CSV avec une colonne nommée
- Un emplacement de sauvegarde :
Mettez à jour le script avec le chemin du dossier où vous souhaitez que les images soient enregistrées.
Enfin, vous devrez installer quelques bibliothèques Python :
pip install selenium pillow
Le Script
Voici le script Python. N’hésitez pas à le modifier pour l’adapter à votre configuration :
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
# Fonction pour extraire l'ID de l'image de l'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'
# Fonction pour télécharger et enregistrer une image depuis une URL
def download_image(driver, image_url, download_folder):
driver.get(image_url)
# Attendre que l'image se charge
wait = WebDriverWait(driver, 20)
img_element = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'img')))
# Obtenir l'emplacement et la taille de l'élément image
location = img_element.location
size = img_element.size
# Prendre une capture d'écran de la page entière
screenshot = driver.get_screenshot_as_png()
# Convertir la capture d'écran en image PIL
screenshot_image = Image.open(io.BytesIO(screenshot))
# Définir la boîte englobante pour l'image (gauche, haut, droite, bas)
left = location['x']
top = location['y']
right = left + size['width']
bottom = top + size['height']
bbox = (left, top, right, bottom)
# Recadrer l'image selon la boîte englobante
cropped_image = screenshot_image.crop(bbox)
# Extraire l'ID de l'image de l'URL
image_id = extract_image_id(image_url)
# Enregistrer l'image recadrée avec l'ID de l'image comme nom de fichier dans le dossier de téléchargement
cropped_image.save(os.path.join(download_folder, f'{image_id}.png'))
# Fonction pour charger les URL depuis un fichier 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']) # En supposant que le CSV a des colonnes 'id' et 'url'
return urls
# Configuration du service ChromeDriver
service = Service("C:\\Users\\tslam\\Downloads\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe")
driver = webdriver.Chrome(service=service)
try:
# Maximiser la fenêtre du navigateur en plein écran
driver.maximize_window()
# Charger les URL depuis le fichier CSV
csv_file = 'C:\\Users\\tslam\\Zendesk Migration\\image_urls.csv'
image_urls = load_urls_from_csv(csv_file)
# Définir le chemin du dossier de téléchargement
download_folder = 'C:\\Users\\tslam\\Zendesk Migration\\downloads'
# S'assurer que le dossier de téléchargement existe
if not os.path.exists(download_folder):
os.makedirs(download_folder)
# Traiter chaque URL d'image
for url in image_urls:
download_image(driver, url, download_folder)
finally:
driver.quit()