Скрипт Python для экспорта изображений из Zendesk Community

Нужно перенести изображения из Zendesk Community в Discourse? Вот Python-скрипт!

Всем привет,

Я занимался миграцией сообщества Zendesk в Discourse и столкнулся с неприятной проблемой: экспортом изображений из Zendesk. В чём дело? CDN Zendesk начинает блокировать доступ после загрузки нескольких изображений напрямую, что делает массовую загрузку настоящим вызовом.

После нескольких попыток я создал Python-скрипт (с небольшой помощью ИИ), который обходит это ограничение. Скрипт использует Selenium, чтобы открыть каждое изображение в браузере, сделать скриншот и сохранить его локально. Это не так чисто, как прямая загрузка изображений, но работает надёжно, а изображения получаются высокого качества.

Если вы сталкиваетесь с подобной миграцией, надеюсь, это вам поможет!


Что понадобится

  1. Python: Установлен и готов к работе.
  2. ChromeDriver:
    Скачайте его с Chrome for Testing, распакуйте и обновите путь к драйверу в скрипте.
  3. CSV-файл:
  • Создайте CSV-файл с одним столбцом под названием URL.
  • Заполните его прямыми ссылками на изображения, которые нужно экспортировать из Zendesk.
  • Обновите путь к этому файлу в скрипте.
  1. Папка для сохранения:
    Укажите в скрипте путь к папке, куда будут сохраняться изображения.

Наконец, установите несколько библиотек Python:

pip install selenium pillow

Скрипт

Вот Python-скрипт. Не стесняйтесь адаптировать его под свою среду:

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

# Функция для извлечения ID изображения из 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'

# Функция для загрузки и сохранения изображения из URL
def download_image(driver, image_url, download_folder):
    driver.get(image_url)
    
    # Ожидание загрузки изображения
    wait = WebDriverWait(driver, 20)
    img_element = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'img')))

    # Получение координат и размера элемента изображения
    location = img_element.location
    size = img_element.size

    # Создание скриншота всей страницы
    screenshot = driver.get_screenshot_as_png()
    
    # Преобразование скриншота в объект PIL Image
    screenshot_image = Image.open(io.BytesIO(screenshot))

    # Определение области изображения (левый, верхний, правый, нижний координаты)
    left = location['x']
    top = location['y']
    right = left + size['width']
    bottom = top + size['height']
    bbox = (left, top, right, bottom)

    # Обрезка изображения по области
    cropped_image = screenshot_image.crop(bbox)

    # Извлечение ID изображения из URL
    image_id = extract_image_id(image_url)

    # Сохранение обрезанного изображения с именем файла, равным ID изображения, в папке загрузки
    cropped_image.save(os.path.join(download_folder, f'{image_id}.png'))

# Функция для загрузки URL из 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'])  # Предполагается, что в CSV есть столбцы 'id' и 'url'
    return urls

# Настройка сервиса ChromeDriver
service = Service("C:\\Users\\tslam\\Downloads\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe")
driver = webdriver.Chrome(service=service)

try:

    # Развернуть окно браузера на весь экран
    driver.maximize_window()
    
    # Загрузка URL из CSV-файла
    csv_file = 'C:\\Users\\tslam\\Zendesk Migration\\image_urls.csv'
    image_urls = load_urls_from_csv(csv_file)
    
    # Определение пути к папке загрузки
    download_folder = 'C:\\Users\\tslam\\Zendesk Migration\\downloads'
    
    # Проверка существования папки загрузки
    if not os.path.exists(download_folder):
        os.makedirs(download_folder)

    # Обработка каждого URL изображения
    for url in image_urls:
        download_image(driver, url, download_folder)

finally:
    driver.quit()

Отлично! Это можно использовать и для других миграций, сталкивающихся с той же проблемой, не только для Zendesk. Большое спасибо за то, что поделились.