# Обработка данных о рейсах в 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; }); ```