Bilder von Zendesk Community nach Discourse migrieren? Hier ist ein Python-Skript!
Hallo zusammen,
ich habe daran gearbeitet, eine Zendesk Community nach Discourse zu migrieren und bin auf ein frustrierendes Problem gestoßen: das Exportieren von Bildern aus Zendesk. Das Problem? Zendesks CDN beginnt nach dem Abrufen einiger Bilder den Zugriff zu blockieren, was den Massendownload zu einer echten Herausforderung macht.
Nachdem ich mehrere Ansätze ausprobiert hatte, habe ich schließlich ein Python-Skript (mit etwas Hilfe von KI) erstellt, das diese Einschränkung umgeht. Das Skript verwendet Selenium, um jede Bild-URL in einem Browser zu öffnen, macht einen Screenshot des Bildes und speichert ihn lokal. Es ist nicht so elegant wie das direkte Herunterladen der Bilder, aber es funktioniert zuverlässig und die Bilder haben eine hohe Qualität.
Wenn Sie eine ähnliche Migration durchführen, hoffe ich, dass Ihnen dies weiterhilft!
Was Sie benötigen
- Python: Installiert und einsatzbereit.
- ChromeDriver:
Laden Sie es von Chrome for Testing herunter, entpacken Sie es und aktualisieren Sie das Skript mit dem Pfad zu Ihrem Treiber. - CSV-Datei:
- Erstellen Sie eine CSV-Datei mit einer Spalte namens
URL. - Füllen Sie sie mit den direkten URLs der Bilder, die Sie aus Zendesk exportieren möchten.
- Aktualisieren Sie das Skript mit dem Pfad zu dieser Datei.
- Erstellen Sie eine CSV-Datei mit einer Spalte namens
- Ein Speicherort:
Aktualisieren Sie das Skript mit dem Pfad zu dem Ordner, in dem Sie die Bilder speichern möchten.
Zuletzt müssen Sie ein paar Python-Bibliotheken installieren:
pip install selenium pillow
Das Skript
Hier ist das Python-Skript. Sie können es gerne an Ihre Einrichtung anpassen:
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
# Funktion zum Extrahieren der Bild-ID aus der 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'
# Funktion zum Herunterladen und Speichern eines Bildes von einer URL
def download_image(driver, image_url, download_folder):
driver.get(image_url)
# Warten, bis das Bild geladen ist
wait = WebDriverWait(driver, 20)
img_element = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'img')))
# Position und Größe des Bildelements abrufen
location = img_element.location
size = img_element.size
# Einen Screenshot der gesamten Seite machen
screenshot = driver.get_screenshot_as_png()
# Screenshot in ein PIL-Bild konvertieren
screenshot_image = Image.open(io.BytesIO(screenshot))
# Bounding Box für das Bild definieren (links, oben, rechts, unten)
left = location['x']
top = location['y']
right = left + size['width']
bottom = top + size['height']
bbox = (left, top, right, bottom)
# Bild auf die Bounding Box zuschneiden
cropped_image = screenshot_image.crop(bbox)
# Bild-ID aus der URL extrahieren
image_id = extract_image_id(image_url)
# Das zugeschnittene Bild mit der Bild-ID als Dateiname im Download-Ordner speichern
cropped_image.save(os.path.join(download_folder, f'{image_id}.png'))
# Funktion zum Laden von URLs aus einer CSV-Datei
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']) # Annahme: Die CSV-Datei hat die Spalten 'id' und 'url'
return urls
# ChromeDriver-Dienst einrichten
service = Service("C:\\\\Users\\\\tslam\\\\Downloads\\\\chromedriver-win64\\\\chromedriver-win64\\\\chromedriver.exe")
driver = webdriver.Chrome(service=service)
try:
# Browserfenster maximieren, um den gesamten Bildschirm zu füllen
driver.maximize_window()
# URLs aus der CSV-Datei laden
csv_file = 'C:\\\\Users\\\\tslam\\\\Zendesk Migration\\\\image_urls.csv'
image_urls = load_urls_from_csv(csv_file)
# Pfad zum Download-Ordner definieren
download_folder = 'C:\\\\Users\\\\tslam\\\\Zendesk Migration\\\\downloads'
# Sicherstellen, dass der Download-Ordner existiert
if not os.path.exists(download_folder):
os.makedirs(download_folder)
# Jede Bild-URL verarbeiten
for url in image_urls:
download_image(driver, url, download_folder)
finally:
driver.quit()