<?php
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
use Bitrix\Main\Loader;
Loader::includeModule("iblock");
$IBID = 14;
$STEP = 2; // по 2 элемента за шаг
$DELAY_SEC = 3; // пауза между шагами в секундах
$lastId = (int)($_POST['LAST_ID'] ?? 0);
// API
$url = 'https://api.aitunnel.ru/v1/chat/completions';
$api_key = 'sk-aitunnel-123TGjGiXf3VA';
// Получаем следующие 2 элемента
$el = new CIBlockElement();
$rsElements = CIBlockElement::GetList(
['ID' => 'ASC'],
[
'IBLOCK_ID' => $IBID,
'>ID' => $lastId
],
false,
['nTopCount' => $STEP],
['ID', 'NAME', 'DETAIL_TEXT']
);
$processed = 0;
while ($arElement = $rsElements->Fetch()) {
$id = (int)$arElement['ID'];
$name = trim($arElement['NAME']);
$desc = trim($arElement['DETAIL_TEXT'] ?? '');
echo "<p><strong>:f09f9484: Обработка ID {$id}</strong>: " . htmlspecialchars(substr($name, 0, 60)) . "…</p>\n";
$systemPrompt = "Ты — опытный автор объявлений для доски объявлений с б/у товарами. Пиши только сплошным текстом — никаких списков, маркированных пунктов, заголовков, жирного шрифта или спецсимволов. Описание должно быть информативным, честным (всегда уточняй, что товар б/у), подчёркивать практическую пользу, совместимость, состояние и особенности использования. Включи ключевые параметры: модель, тип вилок/розеток, максимальную нагрузку, габариты, вес, цвет, бренд — но интегрируй их естественно в повествование, без сухого перечисления. Не выдумывай параметры, которых нет в исходных данных. Сохрани нейтрально-доброжелательный тон, избегай шаблонных фраз вроде «не упусти шанс» или «только сегодня». Заверши призывом к действию: возможность осмотреть, забрать, отправить и т.п. Объём — около 1500 символов.";
$userPrompt = "Название: {$name}\nХарактеристики: {$desc}";
$data = [
'model' => 'gpt-5-mini',
'max_tokens' => 1000,
'temperature' => 0.5,
'messages' => [
['role' => 'system', 'content' => $systemPrompt],
['role' => 'user', 'content' => $userPrompt],
],
];
$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);
curl_close($ch);
if ($httpCode === 200 && $result) {
$resp = json_decode($result, true);
if (!empty($resp['choices'][0]['message']['content'])) {
$newText = trim($resp['choices'][0]['message']['content']);
// Обрезаем, если сильно превышает (~1600 симв. макс.)
if (mb_strlen($newText) > 1600) {
$newText = mb_substr($newText, 0, 1600) . '…';
}
$updateOk = $el->Update($id, ['DETAIL_TEXT' => $newText]);
if ($updateOk) {
echo "<p style='color:green;'>✅ ID {$id} — обновлён.</p>\n";
} else {
echo "<p style='color:red;'>❌ ID {$id} — ошибка обновления: " . htmlspecialchars($el->LAST_ERROR) . "</p>\n";
}
} else {
echo "<p style='color:orange;'>⚠️ ID {$id} — пустой ответ от ИИ.</p>\n";
}
} else {
echo "<p style='color:red;'>❌ ID {$id} — ошибка API (HTTP {$httpCode}): " . htmlspecialchars(substr($result, 0, 200)) . "</p>\n";
}
$lastId = $id;
$processed++;
}
if ($processed > 0) {
echo "<hr><p>Обработано: {$processed}. Следующий старт с ID: {$lastId}</p>";
?>
<form id="nextStep" method="POST">
<input type="hidden" name="LAST_ID" value="<?= htmlspecialchars($lastId) ?>">
<button type="submit">Следующий шаг (автозапуск через <span id="countdown"><?= $DELAY_SEC ?></span> с)</button>
</form>
<script>
let sec = <?= (int)$DELAY_SEC ?>;
const countdownEl = document.getElementById('countdown');
const interval = setInterval(() => {
sec--;
countdownEl.textContent = sec;
if (sec <= 0) {
clearInterval(interval);
document.getElementById('nextStep').submit();
}
}, 1000);
</script>
<?php
} else {
echo "<h2 style='color:green;'>✅ Все элементы обработаны!</h2>";
}
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php");
?> |