Files
aiform_prod/docs/N8N_EXTRACT_BASE64_FROM_RESPONSE.js
AI Assistant 2e45786e46 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 интеграции
2026-01-29 16:12:48 +03:00

111 lines
4.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ============================================================================
// n8n Code Node: Извлечение Base64 PDF из ответа HTTP Request
// ============================================================================
// Используйте этот код ПОСЛЕ HTTP Request ноды, которая конвертировала HTML в PDF
// ============================================================================
const response = $input.first();
if (!response) {
throw new Error('Ответ от HTTP Request не получен');
}
let base64 = null;
let pdfSize = 0;
// ==== ВАРИАНТ 1: Сервис вернул base64 в JSON ====
if (response.json) {
// htmlpdfapi.com возвращает: { pdf: "base64..." }
if (response.json.pdf) {
base64 = response.json.pdf;
pdfSize = Math.floor(base64.length * 0.75); // Примерный размер
}
// api2pdf.com возвращает: { Pdf: "base64..." }
else if (response.json.Pdf) {
base64 = response.json.Pdf;
pdfSize = Math.floor(base64.length * 0.75);
}
// pdfshift.io возвращает: { pdf: "base64..." }
else if (response.json.pdf) {
base64 = response.json.pdf;
pdfSize = Math.floor(base64.length * 0.75);
}
// Если base64 в другом поле
else if (response.json.base64) {
base64 = response.json.base64;
pdfSize = Math.floor(base64.length * 0.75);
}
// Если base64 в body
else if (response.json.body && typeof response.json.body === 'string') {
base64 = response.json.body;
pdfSize = Math.floor(base64.length * 0.75);
}
}
// ==== ВАРИАНТ 2: Сервис вернул binary PDF ====
if (!base64 && response.binary && response.binary.data) {
const pdfBinary = response.binary.data;
// Конвертируем binary в base64
if (Buffer.isBuffer(pdfBinary)) {
base64 = pdfBinary.toString('base64');
pdfSize = pdfBinary.length;
} else if (typeof pdfBinary === 'string') {
// Если уже base64 строка
base64 = pdfBinary;
pdfSize = Buffer.from(base64, 'base64').length;
} else {
// Пытаемся преобразовать
const buffer = Buffer.from(pdfBinary);
base64 = buffer.toString('base64');
pdfSize = buffer.length;
}
}
// ==== ВАРИАНТ 3: PDF в текстовом формате (base64 строка) ====
if (!base64 && response.json && typeof response.json === 'string') {
base64 = response.json;
pdfSize = Buffer.from(base64, 'base64').length;
}
// ==== ПРОВЕРКА РЕЗУЛЬТАТА ====
if (!base64) {
console.error('❌ Не удалось извлечь base64. Структура ответа:', Object.keys(response));
throw new Error('Не удалось извлечь base64 PDF из ответа. Проверьте формат ответа сервиса.');
}
// Проверяем, что это действительно base64
if (!/^[A-Za-z0-9+/=]+$/.test(base64)) {
throw new Error('Извлечённые данные не являются валидным base64');
}
const pdfSizeMB = (pdfSize / (1024 * 1024)).toFixed(2);
const timestamp = new Date().toISOString().split('T')[0];
const filename = `flights-report-${timestamp}.pdf`;
console.log('✅ Base64 PDF извлечён успешно');
console.log('📊 Размер PDF:', pdfSizeMB, 'MB');
// ==== ВОЗВРАТ РЕЗУЛЬТАТА ====
return [{
json: {
pdf_base64: base64,
pdf_size_bytes: pdfSize,
pdf_size_mb: pdfSizeMB,
filename: filename,
success: true,
generated_at: new Date().toISOString()
}
}];
// ============================================================================
// ИСПОЛЬЗОВАНИЕ РЕЗУЛЬТАТА:
// ============================================================================
// Теперь у вас есть base64 PDF в поле pdf_base64
// Вы можете:
// 1. Сохранить в файл
// 2. Отправить по email
// 3. Загрузить в S3/Nextcloud
// 4. Вернуть в API response
// ============================================================================