Community研究&データ分析github.com

DeBankポートフォリオスクレイパー

ブラウザ自動化を使用してDeBankから暗号資産ポートフォリオデータをスクレイピングし、SQLiteに永続化するAIエージェントスキル。

DeBankポートフォリオスクレイパー とは?

このスキルは、AIエージェント(Claude Code / Cursor / Codex)がブラウザ自動化を通じてDeBankから暗号資産ポートフォリオのスナップショットを取得し、OpenSeaとの統合によりLPポジションのエントリー価格を補完します。取得したデータは構造化JSONとして保存され、SQLiteデータベースに時系列で蓄積されるため、過去のポートフォリオ推移やポジション変動のトレンド分析が可能です。Playwright MCP(ブラウザ操作)とOpenSea MCP(NFTデータ取得)を必要とし、Node.js 18+およびSQLite環境で動作します。複数ウォレットの一括スクレイピングやレート制限対策、部分的な障害時でも収集できたデータを保存するエラーハンドリングを備えており、DeBank上のDeFiポジション、ウォレット残高、健全性レートなどを体系的に抽出・永続化します。

対応~Claude Code~Codex CLI~Cursor
npx skills add RoXsaita/debank-portfolio-skill

Installed? Explore more 研究&データ分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

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  # 設定ファイルから複数ウォレットをスクレイピング

データソース

  1. DeBank (Playwright) - DeFiポジション、ウォレット残高、健全性レート
  2. 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完全なトランザクション履歴

関連スキル