Ha RunKeepert (ASICS) használtál futás, séta vagy kerékpározás rögzítésére, de szeretnél áttérni egy saját magad által üzemeltetett megoldásra, ez a leírás neked szól. Megmutatom, hogyan szinkronizálhatod automatikusan a RunKeeper tevékenységeidet egy Workout-Tracker példányba.
Mi az a Workout-Tracker?
A Workout-Tracker egy nyílt forráskódú, saját kezelésű webalkalmazás személyes fitnesztevékenységek követésére. Támogatja a GPX, FIT és TCX fájlformátumokat, részletes statisztikákat biztosít térképekkel, kilométerenkénti bontással, szintprofilokkal, valamint pulzus- és kadencia adatokkal. Nagyon egyszerű és kevés erőforrást igényel (Go + SQLite) és tökéletesen fut Dockerben.


Workout-Tracker futtatása Dockerrel
A Workout-Tracker indulása egyszerű. Íme egy minta docker-compose.yml:
version: '3'
services:
workout-tracker:
image: ghcr.io/jovandeginste/workout-tracker:latest
container_name: workout-tracker
restart: unless-stopped
ports:
- 8080:8080
environment:
- WT_BIND=[::]:8080
- WT_JWT_ENCRYPTION_KEY=change-this-to-a-random-secret
- WT_LOGGING=true
volumes:
- ./database.db:/data/database.db
- ./imports:/home/workout/imports
A WT_JWT_ENCRYPTION_KEY a munkamenetek titkosításához kell. Generálj hozzá egy véletlenszerű karaktersorozatot. A ./imports mappába GPX fájlokat dobva az alkalmazás automatikusan importálja azokat — a beépített feldolgozó körülbelül 60 másodpercenként ellenőrzi ezt a könyvtárat.
A probléma: Adatok kinyerése RunKeeperből
A RunKeeper (ma az ASICS tulajdona) lehetővé teszi az adatok manuális exportálását az Export Data oldalon, ami egy ZIP fájlt ad, egyedi GPX fájlokkal és egy CSV összesítővel. Ez működik, de manuális folyamat — be kell jelentkezni, exportálni, várni az emailre, letölteni, kicsomagolni, majd feltölteni a Workout-Trackerbe.
A RunKeeper hivatalos Health Graph API-ját 2017 körül zárták le az új fejlesztők számára, így a hagyományos API hozzáférés nem elérhető.
A megoldás: A privát API visszafejtése
A RunKeeper mobilalkalmazás egy privát API-val kommunikál a fitnesskeeperapi.com címen. Ez az API még mindig aktív, és a hivatalos iOS és Android alkalmazások használják. A dpadgett/RunKeeper-export projekt visszafejtette ezt az API-t, és megmutatta, hogyan lehet kinyerni egy hosszú élettartamú Bearer tokent a mobilalkalmazásból.
Erre a felfedezésre építve készítettem egy Python szkriptet, amely:
- Lekéri a tevékenységek UUID-it a privát API-ból
- Letölti a részletes JSON adatokat GPS útvonallal, pulzussal és kadenciával
- GPX formátumba konvertálja
- Importálja a Workout-Trackerbe a REST API-n vagy az auto-import mappán keresztül
Hogyan szerezd meg a Bearer tokent
iOS-en (Ajánlott: Proxyman)
Nincs szükség számítógépre — minden az iPhone-odon fut:
- Töltsd le a Proxyman alkalmazást az App Store-ból (ingyenes)
- Nyisd meg a Proxyman → „Start Monitoring” — létrehoz egy helyi VPN-t a telefonodon
- Telepítsd a CA tanúsítványt, ha kéri (Beállítások → Profil → Telepítés → Engedélyezés a Tanúsítvány bizalom beállításokban)
- Nyisd meg a RunKeeper alkalmazást, és frissítsd a hírfolyamot vagy rögzíts egy edzést
- Térj vissza a Proxymanbe, keresd meg a
fitnesskeeperapi.comkéréseket - Koppints bármelyik kérésre → Headers → keresd az
Authorization: Bearer <token>sort - Másold ki a token értékét
- Állítsd le a megfigyelést Proxymanben
Androidon (mitmproxy)
- Telepítsd az Android Studio-t, és hozz létre egy virtuális eszközt (Google Play nélküli rendszerképet használj)
- Telepítsd a mitmproxy-t a számítógépedre
- Állítsd be az emulátort, hogy megbízzon a mitmproxy CA tanúsítványában
- Telepítsd a RunKeeper APK-t az emulátorra (APKPure-ról vagy hasonlóról)
- Állítsd be az emulátor WiFi proxy-ját a mitmproxy példányodra
- Jelentkezz be a RunKeeperbe az emulátoron
- A mitmproxy-ben keresd a
fitnesskeeperapi.comkéréseket - Másold ki az
Authorization: Bearerfejléc értékét
A szinkronizációs szkript
A szkript elérhető GitHub-on egyetlen Python fájlként: runkeeper-sync.py
Működés — ASCII folyamatábra
┌─────────────────────┐ ┌───────────────────────┐
│ RunKeeper App │ │ fitnesskeeperapi.com │
│ (iOS/Android) │─────▶│ (Privát Mobil API) │
└─────────────────────┘ └───────────┬───────────┘
│ GET /getActivityUUIDs
│ POST /activities
│ Auth: Bearer <token>
▼
┌─────────────────────┐
│ runkeeper-sync.py │
│ - Új UUID-k lekérése│
│ - JSON letöltése │
│ - GPX konvertálás │
│ - Importálás │
└──────────┬──────────┘
│ GPX fájl vagy API hívás
▼
┌─────────────────────┐
│ Workout-Tracker │
│ (Docker konténer) │
│ :8080-as porton │
└─────────────────────┘
Telepítés
A szkript Python 3-at és a requests könyvtárat igényli:
sudo apt-get install -y python3-requests
Hozz létre egy konfigurációs fájlt ~/.runkeeper-sync/config.json néven:
{
"email": "your-runkeeper-email@example.com",
"token": "your-bearer-token-here",
"workout_tracker_url": "http://localhost:8080",
"workout_tracker_api_key": "your-workout-tracker-api-key",
"import_method": "api"
}
Ezt a konfigurációt interaktívan is létrehozhatod:
python3 runkeeper-sync.py --setup
API kulcs szerzése a Workout-Trackerben
Jelentkezz be a Workout-Tracker webes felületére, menj a profilodra, és ott találod az API kulcsot. Győződj meg róla, hogy az „API Active” be van kapcsolva a profilbeállításokban.
A szinkronizáció futtatása
# Összes előzmény importálása (egyszeri)
python3 runkeeper-sync.py --bulk
# Növekményes szinkronizáció (csak új tevékenységek)
python3 runkeeper-sync.py --once
# Teszt importálás nélkül
python3 runkeeper-sync.py --dry-run
Automatikus óránkénti szinkron (Cron)
Az automatikus óránkénti szinkronizációhoz add hozzá a crontab-odhoz:
0 * * * * /usr/bin/python3 /path/to/runkeeper-sync.py --once >> /var/log/runkeeper-sync.log 2>&1
Vagy használd a szkript beépített cron telepítőjét:
python3 runkeeper-sync.py --install-cron
Hogyan működik a deduplikáció
A szkript okosan elkerüli a duplikált edzések importálását:
- Dátum alapú dedup: Letöltés előtt lekéri a Workout-Tracker összes meglévő edzésdátumát, és kihagyja azokat, amelyek már megegyeznek valamelyik kezdési időponttal
- UUID követés: Nyilvántartja a már feldolgozott UUID-ket egy állapotfájlban, így ha a szkript megszakad, onnan folytathatja, ahol abbahagyta
- API szintű dedup: Maga a Workout-Tracker import API is elutasítja az azonos kezdési időpontú duplikátumokat
Mi a helyzet a GPS nélküli tevékenységekkel?
A szkript csak azokat a tevékenységeket importálja, amelyek rendelkeznek GPS útvonal adatokkal. A manuálisan rögzített tevékenységek (futópad, erősítés, stb.) nem konvertálhatók GPX-be, ezeket a szkript kihagyja. Az UUID-jeiket eltárolja, így a későbbi futtatások során nem kerülnek újra feldolgozásra.
A teljes szkript
A teljes forráskód elérhető az alábbi tárolóban. Egyetlen Python fájl (~800 sor) az összes funkcióval:
- API kommunikáció a
fitnesskeeperapi.com-mal - GPX konvertálás pulzussal és kadenciával
- Kétféle importálási mód (REST API vagy auto-import mappa)
- Növekményes és teljes szinkronizációs mód
- Száraz futtatás teszteléshez
- Állapotmegőrzés a folytathatóságért
- Interaktív telepítő varázsló
Letöltés: https://blog.xorp.hu/wp-content/uploads/2026/07/runkeeper-sync.py
Fontos biztonsági megjegyzések
- A Bearer token hozzáférést ad a RunKeeper adataidhoz — kezeld úgy, mint egy jelszót
- Tárold jelszókezelőben, ne a szkript fájlban
- Használj környezeti változókat vagy külön konfigurációs fájlt korlátozott jogosultságokkal (
chmod 600) - A token hosszú élettartamúnak tűnik, de ha érvénytelenné válik, extractáld újra a mobilalkalmazásból
- A fitnesskeeperapi.com egy privát API — az ASICS bármikor megváltoztathatja vagy leállíthatja
Összegzés
Ezzel a beállítással a RunKeeper tevékenységeid automatikusan áramlanak a saját Workout-Tracker példányodba, manuális beavatkozás nélkül. Beállítás után az új edzések körülbelül egy órán belül megjelennek — teljesen automatikusan. Ugyanez a megközelítés más saját üzemeltetésű fitneszkövetőkhöz is adaptálható, amelyek támogatják a GPX importot.

El-ké-pesz-tő!
Aranyos „kis” project! Gratula hozzá! 👍