- Добавлена полная интеграция с 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 интеграции
100 lines
3.8 KiB
JavaScript
100 lines
3.8 KiB
JavaScript
// ============================================================================
|
||
// n8n Code Node: HTML → PDF через Browserless
|
||
// ============================================================================
|
||
// Используйте этот код ПОСЛЕ ноды, которая вернула HTML или html_base64
|
||
// Подготавливает запрос для HTTP Request ноды к Browserless
|
||
// ============================================================================
|
||
|
||
// Получаем HTML из предыдущей ноды
|
||
let html = null;
|
||
|
||
// Вариант 1: HTML уже есть в json.html
|
||
if ($json.html) {
|
||
html = $json.html;
|
||
}
|
||
// Вариант 2: HTML в base64
|
||
else if ($json.html_base64) {
|
||
html = Buffer.from($json.html_base64, 'base64').toString('utf8');
|
||
}
|
||
// Вариант 3: HTML в другом поле
|
||
else if ($json.body?.html) {
|
||
html = $json.body.html;
|
||
}
|
||
// Вариант 4: Пытаемся получить из binary
|
||
else if ($binary && $binary.data) {
|
||
html = $binary.data.toString('utf8');
|
||
}
|
||
else {
|
||
throw new Error('HTML не найден. Проверьте, что предыдущая нода вернула html или html_base64');
|
||
}
|
||
|
||
console.log('📄 HTML получен, длина:', html.length);
|
||
|
||
// ================== НАСТРОЙКИ BROWSERLESS ==================
|
||
const BROWSERLESS_URL = 'http://147.45.146.17:3000';
|
||
const BROWSERLESS_TOKEN = 'YOUR_TOKEN'; // ⚠️ ЗАМЕНИТЕ на ваш токен Browserless
|
||
|
||
// ================== ВАРИАНТ 1: Использование data URL ==================
|
||
// Browserless может принимать HTML через data URL
|
||
const htmlBase64 = Buffer.from(html, 'utf8').toString('base64');
|
||
const dataUrl = `data:text/html;base64,${htmlBase64}`;
|
||
|
||
return [{
|
||
json: {
|
||
// Данные для HTTP Request ноды
|
||
method: 'POST',
|
||
url: `${BROWSERLESS_URL}/pdf`,
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'Authorization': `Bearer ${BROWSERLESS_TOKEN}` // Если требуется токен
|
||
},
|
||
body: JSON.stringify({
|
||
url: dataUrl, // Передаём HTML через data URL
|
||
options: {
|
||
format: 'A4',
|
||
printBackground: true,
|
||
margin: {
|
||
top: '20mm',
|
||
right: '15mm',
|
||
bottom: '20mm',
|
||
left: '15mm'
|
||
}
|
||
}
|
||
}),
|
||
|
||
// Альтернативный вариант (если Browserless поддерживает прямой HTML)
|
||
body_alternative: JSON.stringify({
|
||
html: html, // Прямая передача HTML (если поддерживается)
|
||
options: {
|
||
format: 'A4',
|
||
printBackground: true,
|
||
margin: {
|
||
top: '20mm',
|
||
right: '15mm',
|
||
bottom: '20mm',
|
||
left: '15mm'
|
||
}
|
||
}
|
||
}),
|
||
|
||
// Метаданные
|
||
html_length: html.length,
|
||
data_url_length: dataUrl.length
|
||
}
|
||
}];
|
||
|
||
// ============================================================================
|
||
// ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ:
|
||
// ============================================================================
|
||
// 1. Замените YOUR_TOKEN на ваш реальный токен Browserless (если требуется)
|
||
// 2. Добавьте HTTP Request ноду после этого Code Node
|
||
// 3. В HTTP Request ноде настройте:
|
||
// - Method: {{ $json.method }}
|
||
// - URL: {{ $json.url }}
|
||
// - Headers: {{ $json.headers }}
|
||
// - Body: {{ $json.body }}
|
||
// - Response Format: Binary (или JSON, если Browserless возвращает base64)
|
||
// 4. После HTTP Request добавьте Code Node для извлечения base64 из ответа
|
||
// (используйте N8N_EXTRACT_BASE64_FROM_RESPONSE.js)
|
||
// ============================================================================
|