# Flugstatus

Live-Flugstatus integrieren — Polling-Muster, Zuordnung der Statuswerte und Anzeige von Gate und Terminal.



Ausführbare Beispiele für die Live-Flugverfolgung mit dem Endpoint [Flugstatus](/docs/v31/flight-status). Jedes Skript beantwortet eine praktische Frage aus Disposition oder Überwachung — von der Prüfung eines einzelnen Flugs bis zum Aufbau einer Live-Abflugtafel.

| # | Frage                                             | Verwendete Daten |
| - | ------------------------------------------------- | ---------------- |
| 1 | Wie ist der aktuelle Status von Flug BA123?       | Flugstatus       |
| 2 | Hat Flug AA100 Verspätung, und wenn ja, wie viel? | Flugstatus       |
| 3 | Mehrere Flüge für eine Abflugtafel abfragen       | Flugstatus       |

<DocRequirements>
  <DocRequirementAuth />
</DocRequirements>

### Installation [#install]

Die folgenden Skripte verwenden `requests` für API-Aufrufe und `rich` für die Terminalausgabe. Einmalig installieren:

```bash
pip install requests rich
```

***

### 1. Übersicht des aktuellen Flugstatus [#1-current-flight-status-summary]

**Frage:** Wie ist der aktuelle Status von Flug BA123?

GET `/flight_status/BA123` liefert Live-Informationen zu Abflug und Ankunft. Die Felder für Gate, Terminal und Gepäck sind oft leere Strings — das Skript behandelt diese als unbekannt.

```python
import os

import requests
from rich.console import Console
from rich.panel import Panel
from rich.table import Table

console = Console()

HEADERS = {
    "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
    "X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"

STATUS_STYLE: dict[str, str] = {
    "En Route": "green",
    "Arrived": "green",
    "Departed": "green",
    "Delayed": "yellow",
    "Cancelled": "red",
    "Scheduled": "white",
    "Unknown": "white",
}


def fetch_flight_status(flight_number: str) -> dict | None:
    r = requests.get(
        f"{BASE}/flight_status/{flight_number}",
        headers=HEADERS,
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return None
    r.raise_for_status()
    return r.json()


def fmt_time(scheduled: str | None, actual: str | None) -> str:
    if not scheduled:
        return "—"
    if actual and actual != scheduled:
        return f"{scheduled} (actual {actual})"
    return scheduled


def main() -> None:
    data = fetch_flight_status("BA123")
    if not data:
        console.print("[yellow]Flight BA123 not found.[/]")
        return

    status = data.get("status", "Unknown")
    style = STATUS_STYLE.get(status, "white")
    dep = data.get("departure", {})
    arr = data.get("arrival", {})

    table = Table(title=f"Flight {data.get('flight_number', 'BA123')}")
    table.add_column("Field", style="cyan", min_width=20)
    table.add_column("Value")

    table.add_row("Airline", data.get("airline", "—"))
    table.add_row("Status", f"[{style}]{status}[/]")
    table.add_row("Aircraft", data.get("aircraft_type") or "—")
    table.add_row("Departure airport", f"{dep.get('airport_name', '—')} ({dep.get('airport', '—')})")
    table.add_row("Departure time", fmt_time(dep.get("scheduled_time"), dep.get("actual_time")))
    table.add_row("Arrival airport", f"{arr.get('airport_name', '—')} ({arr.get('airport', '—')})")
    table.add_row("Arrival time", fmt_time(arr.get("scheduled_time"), arr.get("actual_time")))

    delay = data.get("delay_minutes")
    if delay:
        table.add_row("Delay", f"[yellow]{delay} min[/]")

    console.print(table)


if __name__ == "__main__":
    main()
```

**Ausgabe:** Eine Tabelle mit Fluggesellschaft, Status (farbcodiert), Flugzeugtyp, Abflug- und Zielflughafen mit planmäßigen Zeiten sowie den Verspätungsminuten, sofern diese nicht null sind. Die tatsächliche Zeit wird angezeigt, wenn sie von der planmäßigen abweicht.

***

### 2. Verspätungsprüfung für einen bestimmten Flug [#2-delay-check-for-a-specific-flight]

**Frage:** Hat Flug AA100 Verspätung, und wenn ja, wie viel?

```python
import os

import requests
from rich.console import Console
from rich.panel import Panel
from rich.table import Table

console = Console()

HEADERS = {
    "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
    "X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"


def fetch_flight_status(flight_number: str) -> dict | None:
    r = requests.get(
        f"{BASE}/flight_status/{flight_number}",
        headers=HEADERS,
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return None
    r.raise_for_status()
    return r.json()


def main() -> None:
    data = fetch_flight_status("AA100")
    if not data:
        console.print("[yellow]Flight AA100 not found.[/]")
        return

    status = data.get("status", "Unknown")
    delay = data.get("delay_minutes") or 0
    dep = data.get("departure", {})

    gate = dep.get("gate", "") or ""
    terminal = dep.get("terminal", "") or ""
    gate_info = f"Gate {gate}" if gate else "Gate unknown"
    terminal_info = f"Terminal {terminal}" if terminal else "Terminal unknown"

    if delay > 0:
        body = (
            f"Flight {data.get('flight_number', 'AA100')} is delayed by [red bold]{delay} minutes[/].\n"
            f"Current status: {status}\n"
            f"Departure: {terminal_info}, {gate_info}"
        )
        console.print(Panel(body, title="[red]Delay Warning[/]", style="red"))
    else:
        body = (
            f"Flight {data.get('flight_number', 'AA100')} is on time.\n"
            f"Current status: {status}\n"
            f"Departure: {terminal_info}, {gate_info}"
        )
        console.print(Panel(body, title="[green]On Time[/]", style="green"))


if __name__ == "__main__":
    main()
```

**Ausgabe:** Ein farbiges Panel — rot mit den Verspätungsminuten, wenn der Flug verspätet ist, grün, wenn er pünktlich ist. Enthält den aktuellen Status sowie Abfluggate und Terminal, sofern verfügbar.

***

### 3. Live-Abflugtafel (mehrere Flüge) [#3-live-departure-board-multiple-flights]

**Frage:** Mehrere Flüge abfragen und eine kompakte Abflugtafel anzeigen.

```python
import os

import requests
from rich.console import Console
from rich.table import Table

console = Console()

HEADERS = {
    "X-RapidAPI-Key": os.getenv("RAPIDAPI_KEY", "YOUR_RAPIDAPI_KEY"),
    "X-RapidAPI-Host": "skylink-api.p.rapidapi.com",
}
BASE = "https://skylink-api.p.rapidapi.com"

FLIGHTS = ["BA123", "AA100", "UA1"]

STATUS_STYLE: dict[str, str] = {
    "En Route": "green",
    "Arrived": "green",
    "Departed": "green",
    "Delayed": "yellow",
    "Cancelled": "red",
    "Scheduled": "white",
    "Unknown": "dim",
}


def fetch_flight_status(flight_number: str) -> dict | None:
    r = requests.get(
        f"{BASE}/flight_status/{flight_number}",
        headers=HEADERS,
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return None
    r.raise_for_status()
    return r.json()


def main() -> None:
    table = Table(title="Departure Board")
    table.add_column("Flight", style="cyan")
    table.add_column("Airline")
    table.add_column("Status")
    table.add_column("Dep", min_width=5)
    table.add_column("Arr", min_width=5)
    table.add_column("Gate")

    for flight_number in FLIGHTS:
        try:
            data = fetch_flight_status(flight_number)
        except requests.HTTPError as exc:
            table.add_row(flight_number, "—", f"[red]Error {exc.response.status_code}[/]", "—", "—", "—")
            continue

        if not data:
            table.add_row(flight_number, "—", "[dim]Not found[/]", "—", "—", "—")
            continue

        status = data.get("status", "Unknown")
        style = STATUS_STYLE.get(status, "white")
        dep = data.get("departure", {})
        arr = data.get("arrival", {})
        gate = dep.get("gate", "") or "—"
        dep_time = dep.get("actual_time") or dep.get("scheduled_time") or "—"
        arr_time = arr.get("estimated_time") or arr.get("scheduled_time") or "—"

        table.add_row(
            data.get("flight_number", flight_number),
            data.get("airline", "—"),
            f"[{style}]{status}[/]",
            dep_time,
            arr_time,
            gate,
        )

    console.print(table)


if __name__ == "__main__":
    main()
```

**Ausgabe:** Eine kompakte Tabelle mit einer Zeile pro Flug, die Flugnummer, Fluggesellschaft, farbcodierten Status, Abflugzeit, Ankunftszeit und Gate zeigt. Flüge, die 404 zurückgeben, werden als „Not found“ angezeigt, ohne dass die Tafel abstürzt.
