194 lines
6.8 KiB
Markdown
194 lines
6.8 KiB
Markdown
|
|
# Обработка данных о рейсах в n8n
|
|||
|
|
|
|||
|
|
## Описание
|
|||
|
|
|
|||
|
|
Код для обработки данных о рейсах из двух источников (FlightAware и FlightRadar24), объединения их и генерации красивого HTML для последующей конвертации в PDF.
|
|||
|
|
|
|||
|
|
## Структура входных данных
|
|||
|
|
|
|||
|
|
Workflow должен получать данные в следующем формате:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
[
|
|||
|
|
{
|
|||
|
|
"body": {
|
|||
|
|
"flights": [
|
|||
|
|
{
|
|||
|
|
"ident": "CES747",
|
|||
|
|
"registration": "B-1308",
|
|||
|
|
"origin": { "code_iata": "KMG", "name": "Kunming Changshui Int'l" },
|
|||
|
|
"destination": { "code_iata": "PVG", "name": "Shanghai Pudong Int'l" },
|
|||
|
|
...
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
"body": {
|
|||
|
|
"data": [
|
|||
|
|
{
|
|||
|
|
"flight": "MU747",
|
|||
|
|
"reg": "B-1308",
|
|||
|
|
"orig_iata": "KMG",
|
|||
|
|
"dest_iata": "PVG",
|
|||
|
|
...
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Установка в n8n
|
|||
|
|
|
|||
|
|
### Шаг 1: Добавить Code Node
|
|||
|
|
|
|||
|
|
1. В вашем workflow после получения данных из FlightAware и FlightRadar24
|
|||
|
|
2. Добавьте ноду **Code** (JavaScript)
|
|||
|
|
3. Назовите её: `Code: Process Flights Data`
|
|||
|
|
|
|||
|
|
### Шаг 2: Вставить код
|
|||
|
|
|
|||
|
|
Скопируйте содержимое файла `N8N_CODE_PROCESS_FLIGHTS_DATA.js` в Code Node.
|
|||
|
|
|
|||
|
|
### Шаг 3: Настройка выхода
|
|||
|
|
|
|||
|
|
Code Node вернёт объект с полями:
|
|||
|
|
- `html` - готовый HTML для конвертации в PDF
|
|||
|
|
- `flights` - массив объединённых данных о рейсах
|
|||
|
|
- `flights_count` - количество рейсов
|
|||
|
|
- `sources` - информация о доступности источников
|
|||
|
|
- `generated_at` - время генерации
|
|||
|
|
|
|||
|
|
## Конвертация HTML в Base64 PDF
|
|||
|
|
|
|||
|
|
### Вариант 1: HTTP Request → Base64 PDF (Рекомендуется)
|
|||
|
|
|
|||
|
|
**Шаг 1:** После Code Node добавьте Code Node с кодом из `N8N_FLIGHTS_PDF_BASE64_COMPLETE.js`
|
|||
|
|
- Этот код подготавливает запрос для HTTP Request
|
|||
|
|
|
|||
|
|
**Шаг 2:** Добавьте HTTP Request ноду:
|
|||
|
|
- Method: `POST`
|
|||
|
|
- URL: `{{ $json.http_url }}` (например, `https://api.htmlpdfapi.com/v1/pdf`)
|
|||
|
|
- Headers: `{{ $json.http_headers }}`
|
|||
|
|
- Body: `{{ $json.http_body }}`
|
|||
|
|
- Response Format: `JSON` или `Binary` (в зависимости от сервиса)
|
|||
|
|
|
|||
|
|
**Шаг 3:** После HTTP Request добавьте Code Node с кодом из `N8N_FLIGHTS_PDF_BASE64_FULL.js`
|
|||
|
|
- Этот код извлекает base64 из ответа сервиса
|
|||
|
|
|
|||
|
|
**Результат:** В выходных данных будет поле `pdf_base64` с готовым PDF в формате base64
|
|||
|
|
|
|||
|
|
### Вариант 2: Прямой запрос к сервису
|
|||
|
|
|
|||
|
|
Используйте код из `N8N_FLIGHTS_HTML_TO_PDF_EXAMPLE.js` для подготовки запроса к сервису конвертации.
|
|||
|
|
|
|||
|
|
**Популярные сервисы:**
|
|||
|
|
- **htmlpdfapi.com** - возвращает base64 в JSON
|
|||
|
|
- **pdfshift.io** - поддерживает base64
|
|||
|
|
- **api2pdf.com** - возвращает base64
|
|||
|
|
- **gotenberg.dev** - бесплатный self-hosted вариант
|
|||
|
|
|
|||
|
|
### Вариант 3: Execute Command с wkhtmltopdf
|
|||
|
|
|
|||
|
|
Если на сервере n8n установлен `wkhtmltopdf`:
|
|||
|
|
|
|||
|
|
1. Сохраните HTML во временный файл
|
|||
|
|
2. Выполните команду:
|
|||
|
|
```bash
|
|||
|
|
wkhtmltopdf --page-size A4 \
|
|||
|
|
--margin-top 20mm --margin-right 15mm \
|
|||
|
|
--margin-bottom 20mm --margin-left 15mm \
|
|||
|
|
--print-media-type input.html output.pdf && \
|
|||
|
|
cat output.pdf | base64
|
|||
|
|
```
|
|||
|
|
3. Получите base64 из вывода команды
|
|||
|
|
|
|||
|
|
### Использование base64 PDF
|
|||
|
|
|
|||
|
|
После получения base64 вы можете:
|
|||
|
|
- Сохранить в файл
|
|||
|
|
- Отправить по email
|
|||
|
|
- Загрузить в S3/Nextcloud
|
|||
|
|
- Вернуть в API response
|
|||
|
|
- Использовать в других workflow
|
|||
|
|
|
|||
|
|
## Особенности обработки
|
|||
|
|
|
|||
|
|
### Объединение данных
|
|||
|
|
|
|||
|
|
Данные объединяются по полю `registration` (номер самолёта):
|
|||
|
|
- FlightAware: `flight.registration`
|
|||
|
|
- FlightRadar24: `flight.reg`
|
|||
|
|
|
|||
|
|
Если для рейса есть данные только из одного источника, они всё равно будут отображены.
|
|||
|
|
|
|||
|
|
### Обработка отсутствующих данных
|
|||
|
|
|
|||
|
|
- Если данные из источника отсутствуют, показывается сообщение "Данные не получены"
|
|||
|
|
- Пустые значения отображаются как "—"
|
|||
|
|
- Даты форматируются в читаемый формат
|
|||
|
|
|
|||
|
|
### Форматирование
|
|||
|
|
|
|||
|
|
HTML включает:
|
|||
|
|
- Красивый дизайн с градиентами и карточками
|
|||
|
|
- Адаптивную вёрстку
|
|||
|
|
- Стили для печати (media queries для print)
|
|||
|
|
- Цветовую индикацию источников данных
|
|||
|
|
- Информацию о задержках (зелёный/красный)
|
|||
|
|
|
|||
|
|
## Пример workflow
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
HTTP Request (FlightAware)
|
|||
|
|
↓
|
|||
|
|
HTTP Request (FlightRadar24)
|
|||
|
|
↓
|
|||
|
|
Code: Process Flights Data ← Вставить код отсюда
|
|||
|
|
↓
|
|||
|
|
HTML/CSS to PDF (или HTTP Request для конвертации)
|
|||
|
|
↓
|
|||
|
|
Save File / Send Email / etc.
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Отладка
|
|||
|
|
|
|||
|
|
Если данные не обрабатываются:
|
|||
|
|
|
|||
|
|
1. Проверьте структуру входных данных через `console.log`:
|
|||
|
|
```javascript
|
|||
|
|
console.log('FlightAware:', JSON.stringify(flightAwareData, null, 2));
|
|||
|
|
console.log('FlightRadar24:', JSON.stringify(flightRadar24Data, null, 2));
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. Убедитесь, что данные приходят в правильном порядке:
|
|||
|
|
- Первый элемент = FlightAware
|
|||
|
|
- Второй элемент = FlightRadar24
|
|||
|
|
|
|||
|
|
3. Проверьте наличие полей `body.flights` и `body.data`
|
|||
|
|
|
|||
|
|
## Дополнительные возможности
|
|||
|
|
|
|||
|
|
### Кастомизация HTML
|
|||
|
|
|
|||
|
|
Вы можете изменить стили в функции `generateFullHTML()`:
|
|||
|
|
- Цвета
|
|||
|
|
- Шрифты
|
|||
|
|
- Размеры
|
|||
|
|
- Расположение элементов
|
|||
|
|
|
|||
|
|
### Добавление дополнительных полей
|
|||
|
|
|
|||
|
|
В функции `generateFlightCard()` можно добавить отображение дополнительных полей из API.
|
|||
|
|
|
|||
|
|
### Фильтрация рейсов
|
|||
|
|
|
|||
|
|
Перед генерацией HTML можно отфильтровать рейсы:
|
|||
|
|
```javascript
|
|||
|
|
const filteredFlights = mergedFlights.filter(flight => {
|
|||
|
|
// Ваша логика фильтрации
|
|||
|
|
return flight.flightAware || flight.flightRadar24;
|
|||
|
|
});
|
|||
|
|
```
|