- Добавлена полная интеграция с 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 интеграции
141 lines
3.7 KiB
Markdown
141 lines
3.7 KiB
Markdown
# ✅ Рабочее решение: Обработка данных о рейсах → PDF
|
||
|
||
## Структура Workflow
|
||
|
||
```
|
||
[Входные данные: FlightAware + FlightRadar24]
|
||
↓
|
||
[Code: причесываем данные] ← Генерирует HTML и конвертирует в base64
|
||
↓
|
||
[HTTP Request: Browserless PDF] ← Конвертирует HTML в PDF через браузер
|
||
↓
|
||
[Результат: PDF binary]
|
||
```
|
||
|
||
---
|
||
|
||
## Нода 1: Code - "причесываем данные"
|
||
|
||
**Тип:** Code (JavaScript)
|
||
|
||
**Код:** См. файл `N8N_FLIGHTS_TO_BASE64.js`
|
||
|
||
**Что делает:**
|
||
1. Извлекает данные из структуры `[{ data: [{ body: { flights: [...] }}, { body: { data: [...] }}] }]`
|
||
2. Объединяет рейсы по `registration` (номер самолёта)
|
||
3. Генерирует красивый HTML с CSS
|
||
4. Конвертирует HTML в base64
|
||
|
||
**Выходные данные:**
|
||
```json
|
||
{
|
||
"html_base64": "PCFET0NUWVBFIGh0bWw+...",
|
||
"html": "<!DOCTYPE html>...",
|
||
"flights_count": 2,
|
||
"sources": {
|
||
"flightaware": { "available": true, "count": 2 },
|
||
"flightradar24": { "available": true, "count": 2 }
|
||
},
|
||
"generated_at": "2026-01-16T07:23:00.000Z"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Нода 2: HTTP Request - "Browserless PDF"
|
||
|
||
**Тип:** HTTP Request
|
||
|
||
**Настройки:**
|
||
|
||
- **Method:** `POST`
|
||
- **URL:** `http://147.45.146.17:3000/pdf?token=9ahhnpjkchxtcho9`
|
||
- **Send Body:** ✅ Да
|
||
- **Specify Body:** `JSON`
|
||
- **JSON Body:**
|
||
```json
|
||
{
|
||
"url": "data:text/html;base64, {{ $json.html_base64 }}",
|
||
"options": {
|
||
"format": "A4",
|
||
"printBackground": true,
|
||
"margin": {
|
||
"top": "20mm",
|
||
"right": "15mm",
|
||
"bottom": "20mm",
|
||
"left": "20mm"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**Response Format:** `Binary` (или `JSON`, если Browserless возвращает JSON)
|
||
|
||
---
|
||
|
||
## Результат
|
||
|
||
HTTP Request нода вернёт PDF в binary формате, который можно:
|
||
- Сохранить в файл
|
||
- Отправить по email
|
||
- Загрузить в S3/Nextcloud
|
||
- Конвертировать в base64 для API response
|
||
|
||
---
|
||
|
||
## Конвертация Binary PDF → Base64 (опционально)
|
||
|
||
Если нужен base64 PDF, добавьте Code Node после HTTP Request:
|
||
|
||
```javascript
|
||
const pdfBinary = $binary.data;
|
||
const base64 = Buffer.isBuffer(pdfBinary)
|
||
? pdfBinary.toString('base64')
|
||
: Buffer.from(pdfBinary).toString('base64');
|
||
|
||
const sizeBytes = Buffer.from(base64, 'base64').length;
|
||
|
||
return [{
|
||
json: {
|
||
pdf_base64: base64,
|
||
pdf_size_bytes: sizeBytes,
|
||
pdf_size_mb: (sizeBytes / (1024 * 1024)).toFixed(2),
|
||
success: true
|
||
}
|
||
}];
|
||
```
|
||
|
||
---
|
||
|
||
## Преимущества решения
|
||
|
||
✅ **Простота** - всего 2 ноды
|
||
✅ **Надёжность** - Browserless использует реальный браузер
|
||
✅ **Качество** - PDF с правильным форматированием и стилями
|
||
✅ **Гибкость** - можно легко изменить параметры PDF (формат, отступы)
|
||
|
||
---
|
||
|
||
## Отладка
|
||
|
||
Если что-то не работает:
|
||
|
||
1. **Проверьте HTML** - в Code Node добавьте:
|
||
```javascript
|
||
console.log('HTML length:', html.length);
|
||
console.log('HTML preview:', html.substring(0, 200));
|
||
```
|
||
|
||
2. **Проверьте base64** - в Code Node добавьте:
|
||
```javascript
|
||
console.log('Base64 length:', htmlBase64.length);
|
||
```
|
||
|
||
3. **Проверьте ответ Browserless** - в HTTP Request включите "Always Output Data" и проверьте ответ
|
||
|
||
---
|
||
|
||
## Готово! 🎉
|
||
|
||
Workflow работает и генерирует красивые PDF отчёты о рейсах!
|