288 lines
12 KiB
HTML
288 lines
12 KiB
HTML
|
|
<!DOCTYPE html>
|
|||
|
|
<html lang="ru">
|
|||
|
|
<head>
|
|||
|
|
<meta charset="UTF-8">
|
|||
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|||
|
|
<title>🔍 Тест данных контекста</title>
|
|||
|
|
<style>
|
|||
|
|
body {
|
|||
|
|
font-family: Arial, sans-serif;
|
|||
|
|
margin: 20px;
|
|||
|
|
background: #f5f5f5;
|
|||
|
|
}
|
|||
|
|
.container {
|
|||
|
|
max-width: 800px;
|
|||
|
|
margin: 0 auto;
|
|||
|
|
background: white;
|
|||
|
|
padding: 20px;
|
|||
|
|
border-radius: 10px;
|
|||
|
|
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
|||
|
|
}
|
|||
|
|
.data-display {
|
|||
|
|
background: #2d3748;
|
|||
|
|
color: #e2e8f0;
|
|||
|
|
padding: 15px;
|
|||
|
|
border-radius: 8px;
|
|||
|
|
font-family: 'Courier New', monospace;
|
|||
|
|
white-space: pre-wrap;
|
|||
|
|
margin: 10px 0;
|
|||
|
|
}
|
|||
|
|
.test-button {
|
|||
|
|
background: #667eea;
|
|||
|
|
color: white;
|
|||
|
|
border: none;
|
|||
|
|
padding: 10px 20px;
|
|||
|
|
border-radius: 5px;
|
|||
|
|
cursor: pointer;
|
|||
|
|
margin: 10px 5px;
|
|||
|
|
}
|
|||
|
|
.test-button:hover {
|
|||
|
|
background: #5a67d8;
|
|||
|
|
}
|
|||
|
|
.status {
|
|||
|
|
padding: 10px;
|
|||
|
|
border-radius: 5px;
|
|||
|
|
margin: 10px 0;
|
|||
|
|
}
|
|||
|
|
.status.success {
|
|||
|
|
background: #d4edda;
|
|||
|
|
color: #155724;
|
|||
|
|
}
|
|||
|
|
.status.error {
|
|||
|
|
background: #f8d7da;
|
|||
|
|
color: #721c24;
|
|||
|
|
}
|
|||
|
|
</style>
|
|||
|
|
</head>
|
|||
|
|
<body>
|
|||
|
|
<div class="container">
|
|||
|
|
<h1>🔍 Тест данных контекста</h1>
|
|||
|
|
|
|||
|
|
<div class="status" id="status">Готов к тестированию</div>
|
|||
|
|
|
|||
|
|
<h2>📊 Текущие данные контекста:</h2>
|
|||
|
|
<div id="context-data" class="data-display">Нажмите "Получить данные"</div>
|
|||
|
|
|
|||
|
|
<button class="test-button" onclick="getContextData()">📊 Получить данные</button>
|
|||
|
|
<button class="test-button" onclick="testTypebotSend()">🚀 Тест отправки в Typebot</button>
|
|||
|
|
|
|||
|
|
<h2>🔧 Отладочная информация:</h2>
|
|||
|
|
<div id="debug-info" class="data-display">Нажмите "Показать отладку"</div>
|
|||
|
|
<button class="test-button" onclick="showDebugInfo()">🔍 Показать отладку</button>
|
|||
|
|
|
|||
|
|
<h2>📝 Логи:</h2>
|
|||
|
|
<div id="logs" class="data-display">Логи будут отображаться здесь</div>
|
|||
|
|
<button class="test-button" onclick="clearLogs()">🗑️ Очистить логи</button>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
let logs = [];
|
|||
|
|
|
|||
|
|
function log(message) {
|
|||
|
|
const timestamp = new Date().toLocaleTimeString();
|
|||
|
|
logs.push(`[${timestamp}] ${message}`);
|
|||
|
|
updateLogsDisplay();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function updateLogsDisplay() {
|
|||
|
|
document.getElementById('logs').textContent = logs.join('\n');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function clearLogs() {
|
|||
|
|
logs = [];
|
|||
|
|
updateLogsDisplay();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Функция для получения контекста CRM (улучшенная версия)
|
|||
|
|
function getCurrentContext() {
|
|||
|
|
const urlParams = new URLSearchParams(window.location.search);
|
|||
|
|
const projectId = urlParams.get('record') || '';
|
|||
|
|
|
|||
|
|
// Получаем данные из URL
|
|||
|
|
const currentModule = urlParams.get('module') || '';
|
|||
|
|
const currentView = urlParams.get('view') || '';
|
|||
|
|
|
|||
|
|
// Получаем данные из глобальных переменных CRM
|
|||
|
|
let userId = '';
|
|||
|
|
let userName = '';
|
|||
|
|
let userEmail = '';
|
|||
|
|
|
|||
|
|
// Пробуем разные способы получения данных пользователя
|
|||
|
|
if (typeof _USERMETA !== 'undefined' && _USERMETA.id) {
|
|||
|
|
userId = _USERMETA.id;
|
|||
|
|
userName = _USERMETA.user_name || '';
|
|||
|
|
userEmail = _USERMETA.email1 || '';
|
|||
|
|
} else if (typeof window.userId !== 'undefined') {
|
|||
|
|
userId = window.userId;
|
|||
|
|
} else if (typeof window.current_user_id !== 'undefined') {
|
|||
|
|
userId = window.current_user_id;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Получаем данные модуля
|
|||
|
|
let moduleName = currentModule;
|
|||
|
|
if (typeof _META !== 'undefined' && _META.module) {
|
|||
|
|
moduleName = _META.module;
|
|||
|
|
} else if (typeof window.module !== 'undefined') {
|
|||
|
|
moduleName = window.module;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Получаем данные представления
|
|||
|
|
let viewName = currentView;
|
|||
|
|
if (typeof _META !== 'undefined' && _META.view) {
|
|||
|
|
viewName = _META.view;
|
|||
|
|
} else if (typeof window.view !== 'undefined') {
|
|||
|
|
viewName = window.view;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Получаем название проекта/компании
|
|||
|
|
let projectName = '';
|
|||
|
|
try {
|
|||
|
|
const recordLabel = document.querySelector('.recordLabel, .record-name, h1');
|
|||
|
|
if (recordLabel) {
|
|||
|
|
projectName = recordLabel.textContent.trim();
|
|||
|
|
}
|
|||
|
|
} catch (e) {
|
|||
|
|
console.log('AI Drawer: Could not get project name:', e);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Получаем заголовок страницы
|
|||
|
|
let pageTitle = document.title || '';
|
|||
|
|
|
|||
|
|
// Получаем текущую дату
|
|||
|
|
const currentDate = new Date().toISOString();
|
|||
|
|
|
|||
|
|
const context = {
|
|||
|
|
projectId: projectId,
|
|||
|
|
module: moduleName,
|
|||
|
|
view: viewName,
|
|||
|
|
userId: userId,
|
|||
|
|
userName: userName,
|
|||
|
|
userEmail: userEmail,
|
|||
|
|
projectName: projectName,
|
|||
|
|
pageTitle: pageTitle,
|
|||
|
|
currentDate: currentDate,
|
|||
|
|
url: window.location.href,
|
|||
|
|
timestamp: Date.now()
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
console.log('AI Drawer: Context data:', context);
|
|||
|
|
return context;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getContextData() {
|
|||
|
|
log('🔄 Получение данных контекста...');
|
|||
|
|
|
|||
|
|
const context = getCurrentContext();
|
|||
|
|
const contextDisplay = document.getElementById('context-data');
|
|||
|
|
|
|||
|
|
// Форматируем данные для отображения
|
|||
|
|
const formattedData = JSON.stringify(context, null, 2);
|
|||
|
|
contextDisplay.textContent = formattedData;
|
|||
|
|
|
|||
|
|
log('✅ Данные контекста получены:');
|
|||
|
|
log(formattedData);
|
|||
|
|
|
|||
|
|
// Показываем статус
|
|||
|
|
const statusDiv = document.getElementById('status');
|
|||
|
|
statusDiv.className = 'status success';
|
|||
|
|
statusDiv.textContent = '✅ Данные контекста получены успешно';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async function testTypebotSend() {
|
|||
|
|
const context = getCurrentContext();
|
|||
|
|
const message = 'Тестовое сообщение из CRM';
|
|||
|
|
|
|||
|
|
log(`📤 Отправка тестового сообщения в Typebot...`);
|
|||
|
|
log(`📊 Контекст: ${JSON.stringify(context, null, 2)}`);
|
|||
|
|
|
|||
|
|
const statusDiv = document.getElementById('status');
|
|||
|
|
statusDiv.className = 'status';
|
|||
|
|
statusDiv.textContent = '⏳ Отправка в Typebot...';
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
const response = await fetch('/aiassist/typebot_proxy.php', {
|
|||
|
|
method: 'POST',
|
|||
|
|
headers: {
|
|||
|
|
'Content-Type': 'application/json',
|
|||
|
|
},
|
|||
|
|
body: JSON.stringify({
|
|||
|
|
action: 'startChat',
|
|||
|
|
message: message,
|
|||
|
|
context: context
|
|||
|
|
})
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
const result = await response.json();
|
|||
|
|
|
|||
|
|
log(`📥 Ответ от Typebot: ${JSON.stringify(result, null, 2)}`);
|
|||
|
|
|
|||
|
|
if (result.success) {
|
|||
|
|
statusDiv.className = 'status success';
|
|||
|
|
statusDiv.textContent = '✅ Сообщение отправлено успешно';
|
|||
|
|
} else {
|
|||
|
|
statusDiv.className = 'status error';
|
|||
|
|
statusDiv.textContent = `❌ Ошибка: ${result.error || 'Неизвестная ошибка'}`;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} catch (error) {
|
|||
|
|
log(`❌ Ошибка отправки: ${error.message}`);
|
|||
|
|
statusDiv.className = 'status error';
|
|||
|
|
statusDiv.textContent = `❌ Ошибка сети: ${error.message}`;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function showDebugInfo() {
|
|||
|
|
log('🔍 Сбор отладочной информации...');
|
|||
|
|
|
|||
|
|
const debugInfo = {
|
|||
|
|
// URL информация
|
|||
|
|
url: window.location.href,
|
|||
|
|
pathname: window.location.pathname,
|
|||
|
|
search: window.location.search,
|
|||
|
|
hash: window.location.hash,
|
|||
|
|
|
|||
|
|
// Доступные глобальные переменные
|
|||
|
|
globals: {
|
|||
|
|
_META: typeof _META !== 'undefined' ? _META : 'Не определено',
|
|||
|
|
_USERMETA: typeof _USERMETA !== 'undefined' ? _USERMETA : 'Не определено',
|
|||
|
|
_MODULE: typeof _MODULE !== 'undefined' ? _MODULE : 'Не определено',
|
|||
|
|
_VIEW: typeof _VIEW !== 'undefined' ? _VIEW : 'Не определено',
|
|||
|
|
window_userId: typeof window.userId !== 'undefined' ? window.userId : 'Не определено',
|
|||
|
|
window_module: typeof window.module !== 'undefined' ? window.module : 'Не определено',
|
|||
|
|
window_view: typeof window.view !== 'undefined' ? window.view : 'Не определено'
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// Параметры URL
|
|||
|
|
urlParams: Object.fromEntries(new URLSearchParams(window.location.search)),
|
|||
|
|
|
|||
|
|
// Информация о странице
|
|||
|
|
pageInfo: {
|
|||
|
|
title: document.title,
|
|||
|
|
referrer: document.referrer,
|
|||
|
|
userAgent: navigator.userAgent
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// Доступные элементы на странице
|
|||
|
|
elements: {
|
|||
|
|
recordLabel: document.querySelector('.recordLabel')?.textContent || 'Не найден',
|
|||
|
|
recordName: document.querySelector('.record-name')?.textContent || 'Не найден',
|
|||
|
|
h1: document.querySelector('h1')?.textContent || 'Не найден'
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const debugDisplay = document.getElementById('debug-info');
|
|||
|
|
debugDisplay.textContent = JSON.stringify(debugInfo, null, 2);
|
|||
|
|
|
|||
|
|
log('✅ Отладочная информация собрана');
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Автоматическое получение данных при загрузке
|
|||
|
|
window.addEventListener('load', function() {
|
|||
|
|
log('🚀 Страница тестирования загружена');
|
|||
|
|
getContextData();
|
|||
|
|
});
|
|||
|
|
</script>
|
|||
|
|
</body>
|
|||
|
|
</html>
|
|||
|
|
|