feat: Telegram Mini App integration and UX improvements
- Добавлена полная интеграция с 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 интеграции
This commit is contained in:
124
docs/N8N_FLIGHTS_BROWSERLESS_PDF_V2.js
Normal file
124
docs/N8N_FLIGHTS_BROWSERLESS_PDF_V2.js
Normal file
@@ -0,0 +1,124 @@
|
||||
// ============================================================================
|
||||
// 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
|
||||
// ============================================================================
|
||||
Reference in New Issue
Block a user