- Добавлена полная интеграция с 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 интеграции
111 lines
4.1 KiB
JavaScript
111 lines
4.1 KiB
JavaScript
// ============================================================================
|
||
// 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
|
||
// ============================================================================
|