HiAPI
Блог

Руководство по использованию

Как скачать изображения по ссылке ChatGPT, из экспортного пакета или по gen_id

Что делать в четырёх случаях: ссылка ещё открывается, есть только экспортный пакет, ссылка истекла, остался только gen_id — как в каждом случае вернуть исходное изображение.

Oct 15, 2026
Как скачать изображения по ссылке ChatGPT, из экспортного пакета или по gen_id

Если вы хотите скачать изображение по ссылке ChatGPT, нужно сохранить файл, пока ссылка ещё открывается. Ссылки на изображения в ChatGPT временные, и после истечения срока даже с gen_id исходное изображение не вернуть.

Сначала посмотрите, что у вас осталось, и выберите подходящий способ:

Что у вас есть Как вернуть Результат
Ещё открывающаяся ссылка на изображение или исходный диалог Открыть изображение, скачать файл, сохранить в своё хранилище Обычно исходное изображение сохраняется
Полный экспорт данных ChatGPT (conversations.json плюс файлы изображений) Найти в папке экспорта по ID из file-service:// Если изображение есть в экспортном пакете, его можно вернуть
Просроченная ссылка backend-api или oaiusercontent Вернуться в исходный диалог, проверить полный экспорт или сгенерировать заново Изменение самой ссылки не сделает её снова действительной
Остался только gen_id Сгенерировать заново по исходному промпту Пиксели исходного изображения не вернуть
Процесс, где нужно многократно генерировать изображения пакетами Генерировать через API с документацией, скачивать и сохранять по своему адресу Дальнейшие изображения остаются у вас

Ключевое отличие: действующая подписанная ссылка позволяет скачать файл, а gen_id — это лишь идентификатор в диалоге, по нему ничего не скачать.

Ссылка ещё открывается: скачиваем напрямую

Если исходный диалог ещё на месте, откройте сгенерированное изображение и воспользуйтесь встроенной кнопкой скачивания ChatGPT. Если вы скопировали ссылку на изображение, открывайте её по полной ссылке (не удаляйте строку параметров после ?) и сразу сохраняйте.

После скачивания проверьте следующее, прежде чем считать дело сделанным:

  • возвращается HTTP 200;
  • тип содержимого — изображение, например image/png или image/webp;
  • размер файла нормальный, а не несколько сотен байт;
  • файл открывается и это именно нужное вам изображение.

Ссылку, которая открывается только в вашем текущем браузере, нельзя использовать как долгосрочный адрес: в браузере могут сохраняться состояние входа или только что выданная подпись. Скачайте файл и загрузите в своё хранилище, не отправляйте ссылку ChatGPT напрямую и не встраивайте её в продукт.

Почему ссылки на изображения ChatGPT истекают

У одного сгенерированного изображения в ChatGPT внутри может быть несколько видов ссылок:

  • gen_id: идентификатор конкретной генерации в диалоге.
  • file-service://file-...: внутренний указатель на файл, а не URL.
  • chatgpt.com/backend-api/... и files.oaiusercontent.com/...: временные подписанные ссылки для скачивания.

Каждый из них отвечает за своё, и ни один не является постоянным публичным адресом изображения.

Скопированная ссылка не открывается — обычно две ситуации:

HTTP 422
missing query fields such as p or ts

Ссылка скопирована не полностью, не хватает параметров подписи, либо при вставке какой-то инструмент удалил часть после ?.

HTTP 404
ResourceNotFound

Подпись или файл уже истекли, файл удалён, либо запрос вышел за контекст, в котором ссылка была выдана. Собрать из gen_id правдоподобный путь тоже не восстановит подпись и изображение.

Как вернуть изображения из полного экспорта данных

Запросите экспорт данных в настройках ChatGPT; в полном экспортном пакете будут conversations.json и отдельные файлы изображений. В JSON одно изображение выглядит примерно так:

{
  "content_type": "image_asset_pointer",
  "asset_pointer": "file-service://file-A1b2C3d4E5f6",
  "size_bytes": 1417238,
  "width": 1024,
  "height": 1024,
  "metadata": {
    "dalle": {"gen_id": "aBcD3fGh1jKl"}
  }
}

Полезен фрагмент file-... после file-service:// — он совпадает с именем файла в экспортном пакете. gen_id — это ни имя файла, ни учётные данные для скачивания.

1. Полностью распакуйте экспортный пакет

Сохраните исходную структуру каталогов. Если открыть только conversations.json, вы потеряете вторую половину — файлы изображений, с которыми нужно сопоставлять.

2. Найдите указатель на изображение

В conversations.json найдите "content_type": "image_asset_pointer", найдите нужный диалог и нужное изображение, скопируйте полный asset_pointer.

3. Извлеките ID файла

Уберите только внутренний префикс:

file-service://file-A1b2C3d4E5f6
               └─ file-A1b2C3d4E5f6

Не заменяйте file-service:// на https:// и не пытайтесь curl — это не публичный адрес.

4. Найдите в файлах экспорта

macOS или Linux:

find . -type f -iname '*file-A1b2C3d4E5f6*'

Если в экспортном пакете файлы переименованы или лежат в более глубоких каталогах, ищите по самой характерной части ID. Если есть size_bytes, width, height, сверьте их с файлами-кандидатами.

5. Убедитесь и сохраните у себя

Откройте файл-кандидат локально, убедитесь, что это нужное изображение, затем загрузите в своё S3, R2, CDN или хранилище приложения и запишите этот долгосрочный адрес.

Если изображений много, используйте приведённый ниже скрипт, чтобы локально перечислить все ID изображений в экспортном пакете — он не подключается к ChatGPT:

import json
from pathlib import Path

data = json.loads(Path("conversations.json").read_text())
seen = set()

def walk(value):
    if isinstance(value, dict):
        if value.get("content_type") == "image_asset_pointer":
            pointer = value.get("asset_pointer", "")
            if pointer.startswith("file-service://"):
                seen.add(pointer.removeprefix("file-service://"))
        for child in value.values():
            walk(child)
    elif isinstance(value, list):
        for child in value:
            walk(child)

walk(data)
for file_id in sorted(seen):
    print(file_id)

Наличие указателя лишь означает, что изображение когда-то упоминалось в диалоге; файла в экспортном пакете может не быть. Если после полной распаковки соответствующий файл всё равно не находится, то ни file-service://, ни gen_id не восстановят исходное изображение.

Что делать, если остался только gen_id

Нет никакого публичного интерфейса, который преобразует gen_id в PNG, WebP или новую подписанную ссылку. Если исходный диалог, рабочие ссылки и файлы в экспортном пакете потеряны, остаётся только сгенерировать заново по исходному промпту и контексту того времени.

Недействительный ID оставьте лишь как запись для диагностики. Для изображений, которые нужно хранить долго, записывайте следующее:

  • промпт и параметры генерации;
  • какой сервис и какая модель использовались;
  • ID задачи у сервиса — для диагностики и обращения в поддержку;
  • путь к файлу или долгосрочный адрес в вашем хранилище.

Автоматический процесс скачивания через API

Для пакетной генерации с сохранением используйте API, который изначально возвращает файлы изображений. В HiAPI стабильный процесс такой: отправить, опрашивать, скачать, проверить, перенести.

curl -X POST https://api.hiapi.ai/v1/tasks \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-image-2/text-to-image",
    "input": {
      "prompt": "晨光里,书桌上放着一只纸鹤",
      "aspect_ratio": "1:1",
      "resolution": "1K"
    }
  }'

Получив taskId, опрашивайте GET /v1/tasks/{taskId}, после успеха читайте data.output[0].url и expireAt:

curl -s "https://api.hiapi.ai/v1/tasks/$TASK_ID" \
  -H "Authorization: Bearer $HIAPI_API_KEY"

curl -s -o generated-image.webp "<data.output[0].url>"

Адрес, возвращаемый API, тоже временный, но срок истечения указан в ответе (expireAt), так что можно обработать вовремя. Скачивайте до истечения срока, убедитесь, что получили изображение, а не HTML или JSON с ошибкой, затем загрузите файл в своё хранилище.

gpt-image-2/text-to-image стоит $0.03 за изображение в 1K, $0.04 за 2K, $0.06 за 4K. Параметры и онлайн-попробовать — на странице модели GPT Image 2, формат запроса — в документации по созданию задачи.

Подход к хранению, не боящийся истечения ссылок

Для каждой успешной задачи:

  1. Сохраните ID задачи до опроса — тогда при повторных попытках worker не отправит задачу заново и не спишет оплату дважды.
  2. Скачайте файл, пока подписанный адрес ещё действителен.
  3. Проверьте код состояния, тип содержимого и размер файла, принимайте только если это изображение.
  4. Загрузите по заданному вами пути к файлу.
  5. В базе данных храните свой адрес; временный адрес оставляйте только для краткосрочной диагностики.

Частые вопросы

Как скачать изображение по ссылке ChatGPT?

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

Есть ли официальный интерфейс скачивания по gen_id?

Нет. ChatGPT не публикует никакого интерфейса «передать gen_id — получить изображение»; этот идентификатор имеет смысл только в исходном диалоге.

Почему ссылка на изображение ChatGPT возвращает 422?

Обычно в подписанной ссылке не хватает необходимых параметров. Если скопирован только путь или инструмент удалил часть после ?, ссылка становится недействительной.

Почему та же ссылка позже возвращает 404?

Подписанная ссылка и сам файл временные. После истечения срока возврат ResourceNotFound нормален, и gen_id продлить срок не может.

Как найти изображения file-service:// в экспортном пакете?

Скопируйте ID файла после file-service://, найдите в полностью распакованном экспортном пакете имя файла, содержащее этот ID, и сверьте по размеру файла и ширине с высотой.

Как получить постоянный адрес изображения?

Пока исходный файл ещё можно скачать, загрузите его в своё хранилище и сохраните свой адрес. Постоянство зависит от вашего хранилища, а не от временной ссылки для скачивания у сервиса.

Похожие статьи

Все статьи →

Начните работать с постоянными артефактами ИИ

Получите API-ключ и вызывайте модели изображений, видео и аудио через один API на основе tasks.

Читать документацию API