คุณสามารถส่งไฟล์รูปภาพหรือไฟล์ Zip ผ่านโปรแกรมภายนอกเพื่อเชื่อมต่อระบบหั่นภาพ (Split) และบีบอัดไฟล์ (Compress to WebP 80%) ได้โดยอัตโนมัติ โดยระบบจะส่งไฟล์ Zip ผลลัพธ์ที่ปรับแต่งแล้วกลับไปให้ทันที

API Workflow Diagram
🔗 HTTP Endpoint:
POST https://999.kairew.co/api/external/optimize

🌐 Base URL: https://999.kairew.co — ทุก Request ต้องมี Header x-api-key เสมอ

🔑 HTTP Headers:
Header Key Value คำอธิบาย
x-api-key xxxxxxx คีย์สำหรับเข้าใช้งานติดต่อแอดมิน
Content-Type multipart/form-data ต้องระบุประเภทเป็นฟอร์มข้อมูลแบบไฟล์
📦 Request Body (Form Data):
Field Name Type Required คำอธิบาย
uploadType string Optional ระบุ zip (เริ่มต้น), img (อัปโหลดรูปภาพหลายๆ ไฟล์) หรือ url_image (อัปโหลดลิงก์รูปภาพ)
mangaUrls string กรณี url_image ลิงก์รูปภาพเรียงบรรทัดละ 1 ลิงก์ (Newline-separated URLs)
referral string Optional ใช้เฉพาะกรณี url_image เพื่อกำหนด HTTP Referer Header ป้องกันบอทตรวจจับหรือบล็อกของเว็บเซิร์ฟเวอร์มังงะต้นทาง
mangaZip file กรณี zip ไฟล์ .zip ต้นฉบับที่รวบรวมภาพการ์ตูนไว้ภายใน
mangaImages file array กรณี img ไฟล์รูปภาพทีละหลายไฟล์ส่งพร้อมกัน (รองรับสูงสุด 2000 ภาพ)
authorName string Optional ชื่อผู้ส่งงาน/สถิติ ค่าเริ่มต้นคือ External_API
responseType string Optional รูปแบบการรับผลลัพธ์:
  • url — คืนค่า JSON ลิงก์รูปภาพแยกแต่ละรูป (เซิร์ฟเวอร์เก็บไฟล์ชั่วคราว 30 นาที)
  • zip_url — คืนค่า JSON ลิงก์ดาวน์โหลด ZIP (เซิร์ฟเวอร์เก็บไฟล์ชั่วคราว 30 นาที)
  • zip — ดาวน์โหลดไฟล์ ZIP โดยตรง (ค่าเริ่มต้น)
  • s3 — ☁️ อัปโหลดรูปไปยัง AWS S3 แล้วคืน JSON รายการ S3 URL
mangaName string Optional ชื่อเรื่องมังงะ (ภาษาไทย/อังกฤษ) เพื่อนำใช้ในการตั้งชื่อไฟล์ Zip ผลลัพธ์แบบไดนามิก
chapterNumber string Optional หมายเลขตอน (เช่น 1110 หรือ 10.5) เพื่อใช้ประกอบตั้งชื่อไฟล์ Zip
maxSplitHeight number / string Optional ความสูงสูงสุดของภาพในการหั่นรูปแนวยาว (หน่วยเป็นพิกเซล PX) ค่าเริ่มต้นคือ 8000
☁️ S3 Upload Parameters (ใช้เมื่อ responseType=s3 เท่านั้น)
s3AccessKeyId string บังคับ (s3) AWS Access Key ID เช่น AKIAXXXXXXXXXXXXXXXX
s3SecretAccessKey string บังคับ (s3) AWS Secret Access Key
s3Bucket string บังคับ (s3) ชื่อ S3 Bucket เช่น my-manga-bucket
s3Region string Optional AWS Region ค่าเริ่มต้น ap-southeast-1 (สำหรับ R2 ป้อน auto)
s3Endpoint string Optional S3 endpoint URL (จำเป็นสำหรับ Cloudflare R2 / Custom S3) เช่น https://<account_id>.r2.cloudflarestorage.com
s3Prefix string Optional Path prefix ใน Bucket เช่น OnePiece/ch_1110/ — ส่งผลให้ key ผลลัพธ์เป็น OnePiece/ch_1110/001_kairew.webp
customDomain string Optional 🌐 ใช้กับ responseType=s3 เท่านั้น — แทน S3 URL ด้วย CloudFront หรือ CDN domain เช่น https://cdn.mysite.com → URL ผลลัพธ์: https://cdn.mysite.com/prefix/001_kairew.webp
💡 ผลการตอบกลับ (Response):
  • เมื่อสำเร็จ (กรณี responseType = zip): ส่งคืนไฟล์ไบนารี (.zip) ให้ดาวน์โหลดทันที โดยไฟล์บนเซิร์ฟเวอร์จะหมดอายุและถูกลบหลังจาก 30 นาที
  • เมื่อสำเร็จ (กรณี responseType = url หรือ zip_url): คืนค่าเป็น JSON และไฟล์ชั่วคราวต้นทางทั้งหมดจะถูกลบออกโดยอัตโนมัติภายใน 30 นาที ตัวอย่างรูปแบบผลลัพธ์:
    {
      "success": true,
      "jobId": "ext_...",
      "responseType": "url",
      "expiresIn": "30 minutes",
      "expiresAt": "2026-06-29T11:00:00.000Z",
      "images": [
        "http://domain/outputs/api_temp_ext_xxx/001_kairew.webp",
        "http://domain/outputs/api_temp_ext_xxx/002_kairew.webp"
      ]
    }
  • เมื่อทำงานล้มเหลว (HTTP 400/401/500): คืนค่าเป็น JSON ข้อมูลระบุข้อผิดพลาด
💻 ตัวอย่างการเรียกใช้ API:
📂 กรณีที่ 1: ส่งไฟล์ Zip (uploadType = zip)
1.1 cURL script:
curl -X POST https://999.kairew.co/api/external/optimize \
  -H "x-api-key: xxxxxxx" \
  -F "uploadType=zip" \
  -F "mangaName=OnePiece" \
  -F "chapterNumber=1110" \
  -F "mangaZip=@/path/to/your_manga.zip" \
  -o OnePiece_ch_1110_optimized.zip
1.2 Python script:
import requests

url = "https://999.kairew.co/api/external/optimize"
headers = {
    "x-api-key": "xxxxxxx"
}
files = {
    "mangaZip": open("your_manga.zip", "rb")
}
data = {
    "uploadType": "zip",
    "authorName": "ExternalPython",
    "mangaName": "OnePiece",
    "chapterNumber": "1110"
}

response = requests.post(url, headers=headers, files=files, data=data)

if response.status_code == 200 and response.headers.get("Content-Type") == "application/zip":
    with open("OnePiece_ch_1110_optimized.zip", "wb") as f:
        f.write(response.content)
    print("บันทึกไฟล์สำเร็จเรียบร้อย!")
else:
    print("ข้อผิดพลาด:", response.json())
🖼️ กรณีที่ 2: ส่งไฟล์รูปภาพหลายไฟล์พร้อมกัน (uploadType = img)
2.1 cURL script:
curl -X POST https://999.kairew.co/api/external/optimize \
  -H "x-api-key: xxxxxxx" \
  -F "uploadType=img" \
  -F "mangaName=Naruto" \
  -F "chapterNumber=700" \
  -F "mangaImages=@/path/to/image01.jpg" \
  -F "mangaImages=@/path/to/image02.png" \
  -o Naruto_ch_700_optimized.zip
2.2 Python script:
import requests

url = "https://999.kairew.co/api/external/optimize"
headers = {
    "x-api-key": "xxxxxxx"
}
# ส่งรูปภาพหลายไฟล์พร้อมกันโดยผูกภายใต้คีย์ 'mangaImages' เดียวกัน
files = [
    ("mangaImages", ("image01.jpg", open("image01.jpg", "rb"), "image/jpeg")),
    ("mangaImages", ("image02.png", open("image02.png", "rb"), "image/png"))
]
data = {
    "uploadType": "img",
    "authorName": "ExternalPython",
    "mangaName": "Naruto",
    "chapterNumber": "700"
}

response = requests.post(url, headers=headers, files=files, data=data)

if response.status_code == 200 and response.headers.get("Content-Type") == "application/zip":
    with open("Naruto_ch_700_optimized.zip", "wb") as f:
        f.write(response.content)
    print("บันทึกไฟล์สำเร็จเรียบร้อย!")
else:
    print("ข้อผิดพลาด:", response.json())
🔗 กรณีที่ 3: ส่งลิงก์รูปภาพ (uploadType = url_image)
3.1 cURL script:
curl -X POST https://999.kairew.co/api/external/optimize \
  -H "x-api-key: xxxxxxx" \
  -F "uploadType=url_image" \
  -F "responseType=url" \
  -F "mangaName=SoloLeveling" \
  -F "chapterNumber=180" \
  -F "referral=https://manga-site.com/chapter-180" \
  -F "maxSplitHeight=8000" \
  -F $'mangaUrls=https://cdn.manga-site.com/page001.jpg\nhttps://cdn.manga-site.com/page002.jpg'
3.2 Python script:
import requests

url = "https://999.kairew.co/api/external/optimize"
headers = {"x-api-key": "xxxxxxx"}

image_urls = [
    "https://cdn.manga-site.com/page001.jpg",
    "https://cdn.manga-site.com/page002.jpg",
]

data = {
    "uploadType": "url_image",
    "responseType": "url",
    "mangaName": "SoloLeveling",
    "chapterNumber": "180",
    "authorName": "ExternalPython",
    "referral": "https://manga-site.com/chapter-180",
    "maxSplitHeight": "8000",
    "mangaUrls": "\n".join(image_urls)
}

response = requests.post(url, headers=headers, data=data)
print(response.json())