사용 가이드
ChatGPT 링크, 내보내기 패키지 또는 gen_id에서 이미지를 다운로드하는 방법
링크가 아직 열리는 경우, 내보내기 패키지만 있는 경우, 링크가 만료된 경우, gen_id만 남은 경우 — 네 가지 상황별로 원본 이미지를 되찾는 방법.
ChatGPT 링크에서 이미지를 다운로드하려면 링크가 아직 열릴 때 파일을 저장해 두어야 합니다. ChatGPT의 이미지 링크는 임시 링크이며, 만료된 뒤에는 gen_id가 있어도 원본 이미지를 되돌려 받을 수 없습니다.
먼저 손에 무엇이 남아 있는지 확인한 뒤 해당하는 방법을 고르세요:
| 손에 남아 있는 것 | 되찾는 방법 | 결과 |
|---|---|---|
| 아직 열리는 이미지 링크 또는 원래 대화 | 이미지를 열어 파일을 다운로드하고 자신의 스토리지에 저장 | 대개 원본 이미지를 보존할 수 있음 |
완전한 ChatGPT 데이터 내보내기(conversations.json과 이미지 파일) |
file-service://의 ID로 내보내기 폴더에서 찾기 |
내보내기 패키지에 이 이미지가 있으면 되찾을 수 있음 |
이미 만료된 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-service:// 뒤의 file-... 부분으로, 내보내기 패키지 내 파일명과 대응됩니다. 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는 1K 장당 $0.03, 2K $0.04, 4K $0.06입니다. 파라미터와 온라인 체험은 GPT Image 2 모델 페이지를, 요청 형식은 작업 생성 문서를 참고하세요.
링크 만료에 흔들리지 않는 스토리지 방법
성공한 각 작업마다:
- 폴링 전에 먼저 작업 ID를 저장해 두면, worker가 재시도할 때 중복 제출과 중복 과금이 발생하지 않습니다.
- 서명 주소가 아직 유효할 때 파일을 다운로드합니다.
- 상태 코드, 콘텐츠 유형, 파일 크기를 확인하고 이미지임을 확인한 뒤 수령합니다.
- 자신이 정한 파일 경로로 업로드합니다.
- 데이터베이스에는 자신의 주소를 저장합니다; 임시 주소는 단기 문제 진단용으로만 남겨 둡니다.
자주 묻는 질문
ChatGPT 링크에서 이미지를 다운로드하려면 어떻게 하나요?
링크가 아직 열릴 때 전체 링크(서명 파라미터 포함)로 열어 이미지 파일을 다운로드하고 자신의 스토리지에 저장하세요. 로그인한 브라우저에서만 열리는 링크는 모두 임시 링크로 취급하세요.
공식 gen_id 다운로드 인터페이스가 있나요?
없습니다. ChatGPT는 gen_id를 전달하면 이미지를 반환하는 인터페이스를 공개하지 않았으며, 이 번호는 원래 대화에서만 의미가 있습니다.
ChatGPT 이미지 링크가 422를 반환하는 이유는 무엇인가요?
보통 서명 링크에 필요한 파라미터가 빠진 경우입니다. 경로만 복사했거나, 사용한 도구가 ? 뒤의 부분을 삭제하면 링크가 무효화됩니다.
같은 링크가 나중에 404가 되는 이유는 무엇인가요?
서명 링크와 파일 자체가 모두 임시입니다. 만료 후 ResourceNotFound를 반환하는 것은 정상이며, gen_id로도 연장할 수 없습니다.
내보내기 패키지의 file-service:// 이미지는 어떻게 찾나요?
file-service:// 뒤의 파일 ID를 복사하고, 완전히 압축 해제한 내보내기 패키지에서 이 ID를 포함하는 파일명을 검색한 뒤, 파일 크기와 너비·높이로 대조하세요.
영구적인 이미지 주소를 얻으려면 어떻게 하나요?
원본 파일이 아직 다운로드 가능할 때 자신의 스토리지에 업로드하고 자신의 주소를 저장하세요. 영구적인지는 서비스 제공자의 임시 다운로드 링크가 아니라 자신의 스토리지에 달려 있습니다.
관련 글
모든 아티클 보기 →-
사용 가이드
seedream-5.0-pro/image-to-image 시작 가이드: 기능, 가격 및 연동 핵심 포인트
ByteDance 이미지 편집 모델의 기능 경계, 과금 방식 및 엔지니어링 연동 실무
-
사용 가이드
seedream-5.0-pro 텍스트-이미지 생성 입문 가이드: 능력 경계, API 연동 및 비용 관리
개발자를 위한 실무 관점: 파라미터 핵심부터 장당 $0.05 비용 추정까지
-
사용 가이드
Hailuo 2.3 Fast 이미지-투-비디오 입문 가이드: 성능 범위, 가격 및 연동 실무
개발자를 위한 MiniMax 이미지-투-비디오 모델 선택과 연동 핵심 포인트