Skip to content

Документация Proton OCR API

Добро пожаловать в документацию Протона — высокопроизводительного OCR движка для автоматизации распознавания текста в ваших приложениях и сервисах.


Что это такое

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


Содержание

  1. Получение и управление API-токеном

  2. Методы API

  3. Webhook для уведомлений

  4. Баланс и подписка

  5. Примеры запросов

  6. Часто задаваемые вопросы (FAQ)


Быстрый старт

Ниже приведён базовый пример работы с API на Python. Предполагается, что у вас уже есть API-токен.

import base64
import pathlib
import time
from typing import Literal

import requests


API_KEY = "ВАШ-API-КЛЮЧ"
IMAGES = ['ПУТЬ(И) К ИЗОБРАЖЕНИЮ(ЯМ)']

POLL_INTERVAL_S = 0.5
MAX_POLLS = 10

BASE_URL = "https://ocrbot.ru/api/v1"
Headers = {"X-Api-Key": API_KEY}


def encode_image(path: str | pathlib.Path) -> str:
    with open(path, "rb") as f:
        return base64.b64encode(f.read()).decode()


def decode_result(data: str) -> bytes:
    return base64.b64decode(data)


def save_result(data: bytes, path: str | pathlib.Path) -> None:
    with open(path, "wb") as f:
        f.write(data)


def create_task(images_b64: str) -> str:
    resp = requests.post(
        f"{BASE_URL}/tasks",
        headers=Headers,
        json={"image": images_b64, "return_type": "json"},
        timeout=30,
    )
    resp.raise_for_status()
    task_id = resp.json().get("task_id")
    if not task_id:
        raise RuntimeError("Не удалось получить task_id")
    print(f"Создана задача: {task_id}")
    return task_id


def wait_for_task(
    task_id: str,
    max_polls: int = MAX_POLLS,
    interval_s: float = POLL_INTERVAL_S,
) -> Literal["success", "error"]:
    for _ in range(max_polls):
        status_resp = requests.get(
            f"{BASE_URL}/tasks/{task_id}/status",
            headers=Headers,
            timeout=10,
        )
        status_resp.raise_for_status()
        status = status_resp.json().get("task_status", "unknown")
        print(f"статус: {status}")

        if status in ("pending"):
            time.sleep(interval_s)
        elif status in ("success", "error"):
            return status
        else:
            raise RuntimeError(f"{status}")
    raise TimeoutError("Лимит ожидания статуса исчерпан")


def fetch_result(task_id: str) -> str:
    resp = requests.get(
        f"{BASE_URL}/tasks/{task_id}/result",
        headers=Headers,
        timeout=30,
    )
    resp.raise_for_status()
    print(resp.json().keys())
    return resp.json().get("recognition_result", "")


def main() -> None:
    images_b64 = [encode_image(img) for img in IMAGES]
    task_id = create_task(images_b64)

    status = wait_for_task(task_id)
    if status == "success":
        data = fetch_result(task_id)
        decoded = [decode_result(elem) for elem in data]
        for i, page in enumerate(decoded):
            save_result(page, f"page_{i}.json")
    else:
        print("Распознавание завершилось ошибкой")


if __name__ == "__main__":
    main()