Python-Script zum Exportieren von Bildern aus der Zendesk Community

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

  1. Python: Installiert und einsatzbereit.
  2. ChromeDriver:
    Laden Sie es von Chrome for Testing herunter, entpacken Sie es und aktualisieren Sie das Skript mit dem Pfad zu Ihrem Treiber.
  3. 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.
  4. 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()

6 „Gefällt mir“

Schön! Dies könnte sogar für andere Migrationen verwendet werden, die mit demselben Problem konfrontiert sind, nicht nur für Zendesk. Vielen Dank für das Teilen.

3 „Gefällt mir“