- Добавлена полная интеграция с 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 интеграции
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;
|
||
});
|
||
```
|