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 отчёты о рейсах!
|