Files
crm.clientright.ru/testgpt3.php

236 lines
11 KiB
PHP
Raw Permalink Normal View History

<?php
define('LOG_FILE', 'logs/CheckPDF17.log');
define('OPENAI_API_KEY', 'sk-GS24OxHQYfq8ErW5CRLoN5F1CfJPxNsY');
//define('OPENAI_API_URL', 'https://api.proxyapi.ru/openai/v1/files');
define('OPENAI_API_URL', 'https://api.proxyapi.ru/openai/v1/chat/completions');
// 🔹 Функция логирования
function logMessage($message) {
file_put_contents(LOG_FILE, date('Y-m-d H:i:s') . " - " . $message . "\n", FILE_APPEND);
}
// 🔹 Подключение к БД (данные оставлены для тестов)
$dbconfig = [
'db_server' => 'localhost',
'db_port' => '3306',
'db_username' => 'ci20465_72new',
'db_password' => 'EcY979Rn',
'db_name' => 'ci20465_72new',
'db_type' => 'mysqli'
];
$conn = new mysqli(
$dbconfig['db_server'],
$dbconfig['db_username'],
$dbconfig['db_password'],
$dbconfig['db_name'],
$dbconfig['db_port']
);
if ($conn->connect_error) {
logMessage("Ошибка подключения к БД: " . $conn->connect_error);
die(json_encode(["status" => "error", "message" => "Ошибка подключения к БД."]));
}
// Устанавливаем кодировку UTF-8
$conn->set_charset("utf8mb4");
// ✅ Получаем `$id` из POST-запроса
$id = $_POST['id'] ?? null;
if (!$id || !is_numeric($id)) {
logMessage("Ошибка: Некорректный ID.");
die(json_encode(["status" => "error", "message" => "Некорректный ID."]));
}
logMessage("Получен ID: $id");
// 🔹 SQL-запрос для получения файлов
$sql = "
SELECT n.title,
CASE WHEN a.storedname IS NOT NULL
THEN CONCAT(a.path, a.attachmentsid, '_', a.storedname)
ELSE CONCAT(a.path, a.attachmentsid, '_', a.name)
END AS filepath
FROM vtiger_senotesrel r
LEFT JOIN vtiger_notes n ON n.notesid = r.notesid
LEFT JOIN vtiger_crmentity e ON e.crmid = r.notesid
LEFT JOIN vtiger_seattachmentsrel r2 ON r2.crmid = r.notesid
LEFT JOIN vtiger_attachments a ON a.attachmentsid = r2.attachmentsid
WHERE r.crmid = ? AND e.deleted = 0
AND (a.type = 'application/pdf' OR a.type = 'application/octet-stream')
";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows == 0) {
logMessage("Ошибка: Данные не найдены в БД.");
die(json_encode(["status" => "error", "message" => "Нет данных."]));
}
// 🔹 Функция конвертации PDF в изображения
function convertPdfToImages($pdfPath, $outputDir) {
if (!file_exists($pdfPath)) {
logMessage("Ошибка: Файл $pdfPath не найден.");
return [];
}
// 🔹 Генерируем безопасное имя файла
$safePdfPath = "scanpdf/pdf_" . uniqid() . ".pdf";
if (!copy($pdfPath, $safePdfPath)) {
logMessage("Ошибка: Не удалось скопировать $pdfPath в $safePdfPath.");
return [];
}
logMessage("Файл скопирован в безопасное место: $safePdfPath");
// 🔹 Создаем временную папку для изображений
if (!file_exists($outputDir)) {
mkdir($outputDir, 0777, true);
}
// 🔹 Конвертация PDF -> JPG
$imagePattern = $outputDir . '/page-%03d.jpg';
$command = "convert -density 300 " . escapeshellarg($safePdfPath) . " -quality 90 " . escapeshellarg($imagePattern);
logMessage("Выполняем команду: $command");
exec($command, $output, $returnVar);
// 🔹 Удаляем временный PDF
unlink($safePdfPath);
if ($returnVar !== 0) {
logMessage("Ошибка при конвертации PDF в изображения.");
return [];
}
// 🔹 Получаем список созданных изображений
$images = glob($outputDir . '/*.jpg');
logMessage("Создано изображений: " . count($images));
return $images;
}
// 🔹 Обработка всех файлов
$files_data = [];
while ($row = $result->fetch_assoc()) {
$title = $row["title"];
$filePath = $row["filepath"];
$outputDir = "scanpdf/pdf_images_" . uniqid();
logMessage("Обрабатываем файл: " . $filePath);
if (!file_exists($filePath)) {
logMessage("Ошибка: Файл $filePath не найден.");
continue;
}
// 🔹 Конвертация PDF в изображения
$imageFiles = convertPdfToImages($filePath, $outputDir);
if (empty($imageFiles)) {
logMessage("Ошибка: Не удалось создать изображения для файла $filePath.");
continue;
}
// 🔹 Добавляем в список для анализа
$files_data[] = ["title" => $title, "images" => $imageFiles];
}
// 🔹 Отправка всех изображений в GPT
function analyzeDocumentsWithGPT($documents) {
logMessage("DEBUG: Получено для анализа: " . json_encode($documents, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
logMessage("Отправка запроса в GPT-4-Turbo...");
$task = "🔹 Отвечай по шаблону. **Задача**:
Проанализируй загруженные документы, выполнив следующие действия:
1️⃣ **Список файлов и проверка соответствия названий**
- Перечисли все загруженные файлы.
🔹 Внимательно анализируй изображения.
- Если изображение содержит текст, сначала **извлеки текст** и **проанализируй его содержание**.
- Укажи, если текст плохо читается или частично распознан.
- Если изображение не содержит текста, но является **важной частью документа**, опиши, что на нем изображено.
- Определи их содержимое (например, \"договор\", \"претензия\", \"ответ на претензию\", \"подтверждение оплаты\" и т. д.).
- Проверь, соответствует ли название файла его реальному содержимому.
- Если обнаружено несоответствие, укажи, в чем именно проблема.
2️⃣ **Краткий анализ спора**
- Определи **истца** (потребителя) и **ответчика** (компанию, на которую подана жалоба).
- Опиши **суть спора** (что произошло и какая проблема заявлена).
- Укажи **основные аргументы сторон** (что заявляет потребитель и какие возражения возможны у компании).
3️⃣ **Проверка на цензуру**
- Проверь документы на наличие **ненормативной лексики** и **нецензурных изображений**.
- **Анализируй изображения на наличие нецензурного контента, запрещенной символики, сцен насилия и других нарушений. Если найдены такие элементы, укажи это в отчете.**
- Если обнаружены изображения, укажи что именно и требуется ли их ручная проверка.
4️⃣ **Выдача итогового вердикта**
- **Прошло модерацию** если всё соответствует названию и нет проблем.
- **Не прошло модерацию (требуется участие человека)** если есть несоответствия или потенциальные проблемы (укажи, что именно требует ручной проверки).
5️⃣ **Характер спора**
- Дай краткую характеристику дела (например, \"некачественный товар\", \"товар не привезли\", \"не возвращают деньги\", \"некачественная услуга\" и т. д.).
📌 **Важно**:
Отчет должен быть структурированным, четким и лаконичным. Укажи, какими нормами права РФ будет регулироваться рассмотение данного спора. Если требуется ручная проверка, укажи приоритетные файлы для проверки.";
$body = json_encode([
// "model" => "o1-mini",
"model" => "gpt-4-turbo",
"messages" => [
["role" => "system", "content" => "Ты юридический аналитик. Анализируй изображения согласно задаче."],
["role" => "user", "content" => $task],
["role" => "user", "content" => json_encode($documents, JSON_UNESCAPED_UNICODE)]
],
"max_completion_tokens" => 4000
]);
logMessage("Запрос к GPT-4-Turbo: " . substr($body, 0, 1000));
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => OPENAI_API_URL,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $body,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer ' . OPENAI_API_KEY
]
]);
$response = curl_exec($curl);
curl_close($curl);
return json_decode($response, true);
}
logMessage("DEBUG: Данные перед отправкой в GPT: " . json_encode($files_data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
$gptAnalysis = analyzeDocumentsWithGPT($files_data);
logMessage("Ответ от GPT-4-Turbo: " . json_encode($gptAnalysis, JSON_UNESCAPED_UNICODE));
// Проверка корректности JSON
if (!isset($gptAnalysis['choices']) || empty($gptAnalysis['choices'])) {
logMessage("Ошибка: в JSON-ответе отсутствует ключ 'choices'.");
die(json_encode(["status" => "error", "message" => "Ошибка: в JSON-ответе отсутствует ключ 'choices'."]));
}
// Получаем контент
$content = $gptAnalysis['choices'][0]['message']['content'] ?? null;
if (!$content) {
logMessage("Ошибка: контент не найден в ответе от GPT.");
die(json_encode(["status" => "error", "message" => "Ошибка: контент не найден в ответе от GPT."]));
}
logMessage("DEBUG: Извлеченный контент: " . $content);
// Возвращаем JSON с контентом
echo json_encode(["status" => "complete", "content" => $content], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
?>