# การอ่านตัวอักษรและตัวเลขจากภาพ

> ใช้ YesCaptcha อ่านตัวอักษรภาษาอังกฤษและตัวเลขในภาพ โดย ImageToTextTaskOcrBase และ ImageToTextTaskMuggle คืนผลแบบซิงโครนัส ส่วน ImageToTextTask และ ImageToTextTaskM1 เป็นแบบอะซิงโครนัสและรองรับเงื่อนไขตัวพิมพ์ใหญ่เล็ก ตัวเลขล้วน นิพจน์คำนวณ รวมถึงโมเดลที่สร้างเฉพาะ

Source: https://docs.yescaptcha.com/th/tasks/image-to-text/ · Last verified: 2026-10-15

> This page was machine-translated from the Chinese version. If anything differs, the Chinese version prevails: https://docs.yescaptcha.com/zh/tasks/image-to-text/

ส่งภาพ CAPTCHA แบบตัวอักษรเป็น Base64 แล้วรับตัวอักษรภาษาอังกฤษและตัวเลขในภาพกลับมา (`solution.text`) `ImageToTextTaskOcrBase` ราคาภาพละ 2 พอยต์ (≈ $0.30 / 1k) และคืนผลแบบซิงโครนัส คือได้ผลลัพธ์จากคำขอ `createTask` เพียงครั้งเดียว หากต้องการกำหนดเงื่อนไข เช่น ตัวพิมพ์ใหญ่เล็ก ตัวเลขล้วน หรือนิพจน์คำนวณ ให้ใช้ `ImageToTextTask` แบบอะซิงโครนัส

- POST `https://api.yescaptcha.com/createTask` (endpoint ทั่วโลก)
- POST `https://cn.yescaptcha.com/createTask` (endpoint จีน)

เนื้อหาคำขอเป็น JSON และยืนยันตัวตนด้วย `clientKey`

## ประเภทงานและราคา

| ประเภทงาน | ราคา | รูปแบบการคืนผลลัพธ์ | หมายเหตุ |
| --- | --- | --- | --- |
| `ImageToTextTaskOcrBase` | $0.30 / 1k; 2 พอยต์/งาน · ¥2 / 1k | แบบซิงโครนัส |  |
| `ImageToTextTaskMuggle` | $0.30 / 1k; 2 พอยต์/งาน · ¥2 / 1k | แบบซิงโครนัส | ไม่รองรับตัวเลือก case และ numeric ใช้ project\_name เพื่อเลือกโมเดลที่กำหนดเองได้ |
| `ImageToTextTask` | $0.60 / 1k; 4 พอยต์/งาน · ¥4 / 1k | แบบอะซิงโครนัส |  |
| `ImageToTextTaskM1` | $2.25 / 1k; 15 พอยต์/งาน · ¥15 / 1k | แบบอะซิงโครนัส |  |

ราคาเป็นดอลลาร์สหรัฐเป็นเพียงค่าประมาณที่ US$1 ≈ ¥6.67 งานจะถูกหักเป็นพอยต์

| ความต้องการ | ประเภทที่ใช้ |
| --- | --- |
| CAPTCHA ตัวอักษรและตัวเลขทั่วไป ราคาถูกและเร็วที่สุด | `ImageToTextTaskOcrBase`, `ImageToTextTaskMuggle` (แบบซิงโครนัส) |
| ใช้โมเดลที่สร้างเฉพาะสำหรับคุณ | `ImageToTextTaskMuggle` พร้อม `project_name` |
| ต้องแยกตัวพิมพ์ใหญ่เล็ก ตัวเลขล้วน คำนวณนิพจน์ หรือจำกัดความยาว | `ImageToTextTask`, `ImageToTextTaskM1` (แบบอะซิงโครนัส) |

แต่ละประเภทงานใช้โมเดลและเส้นทางที่ต่างกัน ผลลัพธ์กับภาพประเภทเดียวกันจึงอาจไม่เท่ากัน ลองทดสอบหลายประเภทก่อนเลือกใช้

## พารามิเตอร์ของคำขอ

| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย |
| --- | --- | --- | --- |
| `type` | string | ใช่ | ประเภทงาน ดูค่าที่ใช้ได้ในหัวข้อ "ประเภทงานและราคา" ของหน้านี้ |
| `body` | string | ใช่ | รูปภาพที่เข้ารหัส Base64 โดยไม่มีคำนำหน้า `data:image/...;base64,` และไม่มีการขึ้นบรรทัดใหม่ |
| `project_name` | string | ไม่ | ชื่อโมเดลที่กำหนดเอง รองรับเฉพาะ `ImageToTextTaskMuggle` หากไม่ระบุจะใช้โมเดลตัวอักษรและตัวเลขทั่วไป หากต้องการโมเดลที่กำหนดเองโปรดติดต่อฝ่ายสนับสนุน (เฉพาะ ImageToTextTaskMuggle) |
| `phrase` | boolean | ไม่ | true หมายถึงคำตอบมีช่องว่างอย่างน้อยหนึ่งช่อง (เฉพาะ ImageToTextTask, ImageToTextTaskM1) |
| `case` | boolean | ไม่ | true หมายถึงคำตอบแยกแยะตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก (เฉพาะ ImageToTextTask, ImageToTextTaskM1) |
| `numeric` | integer | ไม่ | 0 ไม่มีข้อกำหนด; 1 ตัวเลขเท่านั้น; 2 ไม่มีตัวเลข (เฉพาะ ImageToTextTask, ImageToTextTaskM1) |
| `math` | boolean | ไม่ | true หมายถึงรูปภาพเป็นนิพจน์ทางคณิตศาสตร์ และคำตอบคือผลลัพธ์ของนิพจน์นั้น (เฉพาะ ImageToTextTask, ImageToTextTaskM1) |
| `minLength` | integer | ไม่ | ความยาวขั้นต่ำของคำตอบ 0 หมายถึงไม่จำกัด (เฉพาะ ImageToTextTask, ImageToTextTaskM1) |
| `maxLength` | integer | ไม่ | ความยาวสูงสุดของคำตอบ 0 หมายถึงไม่จำกัด (เฉพาะ ImageToTextTask, ImageToTextTaskM1) |

`body` คือ Base64 ของไฟล์ภาพ ภาพ WebP จะถูกแปลงให้อัตโนมัติ

> **คำเตือน:** Base64 ต้องไม่มีคำนำหน้า `data:image/...;base64,` และต้องไม่มีการขึ้นบรรทัดใหม่

## ตัวอย่างคำขอ

POST https://api.yescaptcha.com/createTask

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "ImageToTextTaskOcrBase",
    "body": "BASE64_IMAGE"
  }
}
```

โค้ดฉบับเต็ม (อ่านไฟล์ `captcha.png` ในไดเรกทอรีปัจจุบัน):

**curl**

```bash
# Replace BASE64_IMAGE with the Base64-encoded image
curl -s https://api.yescaptcha.com/createTask \
  -H 'Content-Type: application/json' \
  -d '{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "ImageToTextTaskOcrBase",
    "body": "BASE64_IMAGE"
  }
}'
```

**Python**

solve.py

```python
import os
import base64

import requests

API = "https://api.yescaptcha.com"
CLIENT_KEY = os.environ["YESCAPTCHA_CLIENT_KEY"]  # Read the clientKey from an environment variable

def call(method, payload):
    r = requests.post(f"{API}/{method}", json={"clientKey": CLIENT_KEY, **payload}, timeout=30)
    data = r.json()
    if data.get("errorId"):
        raise RuntimeError(f"{data.get('errorCode')}: {data.get('errorDescription')}")
    return data

def solve(task):
    return call("createTask", {"task": task})["solution"]

# Base64-encode the image (no data: prefix)
with open("captcha.png", "rb") as f:
    image_b64 = base64.b64encode(f.read()).decode()

solution = solve({
    "type": "ImageToTextTaskOcrBase",
    "body": image_b64,
})
print(solution["text"])
```

**Node.js**

solve.mjs

```js
import { readFileSync } from 'node:fs';

const API = 'https://api.yescaptcha.com';
const CLIENT_KEY = process.env.YESCAPTCHA_CLIENT_KEY; // Read the clientKey from an environment variable

async function call(method, payload) {
  const res = await fetch(`${API}/${method}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ clientKey: CLIENT_KEY, ...payload }),
  });
  const data = await res.json();
  if (data.errorId) throw new Error(`${data.errorCode}: ${data.errorDescription}`);
  return data;
}

async function solve(task) {
  const { solution } = await call('createTask', { task });
  return solution;
}

// Base64-encode the image (no data: prefix)
const imageB64 = readFileSync('captcha.png').toString('base64');

const solution = await solve({
  type: "ImageToTextTaskOcrBase",
  body: imageB64,
});
console.log(solution.text);
```

งานแบบอะซิงโครนัสที่มีเงื่อนไข:

POST https://api.yescaptcha.com/createTask

```json
{
  "clientKey": "YOUR_CLIENT_KEY",
  "task": {
    "type": "ImageToTextTask",
    "body": "BASE64_IMAGE",
    "case": true,
    "numeric": 0,
    "minLength": 4,
    "maxLength": 6
  }
}
```

## ผลลัพธ์ที่ได้รับ

ประเภทงานแบบซิงโครนัสจะคืนผลใน `createTask` โดยตรง:

```json
{
  "errorId": 0,
  "status": "ready",
  "solution": {
    "text": "LMResm"
  },
  "taskId": "2376919c-1863-11ec-a012-94e6f7355a0b"
}
```

ประเภทงานแบบอะซิงโครนัส (`ImageToTextTask`, `ImageToTextTaskM1`) จะคืน `taskId` ก่อน จากนั้นให้เรียก `getTaskResult` ตรวจซ้ำทุก 5 วินาที เมื่อเสร็จแล้ว `solution` จะมีรูปแบบเดียวกัน

| ฟิลด์ | ประเภท | คำอธิบาย |
| --- | --- | --- |
| `text` | string | ข้อความที่จดจำได้ |

## โมเดลที่สร้างเฉพาะ

โมเดลทั่วไปใช้ได้กับ CAPTCHA ตัวอักษรและตัวเลขทุกแบบ แต่ความแม่นยำต่ำกว่าโมเดลที่ฝึกมาเฉพาะเล็กน้อย หากภาพที่ต้องการอ่านมีรูปแบบเดียวกันเสมอ คุณสามารถ [ติดต่อฝ่ายสนับสนุน](https://docs.yescaptcha.com/th/help/contact.md) เพื่อสร้างโมเดลเฉพาะ จากนั้นระบุด้วย `ImageToTextTaskMuggle` พร้อม `project_name`

## คำถามที่พบบ่อย

### ถ้าอ่านผิดจะถูกหักพอยต์หรือไม่?

ประเภทงานแบบซิงโครนัสจะหักพอยต์เมื่อมีผลลัพธ์คืนมา แม้ผลลัพธ์จะไม่ถูกต้อง คุณสามารถเปลี่ยนไปลองประเภทงานอื่นเพื่อเปรียบเทียบ หรือสร้างโมเดลเฉพาะ

### ได้รับ `ERROR_ZERO_CAPTCHA_FILESIZE` หรือ `ERROR_PARSE_IMAGE_FAIL`?

Base64 ของภาพไม่สมบูรณ์ หรือมีคำนำหน้า `data:` หรือการขึ้นบรรทัดใหม่ ให้ตรวจสอบการเข้ารหัส ดูที่ [รหัสข้อผิดพลาด](https://docs.yescaptcha.com/th/api/errors.md)

## ตัวอย่างที่เกี่ยวข้อง

-   [เริ่มต้นใช้งานอย่างรวดเร็ว](https://docs.yescaptcha.com/th/getting-started/quickstart.md): ส่งคำขอแรกด้วย `ImageToTextTaskOcrBase`
-   [ตัวอย่าง Python](https://docs.yescaptcha.com/th/samples/python.md)
