- Добавлена полная интеграция с Telegram Mini App (динамическая загрузка SDK) - Отдельный компактный дизайн для Telegram Mini App - Добавлен loader при инициализации (предотвращает мелькание SMS-авторизации) - Улучшена навигация: кнопки "Назад" и "К списку заявок" теперь сохраняют авторизацию - Telegram Mini App: кнопка "Выход" просто закрывает приложение - Telegram Mini App: заявки "В работе" скрыты из списка - Веб-версия: для заявок "В работе" добавлена кнопка "Просмотреть в Telegram" (ссылка на @klientprav_bot) - Telegram Mini App: кнопки действий в черновиках расположены вертикально - Веб-версия: убрано отображение номера телефона в приветствии - Исправлена проблема с возвратом к списку черновиков (не требует повторной SMS-авторизации) - Заблокировано удаление и редактирование заявок со статусом "В работе" - Добавлена документация по Telegram Mini App интеграции
125 lines
4.0 KiB
JavaScript
125 lines
4.0 KiB
JavaScript
// ============================================================================
|
||
// n8n Code Node: HTML → PDF через Browserless (вариант с прямым HTML)
|
||
// ============================================================================
|
||
// Альтернативный вариант - передача HTML напрямую в body
|
||
// ============================================================================
|
||
|
||
// Получаем HTML из предыдущей ноды
|
||
let html = null;
|
||
|
||
if ($json.html) {
|
||
html = $json.html;
|
||
} else if ($json.html_base64) {
|
||
html = Buffer.from($json.html_base64, 'base64').toString('utf8');
|
||
} else if ($json.body?.html) {
|
||
html = $json.body.html;
|
||
} else if ($binary && $binary.data) {
|
||
html = $binary.data.toString('utf8');
|
||
} else {
|
||
throw new Error('HTML не найден');
|
||
}
|
||
|
||
console.log('📄 HTML получен, длина:', html.length);
|
||
|
||
// ================== НАСТРОЙКИ ==================
|
||
const BROWSERLESS_URL = 'http://147.45.146.17:3000';
|
||
const BROWSERLESS_TOKEN = 'YOUR_TOKEN'; // ⚠️ ЗАМЕНИТЕ на ваш токен
|
||
|
||
// ================== ВАРИАНТ: Использование /screenshot или /pdf ==================
|
||
// Browserless может иметь разные эндпоинты
|
||
|
||
// Вариант A: POST /pdf с HTML в body
|
||
const requestA = {
|
||
method: 'POST',
|
||
url: `${BROWSERLESS_URL}/pdf`,
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'Authorization': `Bearer ${BROWSERLESS_TOKEN}`
|
||
},
|
||
body: JSON.stringify({
|
||
html: html,
|
||
options: {
|
||
format: 'A4',
|
||
printBackground: true,
|
||
margin: { top: '20mm', right: '15mm', bottom: '20mm', left: '15mm' }
|
||
}
|
||
})
|
||
};
|
||
|
||
// Вариант B: POST /pdf с data URL
|
||
const htmlBase64 = Buffer.from(html, 'utf8').toString('base64');
|
||
const dataUrl = `data:text/html;base64,${htmlBase64}`;
|
||
|
||
const requestB = {
|
||
method: 'POST',
|
||
url: `${BROWSERLESS_URL}/pdf`,
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'Authorization': `Bearer ${BROWSERLESS_TOKEN}`
|
||
},
|
||
body: JSON.stringify({
|
||
url: dataUrl,
|
||
options: {
|
||
format: 'A4',
|
||
printBackground: true,
|
||
margin: { top: '20mm', right: '15mm', bottom: '20mm', left: '15mm' }
|
||
}
|
||
})
|
||
};
|
||
|
||
// Вариант C: POST /screenshot (если /pdf не работает)
|
||
const requestC = {
|
||
method: 'POST',
|
||
url: `${BROWSERLESS_URL}/screenshot`,
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'Authorization': `Bearer ${BROWSERLESS_TOKEN}`
|
||
},
|
||
body: JSON.stringify({
|
||
url: dataUrl,
|
||
options: {
|
||
type: 'pdf',
|
||
format: 'A4',
|
||
printBackground: true
|
||
}
|
||
})
|
||
};
|
||
|
||
return [{
|
||
json: {
|
||
// Используйте один из вариантов ниже
|
||
// Попробуйте сначала вариант A, если не работает - B, затем C
|
||
|
||
// === ВАРИАНТ A: Прямой HTML ===
|
||
method_a: requestA.method,
|
||
url_a: requestA.url,
|
||
headers_a: requestA.headers,
|
||
body_a: requestA.body,
|
||
|
||
// === ВАРИАНТ B: Data URL ===
|
||
method_b: requestB.method,
|
||
url_b: requestB.url,
|
||
headers_b: requestB.headers,
|
||
body_b: requestB.body,
|
||
|
||
// === ВАРИАНТ C: Screenshot (PDF) ===
|
||
method_c: requestC.method,
|
||
url_c: requestC.url,
|
||
headers_c: requestC.headers,
|
||
body_c: requestC.body,
|
||
|
||
// Метаданные
|
||
html_length: html.length,
|
||
instruction: 'Попробуйте сначала вариант A в HTTP Request ноде'
|
||
}
|
||
}];
|
||
|
||
// ============================================================================
|
||
// ОТЛАДКА:
|
||
// ============================================================================
|
||
// Если получаете ошибку аутентификации:
|
||
// 1. Проверьте, нужен ли токен для вашего Browserless
|
||
// 2. Если токен не требуется, уберите строку Authorization из headers
|
||
// 3. Проверьте документацию Browserless: https://docs.browserless.io
|
||
// ============================================================================
|