DeBank Portfolio Scraper
Erfasse umfassende Portfolio-Snapshots von DeBank mittels Browser-Automatisierung, mit optionaler OpenSea-Integration für Einstiegspreise von LP-Positionen.
Voraussetzungen
- Playwright MCP – Browser-Automatisierung zur DeBank-Navigation
- OpenSea MCP – NFT-/LP-Positionsdaten (optional, aber empfohlen)
- Node.js 18+ – Zur Ausführung von Persistenz-Skripten
- SQLite – Datenbank für historische Daten
Siehe references/setup-guide.md für Installationsdetails.
Verwendung
scrape-portfolio <wallet_address>
scrape-portfolio --all # Mehrere Wallets aus einer Konfigurationsdatei scrapen
Datenquellen
- DeBank (Playwright) – DeFi-Positionen, Wallet-Guthaben, Gesundheitsraten
- OpenSea API – NFT-Bestände (Uniswap-LP-Positions-NFTs mit Einstiegspreisen)
Anleitung
Schritt 1: Zu DeBank navigieren
browser_navigate: https://debank.com/profile/{address}
Schritt 2: Auf Seitenladung warten
browser_wait_for: time=5
Schritt 3: Snapshot erstellen
browser_snapshot
Schritt 4: Ausgeblendete Chains erweitern
Suche nach „Unfold X chains“ im Snapshot. Falls vorhanden:
browser_click: ref=<unfold_button_ref>
browser_wait_for: time=2
browser_snapshot
Schritt 5: Portfolio-Daten extrahieren
Analysiere den Snapshot und extrahiere:
Profil:
- Gesamtwert (z. B.
$36.694) - 24h-Änderung in Prozent
- Kontolater in Tagen
Chain-Aufteilung:
- Chain-Name, Wert, Prozentsatz
Wallet-Token:
- Symbol, Chain, Preis, Menge, USD-Wert
Protokoll-Positionen:
Für jedes Protokoll (Aave, Compound, Uniswap usw.):
- Protokollname und Chain
- Positionstyp (Kreditvergabe, Yield, Liquiditätspool)
- Gesundheitsrate (bei Kreditvergabepositionen)
- Bereitgestellte Vermögenswerte mit Mengen und Werten
- Geliehene Vermögenswerte mit Mengen und Werten
- LP-Guthaben und Pool-IDs
- Einforderbare Belohnungen
Schritt 6: NFT-Daten abrufen (OpenSea)
Rufe das OpenSea-MCP-Tool auf:
get_nft_balances:
address: {wallet_address}
sortBy: RECEIVED_DATE
limit: 100
Dies liefert Uniswap-LP-Positions-NFTs mit:
- Token-ID (Pool-ID)
- Erstellungsdatum (Positions-Einstiegsdatum)
- Pool-Details (Token-Paar, Gebührenstufe)
Schritt 7: NFT-Aktivitätsverlauf abrufen
get_activity:
entityType: profile
entityId: {wallet_address}
limit: 100
Dies liefert:
- Einstiegspreise für LP-Positionen
- Transaktions-Hashes
- Historische Mints/Transfers
Schritt 8: Daten strukturieren
Erstelle ein JSON, das dem Schema in references/debank-portfolio-schema.json entspricht:
{
"metadata": {
"source": "debank.com + opensea",
"scrapeTimestamp": "<ISO-Zeitstempel>",
"profileUrl": "https://debank.com/profile/{address}"
},
"profile": {
"address": "0x...",
"accountAgeDays": 510
},
"portfolio": {
"totalValueUsd": 36694,
"change24h": { "percent": 0.11, "direction": "up" },
"chainAllocation": [...],
"protocolAllocation": [...]
},
"wallet": {
"totalValueUsd": 374,
"tokens": [...]
},
"protocols": [...],
"nfts": {
"lpPositions": [...],
"other": [...]
},
"summary": {
"totalWalletValue": 374,
"totalDeFiValue": 36320,
"totalSupplied": 18810,
"totalBorrowed": 5167,
"totalLiquidityProvided": 12042,
"totalClaimableRewards": 105,
"activeProtocols": ["Aave V3", "Compound V3", "Uniswap V4", "Uniswap V3"],
"activeChains": ["Arbitrum", "Base", "Scroll"]
}
}
Schritt 9: Daten speichern
Nach der Strukturierung des JSON:
1. In temporäre Datei schreiben:
Speichere das JSON in einer temporären Datei (z. B. /tmp/portfolio-snapshot.json)
2. JSON-Snapshot speichern (Backup):
mkdir -p data/snapshots/{address}
# Schreibe nach data/snapshots/{address}/{YYYY-MM-DD}.json
3. In Datenbank persistieren:
cd scripts && npx ts-node debank-snapshot-saver.ts --file /tmp/portfolio-snapshot.json
Setze Umgebungsvariablen für den Datenbankspeicherort:
DB_PATH– Pfad zur SQLite-Datenbank (Standard:../data/portfolio.db)SNAPSHOTS_DIR– Pfad zu JSON-Snapshots (Standard:../data/snapshots)
Erstellte Datenbankeinträge (jeder Scrape FÜGT neue Zeilen hinzu, überschreibt nicht):
portfolio_snapshots– Gesamtwert + Chain-Aufschlüsselung (mit Zeitstempel)position_snapshots– Einzelne DeFi-Positionen (mit Zeitstempel)reward_history– Einforderbare Belohnungen (mit Zeitstempel)
Dies baut historische Daten für Trendanalysen auf. Abfragebeispiele:
-- Portfolio-Wert im Zeitverlauf
SELECT datetime(timestamp, 'unixepoch') as date, total_value
FROM portfolio_snapshots WHERE address = '0x...' ORDER BY timestamp;
-- Positionsänderungen im Zeitverlauf
SELECT datetime(timestamp, 'unixepoch') as date, protocol, net_value
FROM position_snapshots WHERE address = '0x...' ORDER BY timestamp;
Schritt 10: Ergebnisse melden
Gib eine Zusammenfassung aus:
Portfolio gescrapt für 0x5a8a...ed45:
GESAMTWERT: $36.694 (+0,11 % 24h)
CHAIN-AUFTEILUNG:
- Arbitrum: $26.011 (71 %)
- Base: $10.650 (29 %)
DEFI-POSITIONEN:
- Aave V3 (Arbitrum): $13.643 netto (Gesundheit: 2,84)
- Bereitgestellt: 18.784 USDC ($18.811)
- Geliehen: 1,0168 WETH ($3.011) + 0,0241 WBTC ($2.156)
- Compound V3 (Base): $10.635
- Bereitgestellt: 10.584 USDC
- Belohnungen: 1,5 COMP ($36)
- Uniswap V4: $6.900
- Pool #103120: WBTC/USDC
- Belohnungen: $50,21
- Uniswap V3: $5.142
- Pool #4721026: WBTC/WETH
- Belohnungen: $18,92
LP-POSITIONEN (von OpenSea):
- 11 Uniswap-Positions-NFTs
- Einstiegsverlauf seit Feb. 2025 erfasst
EINFORDERBARE BELOHNUNGEN: $105,27
- COMP: $36,12
- LP-Gebühren: $69,15
Daten gespeichert in:
- data/snapshots/{address}/{date}.json
- data/portfolio.db
Ratenbegrenzung
- Warte 30 Sekunden zwischen mehreren Wallet-Scrapes
- Falls DeBank eine Ratenbegrenzung anzeigt, 60 Sekunden warten und erneut versuchen
Fehlerbehandlung
- Seite lädt nicht: Melde „DeBank nicht erreichbar“, überspringe Wallet
- Keine Daten gefunden: Melde „Wallet möglicherweise leer oder ungültig“
- Teilweiser Fehler: Speichere, was gesammelt wurde, notiere Fehler
Datenbankschema
Vollständige Tabellendefinitionen siehe references/schema.sql:
| Tabelle | Zweck |
|---|---|
portfolio_snapshots | Gesamtwert + Chain-Aufschlüsselung pro Zeitstempel |
position_snapshots | Einzelne DeFi-Positionen mit Token/Belohnungen |
reward_history | Einforderbare Belohnungen im Zeitverlauf |
apy_history | APY-Verfolgung für Protokolle |
transactions | Vollständiger Transaktionsverlauf |