Dokumentacja techniczna API

Narzędzia dla programistów i power-userów
Sekcja przeznaczona do zaawansowanych użytkowników, znajdziesz tutaj wszystkie niezbędne informacje i narzędzia do efektywnego korzystania z API naszego serwisu internetowego. Wykorzystaj je do zaprojektowania własnych aplikacji, automatyzacji zadań lub integracji naszej bazy danych z twoimi systemami.

Konsola API (Python CLI)



Pełnofunkcjonalne narzędzie wiersza poleceń do zarządzania bazą plików WindowsBASE.pl. Za jego pomocą możesz wyszukiwać, pobierać i zarządzać plikami z poziomu terminala - bez konieczności korzystania z interfejsu webowego. Poniżej zamieszczamy krótką instrukcję instalacji oraz pełną dokumentację użytkowania.

Instalacja

Wymagania:
  • Python 3.7 lub nowszy (Linux- np: Ubuntu 18.04+ lub Windows 7 SP1+)
  • Moduł requests- zainstaluj za pomocą "pip"
Informacje o wersji:
  • Wersja pakietu CLI: 1.3.1
  • Ostatnia aktualizacja: 11.11.2025r.
Instalacja:
wget https://windowsbase.pl/api/data/apps/windowsbase-cli.py
pip install requests
python windowsbase-cli.py

// System Windows nie posiada domyślnie zainstalowanego narzędzia "wget". 
// Możesz je pobrać za pomocą komendy: winget install wget
// W przypadku systemu Linux należy jeszcze nadać uprawnienia do wykonywania kodu:
// chmod +x windowsbase-cli.py - przed jego uruchomieniem

Szczegółowy opis komend

Komenda: search

Opis: Wyszukuje pliki w bazie według podanych fraz (logika AND - wszystkie frazy muszą występować w nazwie)

Składnia:

windowsbase-cli.py search [frazy...] [--limit N] [--download]

Opcje:

  • frazy - jedna lub więcej fraz do wyszukania
  • --limit N - maksymalna liczba wyników (domyślnie: 50)
  • --download - automatycznie pobierz pierwszy znaleziony plik

Przykłady:

# Wyszukaj Windows 10 Pro
./windowsbase-cli.py search windows 10 pro

# Wyszukaj z limitem wyników
./windowsbase-cli.py search ubuntu 22.04 --limit 10

# Wyszukaj i pobierz od razu
./windowsbase-cli.py search "windows 11" --download

Komenda: download

Opis: Pobiera plik z bazy na lokalny dysk z progress barem

Składnia:

windowsbase-cli.py download [nazwa_pliku] [--output DIR]

Opcje:

  • nazwa_pliku - nazwa lub część nazwy pliku do pobrania
  • --output DIR lub -o DIR - katalog docelowy (domyślnie: bieżący)

Przykłady:

# Pobierz do bieżącego katalogu
./windowsbase-cli.py download "Windows_10_Pro_x64.iso"

# Pobierz do konkretnego katalogu
./windowsbase-cli.py download ubuntu-22.04 --output ~/Downloads/

# Pobierz z częściową nazwą
./windowsbase-cli.py download "windows 11" -o ./iso/

Komenda: list

Opis: Wyświetla listę dostępnych plików w bazie

Składnia:

windowsbase-cli.py list [--limit N] [--category CAT] [--refresh]

Opcje:

  • --limit N - liczba plików do wyświetlenia (domyślnie: 50)
  • --category CAT - filtruj po kategorii (np. Windows, Linux)
  • --refresh - wymuś odświeżenie cache (ignoruj lokalny cache)

Przykłady:

# Wyświetl 50 pierwszych plików
./windowsbase-cli.py list

# Wyświetl 200 plików
./windowsbase-cli.py list --limit 200

# Filtruj po kategorii
./windowsbase-cli.py list --category Windows --limit 100

# Odśwież cache i wyświetl
./windowsbase-cli.py list --refresh

Komenda: stats

Opis: Wyświetla statystyki bazy danych i informacje o aktualizacjach

Składnia:

windowsbase-cli.py stats

Wyświetlane informacje:

  • Status wszystkich serwerów API
  • Opóźnienia (latency) serwerów
  • Całkowita liczba plików w bazie
  • Rozkład plików po kategoriach
  • Data ostatniej aktualizacji cache

Przykład:

./windowsbase-cli.py stats

Komenda: ping

Opis: Monitoruje serwery WindowsBASE.pl w czasie rzeczywistym

Składnia:

windowsbase-cli.py ping [--count N] [--continuous]

Opcje:

  • --count N - liczba pingów do wykonania (domyślnie: 10)
  • --continuous lub -c - ciągły monitoring (odświeżanie co sekundę)

Wyświetlane metryki:

  • Opóźnienie (latency) - czas odpowiedzi w ms
  • Jitter - zmienność opóźnienia (stabilność połączenia)
  • Min/Avg/Max - minimalne, średnie i maksymalne opóźnienie
  • Packet loss - utrata pakietów w %

Przykłady:

# 10 pingów do każdego serwera
./windowsbase-cli.py ping

# 50 pingów
./windowsbase-cli.py ping --count 50

# Ciągły monitoring (CTRL+C aby zatrzymać)
./windowsbase-cli.py ping --continuous

# Skrócona forma ciągłego monitoringu
./windowsbase-cli.py ping -c

Uwaga: Tryb ciągły (--continuous) odświeża wyniki co sekundę. Naciśnij CTRL+C aby zatrzymać monitoring.

System Cache

CLI automatycznie cachuje listę plików lokalnie aby przyspieszyć kolejne operacje:

  • Lokalizacja cache: ~/.windowsbase_cache.json
  • Ważność cache: 24 godziny
  • Odświeżanie: Automatyczne po wygaśnięciu lub ręcznie przez --refresh

Zarządzanie cache:

# Wymuś odświeżenie cache
./windowsbase-cli.py list --refresh

# Usuń cache ręcznie
rm ~/.windowsbase_cache.json

Biblioteka JavaScript

Informacje o wersji:
  • Wersja pakietu JavaScript: 1.3.0
  • Ostatnia aktualizacja: 09.11.2025r.

Szybki start

Dodaj skrypt do swojej strony:

<script src="https://windowsbase.pl/api/data/apps/windowsbase-api.js"></script>

Przykłady użycia biblioteki JS

Wyszukiwanie pliku
// =============================================================================
// PRZYKŁAD 1: PROSTE WYSZUKIWANIE (nowe API)
// =============================================================================

async function simpleSearch() {
    // Wyszukaj pliki zawierające "windows 10"
    const results = await searchFile('windows 10');
    
    console.log(`Znaleziono ${results.length} plików:`);
    results.forEach(file => {
        console.log(`- ${file.name}`);
        console.log(`  Link: ${file.downloadLink}`);
    });
}

// =============================================================================
// PRZYKŁAD 2: WYSZUKIWANIE Z WIELOMA FRAZAMI
// =============================================================================

async function multipleTerms() {
    // Wyszukaj pliki zawierające WSZYSTKIE podane frazy
    const results = await searchFile(['windows', '10', 'pro', 'x64']);
    
    // Lub używając string ze spacjami (automatycznie rozdzieli na frazy)
    const results2 = await searchFile('windows 10 pro x64');
    
    return results;
}

// =============================================================================
// PRZYKŁAD 3: WYSZUKIWANIE Z LIMITEM
// =============================================================================

async function limitedSearch() {
    // Zwróć maksymalnie 10 wyników
    const top10 = await searchFile('office', { limit: 10 });
    
    // Zwróć WSZYSTKIE wyniki (bez limitu)
    const allResults = await searchFile('windows', { limit: 0 });
    
    return { top10, allResults };
}

// =============================================================================
// PRZYKŁAD 4: FILTROWANIE WYNIKÓW
// =============================================================================

async function filterResults() {
    // Wyszukaj wszystkie pliki Windows
    const allWindows = await searchFile('windows', { limit: 0 });
    
    // Filtruj tylko pliki ISO
    const onlyISO = allWindows.filter(file => 
        file.name.toLowerCase().endsWith('.iso')
    );
    
    // Filtruj tylko Windows 10
    const onlyWin10 = allWindows.filter(file => 
        file.name.toLowerCase().includes('10')
    );
    
    // Filtruj po rozmiarze nazwy (np. duże pliki mają długie nazwy)
    const largeFiles = allWindows.filter(file => 
        file.name.length > 50
    );
    
    return { onlyISO, onlyWin10, largeFiles };
}


// =============================================================================
// PRZYKŁAD 5: SORTOWANIE WYNIKÓW
// =============================================================================

async function sortResults() {
    const results = await searchFile('office', { limit: 0 });
    
    // Sortuj alfabetycznie
    const alphabetical = [...results].sort((a, b) => 
        a.name.localeCompare(b.name)
    );
    
    // Sortuj od Z do A
    const reverse = [...results].sort((a, b) => 
        b.name.localeCompare(a.name)
    );
    
    // Sortuj po długości nazwy
    const byLength = [...results].sort((a, b) => 
        a.name.length - b.name.length
    );
    
    return { alphabetical, reverse, byLength };
}


// =============================================================================
// PRZYKŁAD 6: STATYSTYKI WYSZUKIWANIA
// =============================================================================

async function searchStats() {
    const query = 'windows';
    const results = await searchFile(query, { limit: 0 });
    
    // Zlicz typy plików
    const extensions = {};
    results.forEach(file => {
        const ext = file.name.split('.').pop().toLowerCase();
        extensions[ext] = (extensions[ext] || 0) + 1;
    });
    
    // Znajdź najdłuższą nazwę
    const longest = results.reduce((a, b) => 
        a.name.length > b.name.length ? a : b
    );
    
    // Znajdź najkrótszą nazwę
    const shortest = results.reduce((a, b) => 
        a.name.length < b.name.length ? a : b
    );
    
    console.log('=== STATYSTYKI WYSZUKIWANIA ===');
    console.log('Zapytanie:', query);
    console.log('Znaleziono plików:', results.length);
    console.log('Typy plików:', extensions);
    console.log('Najdłuższa nazwa:', longest.name);
    console.log('Najkrótsza nazwa:', shortest.name);
    
    return { extensions, longest, shortest };
}
Pobieranie plików z bazy
// =============================================================================
// PRZYKŁAD 7: POBIERANIE LINKU DO PLIKU
// =============================================================================

async function downloadLink() {
    try {
        const file = await downloadFile('en_windows_10_pro_10162_x86_dvd.iso');
        
        console.log('Znaleziono plik:');
        console.log('Nazwa:', file.name);
        console.log('Link do strony pobierania:', file.downloadLink);
        console.log('Link bezpośredni:', file.directUrl);
        
        return file;
        
    } catch (error) {
        console.error('Nie znaleziono pliku:', error.message);
    }
}

// =============================================================================
// PRZYKŁAD 8: PRZYCISK POBIERANIA (nowe API)
// =============================================================================

async function downloadButton(fileName) {
    const button = document.querySelector(`button[data-file="${fileName}"]`);
    
    try {
        button.textContent = 'Przygotowuję...';
        button.disabled = true;
        
        // Globalna funkcja downloadFile()
        const file = await downloadFile(fileName);
        
        // Przekieruj na link pobierania
        window.location.href = file.directUrl;
        
        button.textContent = 'Pobierz';
        button.disabled = false;
        
    } catch (error) {
        alert('Nie można pobrać pliku: ' + error.message);
        button.textContent = 'Błąd!';
        setTimeout(() => {
            button.textContent = 'Pobierz';
            button.disabled = false;
        }, 2000);
    }
}

// =============================================================================

Przykładowy HTML dla przycisku:
<button data-file="Windows_10_Pro.iso" onclick="downloadButton('en_windows_10_pro_10162_x86_dvd.iso')">Pobierz</button>

// Zastąp wartość funkcji downloadButton() szulaną nazwą pliku.
Przeglądanie bazy
// =============================================================================
// PRZYKŁAD 9: STATUS BAZY DANYCH
// =============================================================================

async function checkStatus() {
    const status = await checkDBStatus();
    
    console.log('=== STATUS SERWERÓW ===');
    for (const [ip, server] of Object.entries(status.servers)) {
        if (ip === 'error') continue;
        console.log(`${ip}: ${server.status} (${server.latency}ms)`);
    }
    
    console.log('\n=== STATYSTYKI BAZY ===');
    console.log('Wersja:', status.database.version);
    console.log('Plików:', status.database.totalFiles);
    console.log('Rozmiar:', status.database.totalSize);
    console.log('Ostatnia aktualizacja:', status.database.lastUpdate);
    
    console.log('\n=== OSTATNIE ZMIANY ===');
    console.log('Dodane pliki:', status.changes.added);
    console.log('Usunięte pliki:', status.changes.removed);
    console.log('Zaktualizowane:', status.changes.updated);
    
    return status;
}
Caching bazy danych
// =============================================================================
// PRZYKŁAD 10: ZARZĄDZANIE CACHE 
// =============================================================================

async function cacheManagement() {
    // Sprawdź info o cache 
    const info = getCacheInfo();
    console.log('Cache info:', info);
    
    // Sprawdź wiek cache w godzinach
    const cacheAgeHours = info.cacheAge / (1000 * 60 * 60);
    console.log(`Cache age: ${cacheAgeHours.toFixed(2)} godzin`);
    
    // Jeśli cache jest stary (>12h), odśwież
    if (cacheAgeHours > 12) {
        console.log('Odświeżam cache...');
        await refreshCache(); 
    }
    
    // Wyczyść cache (następne zapytanie pobierze świeże dane)
    // clearCache();
    
    // Preload cache przy starcie aplikacji
    if (!info.hasCache) {
        console.log('Ładuję cache...');
        await refreshCache();
        console.log('Cache załadowany!');
    }
    
    // Sprawdź ścieżkę do proxy
    console.log('Proxy URL:', getProxyUrl());
}