DeBankポートフォリオスクレイパー は何をしますか?
ブラウザ自動化を使用してDeBankから包括的なポートフォリオスナップショットをスクレイピングし、LPポジションのエントリー価格のためにOpenSeaとのオプション統合を提供します。
前提条件
- Playwright MCP - DeBankナビゲーションのためのブラウザ自動化
- OpenSea MCP - NFT/LPポジションデータ(推奨だが任意)
- Node.js 18+ - 永続化スクリプト実行用
- SQLite - 履歴データ用データベース
インストールの詳細は references/setup-guide.md を参照してください。
使用方法
scrape-portfolio <wallet_address>
scrape-portfolio --all # 設定ファイルから複数ウォレットをスクレイピング
データソース
- DeBank (Playwright) - DeFiポジション、ウォレット残高、健全性レート
- OpenSea API - NFT保有(エントリー価格付きのUniswap LPポジションNFT)
手順
ステップ 1: DeBankに移動
browser_navigate: https://debank.com/profile/{address}
ステップ 2: ページ読み込みを待機
browser_wait_for: time=5
ステップ 3: スナップショットを取得
browser_snapshot
ステップ 4: 隠れているチェーンを展開
スナップショット内に「Unfold X chains」があるか確認します。存在する場合:
browser_click: ref=<unfold_button_ref>
browser_wait_for: time=2
browser_snapshot
ステップ 5: ポートフォリオデータを抽出
スナップショットを解析し、以下を抽出します:
プロフィール:
- 総額(例:
$36,694) - 24時間変化率
- アカウント経過日数
チェーン配分:
- チェーン名、金額、パーセンテージ
ウォレットトークン:
- シンボル、チェーン、価格、数量、USD価値
プロトコルポジション: 各プロトコル(Aave, Compound, Uniswap など)について:
- プロトコル名とチェーン
- ポジションタイプ(Lending, Yield, Liquidity Pool)
- 健全性レート(貸出ポジションの場合)
- 数量と価値付きの供給資産
- 数量と価値付きの借入資産
- LP残高とプールID
- 請求可能な報酬
ステップ 6: NFTデータを取得 (OpenSea)
OpenSea MCPツールを呼び出します:
get_nft_balances:
address: {wallet_address}
sortBy: RECEIVED_DATE
limit: 100
これにより、以下の情報を含むUniswap LPポジションNFTが返されます:
- トークンID(プールID)
- 作成日(ポジションエントリー日)
- プール詳細(トークンペア、手数料階層)
ステップ 7: NFTアクティビティ履歴を取得
get_activity:
entityType: profile
entityId: {wallet_address}
limit: 100
これにより以下が提供されます:
- LPポジションのエントリー価格
- トランザクションハッシュ
- 履歴上のミント/転送
ステップ 8: データを構造化
references/debank-portfolio-schema.jsonのスキーマに一致するJSONを作成します:
{
"metadata": {
"source": "debank.com + opensea",
"scrapeTimestamp": "<ISO timestamp>",
"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"]
}
}
ステップ 9: データを保存
JSONを構造化した後:
1. 一時ファイルに書き込む:
JSONを一時ファイル(例:/tmp/portfolio-snapshot.json)に保存します
2. JSONスナップショットを保存(バックアップ):
mkdir -p data/snapshots/{address}
# data/snapshots/{address}/{YYYY-MM-DD}.json に書き込む
3. データベースに永続化:
cd scripts && npx ts-node debank-snapshot-saver.ts --file /tmp/portfolio-snapshot.json
データベースの場所に関する環境変数を設定します:
DB_PATH- SQLiteデータベースへのパス(デフォルト:../data/portfolio.db)SNAPSHOTS_DIR- JSONスナップショットへのパス(デフォルト:../data/snapshots)
作成されるデータベースレコード(各スクレイプで新しい行が追加され、上書きはされません):
portfolio_snapshots- 総額+チェーン別内訳(タイムスタンプ付き)position_snapshots- 個別のDeFiポジション(タイムスタンプ付き)reward_history- 請求可能な報酬(タイムスタンプ付き)
これにより、トレンド分析のための履歴データが構築されます。クエリ例:
-- 時系列のポートフォリオ価値
SELECT datetime(timestamp, 'unixepoch') as date, total_value
FROM portfolio_snapshots WHERE address = '0x...' ORDER BY timestamp;
-- 時系列のポジション変化
SELECT datetime(timestamp, 'unixepoch') as date, protocol, net_value
FROM position_snapshots WHERE address = '0x...' ORDER BY timestamp;
ステップ 10: 結果を報告
以下を要約して提供します:
ポートフォリオスクレイプ完了: 0x5a8a...ed45
総額: $36,694 (+0.11% 24h)
チェーン配分:
- Arbitrum: $26,011 (71%)
- Base: $10,650 (29%)
DEFIポジション:
- Aave V3 (Arbitrum): $13,643 ネット (健全性: 2.84)
- 供給: 18,784 USDC ($18,811)
- 借入: 1.0168 WETH ($3,011) + 0.0241 WBTC ($2,156)
- Compound V3 (Base): $10,635
- 供給: 10,584 USDC
- 報酬: 1.5 COMP ($36)
- Uniswap V4: $6,900
- プール #103120: WBTC/USDC
- 報酬: $50.21
- Uniswap V3: $5,142
- プール #4721026: WBTC/WETH
- 報酬: $18.92
LPポジション (OpenSeaより):
- 11個のUniswapポジションNFT
- 2025年2月からのエントリー履歴を追跡
請求可能な報酬: $105.27
- COMP: $36.12
- LP手数料: $69.15
データ保存先:
- data/snapshots/{address}/{date}.json
- data/portfolio.db
レート制限
- 複数ウォレットのスクレイピング間では30秒待機
- DeBankがレート制限を示した場合、60秒待機して再試行
エラーハンドリング
- ページが読み込めない: 「DeBankに到達できません」と報告し、ウォレットをスキップ
- データが見つからない: 「ウォレットが空か無効の可能性があります」と報告
- 部分的な障害: 収集できたデータを保存し、エラーを記録
データベーススキーマ
完全なテーブル定義は references/schema.sql を参照してください:
| テーブル | 目的 |
|---|---|
portfolio_snapshots | タイムスタンプごとの総額+チェーン別内訳 |
position_snapshots | トークン/報酬付きの個別DeFiポジション |
reward_history | 時系列の請求可能な報酬 |
apy_history | プロトコルのAPY追跡 |
transactions | 完全なトランザクション履歴 |