Нужно перенести изображения из Zendesk Community в Discourse? Вот Python-скрипт!
Всем привет,
Я занимался миграцией сообщества Zendesk в Discourse и столкнулся с неприятной проблемой: экспортом изображений из Zendesk. В чём дело? CDN Zendesk начинает блокировать доступ после загрузки нескольких изображений напрямую, что делает массовую загрузку настоящим вызовом.
После нескольких попыток я создал Python-скрипт (с небольшой помощью ИИ), который обходит это ограничение. Скрипт использует Selenium, чтобы открыть каждое изображение в браузере, сделать скриншот и сохранить его локально. Это не так чисто, как прямая загрузка изображений, но работает надёжно, а изображения получаются высокого качества.
Если вы сталкиваетесь с подобной миграцией, надеюсь, это вам поможет!
Что понадобится
- Python: Установлен и готов к работе.
- ChromeDriver:
Скачайте его с Chrome for Testing, распакуйте и обновите путь к драйверу в скрипте. - CSV-файл:
- Создайте CSV-файл с одним столбцом под названием
URL. - Заполните его прямыми ссылками на изображения, которые нужно экспортировать из Zendesk.
- Обновите путь к этому файлу в скрипте.
- Папка для сохранения:
Укажите в скрипте путь к папке, куда будут сохраняться изображения.
Наконец, установите несколько библиотек 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()