# Flugzeugsuche

Abfrage des Luftfahrzeugregisters integrieren — Kennzeichen und ICAO24-Hexcode mit Anreicherung um Typ und Betreiber.



Lauffähige Beispiele, um Kennzeichen und ICAO-Hexcodes in Metadaten von Luftfahrzeugen aufzulösen. Felddefinitionen und Antwortstruktur finden Sie in der vollständigen Referenz [Flugzeugsuche](/docs/v31/aircraft-lookup).

| # | Frage                                                                               | Verwendete Daten                                          |
| - | ----------------------------------------------------------------------------------- | --------------------------------------------------------- |
| 1 | Welcher Flugzeugtyp fliegt unter dem Kennzeichen N636JB, und wer ist der Betreiber? | `/aircraft/registration/{registration}`                   |
| 2 | Ein Foto eines Flugzeugs anhand des Kennzeichens für eine Flottenanzeige abrufen    | `/aircraft/registration/{registration}` mit `photos=true` |
| 3 | Drei Kennzeichen gebündelt in Typen und Betreiber auflösen                          | `/aircraft/registration/{registration}`                   |

<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. Kennzeichen in Flugzeugtyp und Betreiber auflösen [#1-resolve-a-tail-number-to-aircraft-type-and-operator]

**Frage:** Welcher Flugzeugtyp ist N636JB, und wer betreibt das Flugzeug?

Registerabfragen sind der Ausgangspunkt für Analysen der Flottenzusammensetzung, Fotoanzeigen und die Verkettung mit Leistungsdaten. Das Feld `found` gibt Ihnen eine eindeutige Auskunft darüber, ob das Kennzeichen im SkyLink-Luftfahrzeugregister existiert.

```python
import os

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

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"

REGISTRATION = "N636JB"


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


def main() -> None:
    data = fetch_aircraft(REGISTRATION)

    if data is None or not data.get("found"):
        console.print(f"[yellow]⚠ Registration {REGISTRATION} not found in registry.[/yellow]")
        return

    ac = data["aircraft"]
    lines = [
        f"[bold]Registration:[/bold]  {ac['registration']}",
        f"[bold]ICAO24:[/bold]        {ac['icao24']}",
        f"[bold]ICAO Type:[/bold]     {ac['icao_type']}",
        f"[bold]Full Name:[/bold]     {ac['type_name']}",
        f"[bold]Operator:[/bold]      {ac['owner_operator']}",
    ]
    console.print(Panel("\n".join(lines), title=f"Aircraft — {REGISTRATION}", border_style="cyan"))


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

**Ausgabe:** Ein Panel mit Kennzeichen, Hexcode, ICAO-Musterkennung, vollständigem Typnamen und Betreiber.

> **Tipp:** Speichern Sie Registerantworten bis zu 24 Stunden im Cache — Registrierungsdaten von Luftfahrzeugen ändern sich selten, und wiederholte Abfragen desselben Kennzeichens verbrauchen unnötig Kontingent.

***

### 2. Flugzeugfoto anhand des Kennzeichens abrufen [#2-get-an-aircraft-photo-from-a-tail-number]

**Frage:** Gibt es für N636JB ein Community-Foto, das ich in einer Flottenkarte anzeigen kann?

Übergeben Sie `photos=true`, um das Array `photos` in die Antwort aufzunehmen. Fotos stammen aus der Community und sind nicht immer vorhanden — prüfen Sie vor dem Rendern die Länge des Arrays.

```python
import os

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

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"

REGISTRATION = "N636JB"


def fetch_aircraft_with_photos(registration: str) -> dict | None:
    r = requests.get(
        f"{BASE}/aircraft/registration/{registration}",
        headers=HEADERS,
        params={"photos": "true"},
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return None
    r.raise_for_status()
    return r.json()


def main() -> None:
    data = fetch_aircraft_with_photos(REGISTRATION)

    if data is None or not data.get("found"):
        console.print(f"[yellow]⚠ Registration {REGISTRATION} not found.[/yellow]")
        return

    ac = data["aircraft"]
    photos = ac.get("photos") or []

    if not photos:
        console.print(f"[yellow]No photos available for {REGISTRATION}.[/yellow]")
        console.print("Photos are community-sourced and may not be present for every aircraft.")
        return

    first_photo = photos[0]["image"]
    icao_type = ac["icao_type"]

    lines = [
        f"[bold]Registration:[/bold]  {ac['registration']}",
        f"[bold]Type:[/bold]          {ac['type_name']}",
        f"[bold]Operator:[/bold]      {ac['owner_operator']}",
        f"[bold]Photo URL:[/bold]     [link={first_photo}]{first_photo}[/link]",
        f"[bold]Total photos:[/bold]  {len(photos)}",
    ]
    console.print(Panel("\n".join(lines), title="Fleet Card", border_style="blue"))
    console.print(
        f"\n[dim]Chain to /aircraft/performance/{icao_type} for performance specs.[/dim]"
    )


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

**Ausgabe:** Ein Panel mit der URL des ersten Fotos, dem Typ und dem Betreiber. Sind keine Fotos verfügbar, wird eine Warnung ausgegeben.

> **Nächster Schritt:** Verketten Sie die Abfrage über das Feld `icao_type` mit [`/aircraft/performance/{icao_type}`](/docs/v31/aircraft-performance), um zusätzlich zum Foto die Leistungsdaten abzurufen.

***

### 3. Gebündelte Abfrage: mehrere Kennzeichen in Typen auflösen [#3-batch-lookup-resolve-multiple-tail-numbers-to-types]

**Frage:** Welche Typen und Betreiber gehören zu einer Liste von Kennzeichen aus verschiedenen Registern?

Verwenden Sie `ThreadPoolExecutor`, um Kennzeichen parallel abzurufen. Behandeln Sie `found=false` für nicht registrierte oder unbekannte Luftfahrzeuge ohne Absturz.

```python
import os
from concurrent.futures import ThreadPoolExecutor, as_completed

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"

REGISTRATIONS = ["N636JB", "G-EUUU", "D-AIBL"]


def fetch_aircraft(registration: str) -> tuple[str, dict | None]:
    r = requests.get(
        f"{BASE}/aircraft/registration/{registration}",
        headers=HEADERS,
        timeout=(10, 15),
    )
    if r.status_code == 404:
        return registration, None
    r.raise_for_status()
    return registration, r.json()


def main() -> None:
    results: dict[str, dict | None] = {}

    with ThreadPoolExecutor(max_workers=5) as pool:
        futures = {pool.submit(fetch_aircraft, reg): reg for reg in REGISTRATIONS}
        for future in as_completed(futures):
            reg, data = future.result()
            results[reg] = data

    table = Table(title="Batch Aircraft Lookup", border_style="cyan")
    table.add_column("Registration", style="bold")
    table.add_column("Found", justify="center")
    table.add_column("ICAO Type")
    table.add_column("Full Name")
    table.add_column("Operator")

    for reg in REGISTRATIONS:
        data = results.get(reg)
        if data is None or not data.get("found"):
            table.add_row(reg, "[red]✗[/red]", "—", "—", "—")
        else:
            ac = data["aircraft"]
            table.add_row(
                ac["registration"],
                "[green]✓[/green]",
                ac["icao_type"],
                ac["type_name"],
                ac["owner_operator"],
            )

    console.print(table)


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

**Ausgabe:** Eine Tabelle mit einer Zeile pro Kennzeichen: Registration | Found | ICAO Type | Full Name | Operator. Nicht aufgelöste Kennzeichen zeigen `✗` und Gedankenstriche.
