KodoAI

Интеграция обработки изображений

Подключение к любому сайту через один HTTP-запрос — без установки и настройки.

🔑

Для работы нужен API-ключ

Получите его в личном кабинете — раздел API Keys. Ключ передаётся в каждом запросе как параметр api.

Получить ключ →

1. Быстрый старт

Оберните любую ссылку на изображение в нашу прокси-ссылку — и оно будет автоматически обработано.

Когда подходит этот способ:

  • Excel / Google Таблицы — просто замените ссылку на изображение на прокси-ссылку
  • Статичный HTML — вставить прокси-ссылку напрямую в <img src="...">
  • Быстрая проверка / тест — убедиться что интеграция работает без написания кода

Если у вас веб-приложение, CRM или каталог — используйте Сценарий 2 ниже.

Ваша ссылка https://your-site.com/uploads/photo.jpg
Как надо https://kodoai.ru/img?u=https://your-site.com/uploads/photo.jpg&api=YOUR_TOKEN
ваша ссылка ваш токен
Важно: Первые 10–60 секунд пользователь видит оригинал, потом — обработанную версию. Больше ничего не нужно.

2. Рекомендуемый: для веб-приложений и систем

Полный контроль

Подходит если вы внедряете обработку изображений в полноценное приложение — CRM, интернет-магазин, каталог, маркетплейс, личный кабинет и любые системы, где изображения хранятся в базе данных и отображаются регулярно.

Примеры кода ниже написаны на PHP / Laravel — для иллюстрации логики. Сама логика универсальна: таблица, две функции и фоновая задача реализуются на любом языке и фреймворке.

📐 Обязательные правила реализации

  1. 1. Нажатие кнопки / загрузка файла → POST → сохранить задачу со статусом pendingответить пользователю немедленно
  2. 2. Cron (каждую минуту) → проверять все pending → обновлять статус и url_done в БД
  3. 3. В шаблоне kodo_image() автоматически отдаёт нужную ссылку — прокси или готовое изображение

❌ Не делайте так — любой вид ожидания на стороне клиента или сервера

Вариант 1 — polling из браузера (JS):

// ❌ fetch в цикле, пока статус не станет done
while (true) {
    const { status } = await fetch('/api/task/status').then(r => r.json());
    if (status === 'done') break;
    await new Promise(r => setTimeout(r, 3000));
}

Вариант 2 — синхронное ожидание в запросе (PHP):

// ❌ sleep в цикле — блокирует поток, упадёт по таймауту
kodo_image_create($url);
do { sleep(5); $task = KodoTask::where('url_src', $url)->first(); }
while ($task->status !== 'done');
  • — При сотнях изображений — сотни параллельных запросов из браузера
  • — PHP/nginx обрывают соединение по таймауту (10–60 сек обработки)
  • Единственный правильный вариант — cron или фоновая задача на сервере

Шаг 1 — Создайте таблицу kodo_tasks

Schema::create('kodo_tasks', function ($table) {
    $table->id();
    $table->string('hash', 64)->unique();       // sha256(url + mode) — защита от дублей
    $table->text('url_src');                         // исходная ссылка на изображение
    $table->text('url_done')->nullable();             // ссылка на обработанное изображение
    $table->string('status')->default('pending');   // pending | done | queued
    $table->string('mode')->default('default');
    $table->timestamps();
});

Уникальный индекс на hash гарантирует, что одно изображение в одном режиме будет обработано только один раз, без лишних списаний.

Шаг 2 — Создайте файл kodo_helpers.php с двумя функциями

/**
 * Зарегистрировать изображение на обработку (платный вызов).
 * Если задача с таким hash уже существует — вернёт прокси-ссылку без нового списания.
 */
function kodo_image_create($url, $mode = 'default'): string
{
    $token = config('kodo.token');
    $proxy = 'https://kodoai.ru/img';
    $hash  = hash('sha256', $url . $mode);

    // Если уже есть — вернуть прокси-ссылку без нового запроса к API
    if (KodoTask::where('hash', $hash)->exists()) {
        return $proxy . '?u=' . urlencode($url) . '&api=' . $token . '&mode=' . $mode;
    }

    // Новая задача — запрос к API (списание баланса)
    KodoTask::create(['hash' => $hash, 'url_src' => $url, 'status' => 'pending', 'mode' => $mode]);
    Http::get($proxy, ['u' => $url, 'api' => $token, 'mode' => $mode]);

    return $proxy . '?u=' . urlencode($url) . '&api=' . $token . '&mode=' . $mode;
}

/**
 * Получить актуальную ссылку для отображения изображения.
 * done    → url_done из базы (обработанное изображение)
 * pending → прокси-ссылка (редиректит на оригинал, пока идёт обработка)
 * нет в таблице → оригинальная ссылка без изменений
 */
function kodo_image($url, $mode = 'default'): string
{
    $token = config('kodo.token');
    $hash  = hash('sha256', $url . $mode);
    $task  = KodoTask::where('hash', $hash)->first();

    if (!$task)                        return $url;
    if ($task->status === 'done')      return $task->url_done;
    return 'https://kodoai.ru/img?u=' . urlencode($url) . '&api=' . $token . '&mode=' . $mode;
}

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

Шаг 3 — Использование

Вариант A — при загрузке файла (upload):

// Файл загружен → зарегистрировать задачу и сразу вернуть ответ
kodo_image_create($product->image_url); // не ждём — задача создана, cron сам обновит
return response()->json(['status' => 'pending']); // отвечаем пользователю немедленно

Вариант B — пользователь нажал кнопку (ручной триггер):

// Кнопка "Обработать" → то же самое: создать задачу и вернуть pending
function handleProcessButton($imageUrl) {
    kodo_image_create($imageUrl); // регистрируем задачу
    return ['status' => 'pending', 'message' => 'Изображение поставлено в очередь'];
    // ✅ кнопка сразу разблокирована, пользователь не ждёт
}

В шаблоне — просто обернуть ссылку через хелпер:

// pending → отдаёт прокси-ссылку (пользователь видит оригинал)
// done    → отдаёт готовое обработанное изображение
<img src="{{ kodo_image($product->image_url) }}">

Шаг 4 — Фоновая задача синхронизации статусов

⚠️ Это обязательная часть архитектуры, не опция.
Без фоновой задачи статусы никогда не обновятся — все задачи навсегда останутся в статусе pending, а пользователи будут видеть только оригинальные изображения.

Cron раз в минуту проходит по всем записям со статусом pending, делает запрос к прокси без следования по редиректам и читает заголовок X-Image-Status. Как только статус стал done — сохраняет готовую ссылку из X-Image-Url в поле url_done и меняет статус записи. С этого момента kodo_image() начнёт отдавать уже обработанное изображение.

В зависимости от платформы это может быть: Cron Job, Scheduled Command, Background Worker, Task Scheduler — любой механизм периодического запуска кода.

Пример реализации на PHP / Laravel — фоновая команда синхронизации:

// Получить все задачи в ожидании
$pendingTasks = getPendingTasks(); // SELECT * FROM kodo_tasks WHERE status = 'pending'

foreach ($pendingTasks as $task) {
    // Сформировать прокси-ссылку и запросить заголовки (без редиректа)
    $proxyUrl = 'https://kodoai.ru/img?u=' . urlencode($task['url_src']) . '&api=TOKEN&mode=' . $task['mode'];
    $headers  = getHeadersWithoutRedirect($proxyUrl); // HEAD / GET без следования редиректу

    if ($headers['X-Image-Status'] === 'done') {
        // Обработка завершена — сохранить готовую ссылку и обновить статус
        updateTask($task['id'], [
            'status'   => 'done',
            'url_done' => $headers['X-Image-Url'],
        ]);
    }
    // pending / queued — пропустить, вернёмся на следующей итерации
}

Запустить этот код раз в минуту через cron сервера:

# crontab -e — универсальный способ для любого языка
* * * * * /path/to/your/sync-script >> /dev/null 2>&1
Итог: вызовы kodo_image_create + kodo_image — единственные точки интеграции. Один раз создать задачу, везде читать через хелпер. Дубликаты и лишние списания исключены на уровне хеша.

Справочник

Параметры запроса

GET https://kodoai.ru/img?u={url}&api={token}&mode={mode}
Параметр Обязательный Описание
uдаURL исходного изображения. Передавать через urlencode().
apiдаВаш API-токен.
modeнетРежим обработки. По умолчанию default.

Заголовки ответа

Заголовок Значение Когда присутствует
X-Image-Status done / pending / queued Всегда
X-Image-Url Прямая ссылка на обработанное изображение на CDN Только при done

Коды статусов

Статус Что значит Что делать
done Обработка завершена Взять ссылку из X-Image-Url и сохранить
pending Идёт обработка Повторить запрос через 5–10 секунд
queued В очереди — недостаточно баланса Повторить позже или пополнить баланс
Срок хранения: обработанные изображения хранятся на CDN 30 дней с момента последнего обращения. Если за это время никто не запросил картинку — она удаляется, и при следующем запросе обработка запустится заново.

Вернуться в личный кабинет