<?php
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
$IBID = 14;
$el = new CIBlockElement();
$url = 'https://api.aitunnel.ru/v1/chat/completions';
$api_key = 'sk-aitunnel-123456';
$ibClass = \Bitrix\Iblock\Iblock::wakeUp($IBID)->getEntityDataClass();
// Параметры пагинации
$pageSize = 100;
$offset = 0;
do {
echo "<h3>Обработка порции: " . ($offset + 1) . "–" . ($offset + $pageSize) . "</h3>\n";
flush(); // Отправляем буфер в браузер для мониторинга
// Получаем порцию элементов
$dbElements = $ibClass::getList([
'select' => ['ID', 'NAME', 'DETAIL_TEXT'],
'limit' => $pageSize,
'offset' => $offset,
'order' => ['ID' => 'ASC'],
])->fetchAll();
if (empty($dbElements)) {
echo "✅ Все элементы обработаны.<br>";
break;
}
foreach ($dbElements as $element) {
$id = $element['ID'];
$name = trim($element['NAME']);
$desc = trim($element['DETAIL_TEXT'] ?? '');
echo "Обрабатываю ID {$id}: " . htmlspecialchars(substr($name, 0, 50)) . "…<br>";
flush();
$prompt = "Ты — опытный автор объявлений для доски объявлений с б/у товарами. На основе названия и технических характеристик товара составь продающее описание объёмом около 1500 символов. Пиши только сплошным текстом — никаких списков, маркированных пунктов, заголовков, жирного шрифта или спецсимволов. Описание должно быть информативным, честным (указывай, что товар б/у), подчёркивать практическую пользу, совместимость, состояние и особенности использования. Включи ключевые параметры: модель, тип вилок/розеток, максимальную нагрузку, габариты, вес, цвет, бренд — но интегрируй их естественно в повествование, без сухого перечисления. Не выдумывай параметры, которых нет в исходных данных. Сохрани нейтрально-доброжелательный тон, избегай шаблонных фраз вроде «не упусти шанс». Заверши призывом к действию: возможность осмотреть, забрать, отправить и т.п.\n\nНазвание товара: {$name}\nДополнительные характеристики (если есть): {$desc}";
$data = [
'model' => 'gpt-5-mini',
'max_tokens' => 1000,
'temperature' => 0.5,
'messages' => [
['role' => 'user', 'content' => $prompt],
],
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Authorization: Bearer ' . $api_key,
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($httpCode === 200 && $result) {
$responseData = json_decode($result, true);
if (!empty($responseData['choices'][0]['message']['content'])) {
$newText = trim($responseData['choices'][0]['message']['content']);
// Опционально: обрезаем до ~1600 симв., чтобы точно уложиться
if (mb_strlen($newText) > 1600) {
$newText = mb_substr($newText, 0, 1600) . '…';
}
$updateResult = $el->Update($id, ['DETAIL_TEXT' => $newText]);
if ($updateResult) {
echo "✅ ID {$id} обновлён.<br>";
} else {
echo "❌ Не удалось обновить ID {$id}: " . $el->LAST_ERROR . "<br>";
}
} else {
echo "⚠️ Пустой ответ от API для ID {$id}<br>";
}
} else {
echo "❌ Ошибка API (HTTP {$httpCode}) для ID {$id}: " . ($error ?: $result) . "<br>";
}
// Пауза между запросами — защита от рейт-лимита
usleep(500000); // 0.5 секунды
}
$offset += $pageSize;
echo "<hr>";
} while (count($dbElements) === $pageSize);
echo "<h2>✅ Обработка завершена.</h2>";
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/epilog_after.php'); |