新增文件: - 数据源与交易品种完整手册_325个.md (100+加密品种 + 50+传统金融品种) - Go数据源集成方案.md (三级速率限制器 + 指数退避 + 自动降级) - 社交媒体实时情绪分析Go实现.md (VADER词典 + LLM增强) - scripts/verify_batch6_crypto_varieties.py (加密品种验证) - scripts/verify_batch7_fix.py (修复+新增验证) 验证统计: 325个端点通过, 19个平台, 100%免费
336 行
13 KiB
Python
336 行
13 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
批次6:验证加密货币全品种 + 传统金融代币化品种
|
||
目标:新增 60+ 个不重复数据源端点
|
||
"""
|
||
import requests
|
||
import json
|
||
import time
|
||
|
||
results = {}
|
||
|
||
def test(name, url, params=None, headers=None, method="GET", body=None, timeout=15):
|
||
"""通用测试函数"""
|
||
try:
|
||
h = {"User-Agent": "QuantKnowledge/2.0"}
|
||
if headers:
|
||
h.update(headers)
|
||
start = time.time()
|
||
if method == "POST":
|
||
r = requests.post(url, json=body, headers=h, timeout=timeout)
|
||
else:
|
||
r = requests.get(url, params=params, headers=h, timeout=timeout)
|
||
elapsed = round((time.time() - start) * 1000)
|
||
if r.status_code == 200:
|
||
data = r.json() if 'json' in r.headers.get('content-type','') else r.text[:200]
|
||
sample = str(data)[:300]
|
||
results[name] = {"status": "✅ PASS", "latency": f"{elapsed}ms", "sample": data if isinstance(data, dict) else sample}
|
||
print(f"✅ {name} ({elapsed}ms)")
|
||
return data
|
||
else:
|
||
results[name] = {"status": f"❌ HTTP {r.status_code}", "latency": f"{elapsed}ms"}
|
||
print(f"❌ {name} HTTP {r.status_code}")
|
||
return None
|
||
except Exception as e:
|
||
results[name] = {"status": f"❌ {str(e)[:80]}", "latency": "timeout"}
|
||
print(f"❌ {name}: {str(e)[:60]}")
|
||
return None
|
||
|
||
print("=" * 60)
|
||
print("第6批:加密货币全品种数据源验证")
|
||
print("=" * 60)
|
||
|
||
# ─── 一、Binance 多品种资金费率 + K线 ─────────────────────────────────
|
||
print("\n--- Binance 多品种 ---")
|
||
binance_symbols = [
|
||
("ADA", "ADAUSDT"), ("AVAX", "AVAXUSDT"), ("DOT", "DOTUSDT"),
|
||
("MATIC", "MATICUSDT"), ("LINK", "LINKUSDT"), ("UNI", "UNIUSDT"),
|
||
("AAVE", "AAVEUSDT"), ("OP", "OPUSDT"), ("ARB", "ARBUSDT"),
|
||
("APT", "APTUSDT"), ("SUI", "SUIUSDT"), ("SEI", "SEIUSDT"),
|
||
("TIA", "TIAUSDT"), ("INJ", "INJUSDT"), ("FET", "FETUSDT"),
|
||
("RNDR", "RNDRUSDT"), ("WLD", "WLDUSDT"), ("PEPE", "PEPEUSDT"),
|
||
("SHIB", "SHIBUSDT"), ("FLOKI", "FLOKIUSDT"), ("WIF", "WIFUSDT"),
|
||
("BONK", "BONKUSDT"), ("NEAR", "NEARUSDT"), ("FIL", "FILUSDT"),
|
||
("ATOM", "ATOMUSDT"), ("LTC", "LTCUSDT"), ("BCH", "BCHUSDT"),
|
||
("ETC", "ETCUSDT"), ("MKR", "MKRUSDT"), ("SNX", "SNXUSDT"),
|
||
("CRV", "CRVUSDT"), ("LDO", "LDOUSDT"), ("PENDLE", "PENDLEUSDT"),
|
||
("STX", "STXUSDT"), ("ORDI", "ORDIUSDT"), ("1000SATS", "1000SATSUSDT"),
|
||
("JUP", "JUPUSDT"), ("ONDO", "ONDOUSDT"), ("TAO", "TAOUSDT"),
|
||
("RENDER", "RENDERUSDT"),
|
||
]
|
||
|
||
for coin_name, symbol in binance_symbols:
|
||
test(
|
||
f"Binance {coin_name} 资金费率",
|
||
f"https://fapi.binance.com/fapi/v1/premiumIndex",
|
||
params={"symbol": symbol}
|
||
)
|
||
time.sleep(0.05) # 避免限流
|
||
|
||
# ─── 二、Binance 多品种 K 线 (选取代表性品种) ─────────────────────────
|
||
print("\n--- Binance 多品种 K 线 ---")
|
||
kline_symbols = [
|
||
("ADA", "ADAUSDT"), ("AVAX", "AVAXUSDT"), ("DOT", "DOTUSDT"),
|
||
("LINK", "LINKUSDT"), ("UNI", "UNIUSDT"), ("OP", "OPUSDT"),
|
||
("ARB", "ARBUSDT"), ("PEPE", "PEPEUSDT"), ("SHIB", "SHIBUSDT"),
|
||
("NEAR", "NEARUSDT"), ("ATOM", "ATOMUSDT"), ("LTC", "LTCUSDT"),
|
||
]
|
||
|
||
for coin_name, symbol in kline_symbols:
|
||
test(
|
||
f"Binance {coin_name} 合约K线",
|
||
f"https://fapi.binance.com/fapi/v1/klines",
|
||
params={"symbol": symbol, "interval": "1h", "limit": 2}
|
||
)
|
||
time.sleep(0.05)
|
||
|
||
# ─── 三、CoinGecko 多品种详细数据 ─────────────────────────────────────
|
||
print("\n--- CoinGecko 多品种 ---")
|
||
cg_coins = [
|
||
("avalanche-2", "AVAX"), ("polkadot", "DOT"), ("cardano", "ADA"),
|
||
("uniswap", "UNI"), ("aave", "AAVE"), ("optimism", "OP"),
|
||
("arbitrum", "ARB"), ("aptos", "APT"), ("sui", "SUI"),
|
||
("celestia", "TIA"), ("injective-protocol", "INJ"),
|
||
("fetch-ai", "FET"), ("render-token", "RNDR"), ("worldcoin-wld", "WLD"),
|
||
("pepe", "PEPE"), ("shiba-inu", "SHIB"), ("dogwifcoin", "WIF"),
|
||
("bonk", "BONK"), ("near", "NEAR"), ("filecoin", "FIL"),
|
||
("cosmos", "ATOM"), ("litecoin", "LTC"), ("bitcoin-cash", "BCH"),
|
||
("maker", "MKR"), ("lido-dao", "LDO"), ("pendle", "PENDLE"),
|
||
("stacks", "STX"), ("ondo-finance", "ONDO"),
|
||
]
|
||
|
||
for cg_id, symbol in cg_coins:
|
||
test(
|
||
f"CoinGecko {symbol} 详细数据",
|
||
f"https://api.coingecko.com/api/v3/simple/price",
|
||
params={"ids": cg_id, "vs_currencies": "usd", "include_market_cap": "true",
|
||
"include_24hr_vol": "true", "include_24hr_change": "true"}
|
||
)
|
||
time.sleep(2.5) # CoinGecko 30/min 限制
|
||
|
||
# ─── 四、CoinPaprika 多品种 ─────────────────────────────────────────
|
||
print("\n--- CoinPaprika 多品种 ---")
|
||
cp_coins = [
|
||
("ada-cardano", "ADA"), ("avax-avalanche", "AVAX"), ("dot-polkadot", "DOT"),
|
||
("link-chainlink", "LINK"), ("uni-uniswap", "UNI"), ("ltc-litecoin", "LTC"),
|
||
("atom-cosmos", "ATOM"), ("near-near-protocol", "NEAR"),
|
||
("op-optimism", "OP"), ("arb-arbitrum", "ARB"),
|
||
("pepe-pepe", "PEPE"), ("shib-shiba-inu", "SHIB"),
|
||
]
|
||
|
||
for cp_id, symbol in cp_coins:
|
||
test(
|
||
f"CoinPaprika {symbol} 行情",
|
||
f"https://api.coinpaprika.com/v1/tickers/{cp_id}"
|
||
)
|
||
time.sleep(0.15)
|
||
|
||
# ─── 五、Hyperliquid 多品种 ─────────────────────────────────────────
|
||
print("\n--- Hyperliquid 多品种 ---")
|
||
data = test(
|
||
"Hyperliquid 全品种永续合约",
|
||
"https://api.hyperliquid.xyz/info",
|
||
method="POST",
|
||
body={"type": "metaAndAssetCtxs"}
|
||
)
|
||
if data:
|
||
# 提取所有品种
|
||
try:
|
||
universe = data[0]["universe"] if isinstance(data, list) else data.get("universe", [])
|
||
coins = [u["name"] for u in universe[:50]]
|
||
results["Hyperliquid 全品种永续合约"]["sample"] = {
|
||
"total_assets": len(universe),
|
||
"top20": coins[:20]
|
||
}
|
||
print(f" Hyperliquid 品种数: {len(universe)}")
|
||
except:
|
||
pass
|
||
|
||
# ─── 六、DexScreener 热门代币 ─────────────────────────────────────
|
||
print("\n--- DexScreener 热门代币 ---")
|
||
dex_tokens = [
|
||
("PEPE", "0x6982508145454Ce325dDbE47a25d4ec3d2311933"),
|
||
("SHIB", "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE"),
|
||
("FLOKI", "0xcf0C122c6b73ff809C693DB761e7BaeBe62b6a2E"),
|
||
]
|
||
for name, addr in dex_tokens:
|
||
test(
|
||
f"DexScreener {name} DEX交易对",
|
||
f"https://api.dexscreener.com/latest/dex/tokens/{addr}"
|
||
)
|
||
time.sleep(0.3)
|
||
|
||
# ─── 七、Bybit 多品种 ─────────────────────────────────────────────
|
||
print("\n--- Bybit 多品种 ---")
|
||
bybit_symbols = [
|
||
("ADA", "ADAUSDT"), ("AVAX", "AVAXUSDT"), ("DOT", "DOTUSDT"),
|
||
("LINK", "LINKUSDT"), ("OP", "OPUSDT"), ("ARB", "ARBUSDT"),
|
||
("PEPE", "PEPEUSDT"), ("NEAR", "NEARUSDT"), ("ATOM", "ATOMUSDT"),
|
||
]
|
||
for coin_name, symbol in bybit_symbols:
|
||
test(
|
||
f"Bybit {coin_name} 合约K线",
|
||
f"https://api.bybit.com/v5/market/kline",
|
||
params={"category": "linear", "symbol": symbol, "interval": "60", "limit": 2}
|
||
)
|
||
time.sleep(0.1)
|
||
|
||
# ─── 八、OKX 多品种 ─────────────────────────────────────────────
|
||
print("\n--- OKX 多品种 ---")
|
||
okx_symbols = [
|
||
("ADA", "ADA-USDT-SWAP"), ("AVAX", "AVAX-USDT-SWAP"), ("DOT", "DOT-USDT-SWAP"),
|
||
("LINK", "LINK-USDT-SWAP"), ("OP", "OP-USDT-SWAP"), ("ARB", "ARB-USDT-SWAP"),
|
||
("PEPE", "PEPE-USDT-SWAP"), ("NEAR", "NEAR-USDT-SWAP"),
|
||
]
|
||
for coin_name, inst_id in okx_symbols:
|
||
test(
|
||
f"OKX {coin_name} 资金费率",
|
||
f"https://www.okx.com/api/v5/public/funding-rate",
|
||
params={"instId": inst_id}
|
||
)
|
||
time.sleep(0.15)
|
||
|
||
# ─── 九、Deribit 多品种期权 ─────────────────────────────────────────
|
||
print("\n--- Deribit 多品种 ---")
|
||
test(
|
||
"Deribit ETH 期权合约列表",
|
||
"https://www.deribit.com/api/v2/public/get_instruments",
|
||
params={"currency": "ETH", "kind": "option", "expired": "false"}
|
||
)
|
||
time.sleep(0.1)
|
||
test(
|
||
"Deribit SOL 期权合约列表",
|
||
"https://www.deribit.com/api/v2/public/get_instruments",
|
||
params={"currency": "SOL", "kind": "option", "expired": "false"}
|
||
)
|
||
time.sleep(0.1)
|
||
test(
|
||
"Deribit SOL 指数价格",
|
||
"https://www.deribit.com/api/v2/public/get_index_price",
|
||
params={"currency": "SOL"}
|
||
)
|
||
|
||
# ─── 十、传统金融代币化品种 (Binance 股票代币已下线,用其他方式) ──────
|
||
print("\n--- 传统金融代币化品种 ---")
|
||
|
||
# PAXG (黄金代币) - Binance
|
||
test(
|
||
"Binance PAXG/USDT 黄金代币",
|
||
"https://api.binance.com/api/v3/ticker/24hr",
|
||
params={"symbol": "PAXGUSDT"}
|
||
)
|
||
time.sleep(0.05)
|
||
|
||
# PAXG K线
|
||
test(
|
||
"Binance PAXG K线 (黄金代币)",
|
||
"https://api.binance.com/api/v3/klines",
|
||
params={"symbol": "PAXGUSDT", "interval": "1h", "limit": 3}
|
||
)
|
||
time.sleep(0.05)
|
||
|
||
# tBTC (Wrapped BTC)
|
||
test(
|
||
"CoinGecko tBTC 数据",
|
||
"https://api.coingecko.com/api/v3/simple/price",
|
||
params={"ids": "tbtc", "vs_currencies": "usd", "include_market_cap": "true"}
|
||
)
|
||
time.sleep(2.5)
|
||
|
||
# WBTC
|
||
test(
|
||
"CoinGecko WBTC 数据",
|
||
"https://api.coingecko.com/api/v3/simple/price",
|
||
params={"ids": "wrapped-bitcoin", "vs_currencies": "usd", "include_market_cap": "true"}
|
||
)
|
||
time.sleep(2.5)
|
||
|
||
# stETH
|
||
test(
|
||
"CoinGecko stETH 数据",
|
||
"https://api.coingecko.com/api/v3/simple/price",
|
||
params={"ids": "staked-ether", "vs_currencies": "usd", "include_market_cap": "true"}
|
||
)
|
||
time.sleep(2.5)
|
||
|
||
# rETH
|
||
test(
|
||
"CoinGecko rETH 数据",
|
||
"https://api.coingecko.com/api/v3/simple/price",
|
||
params={"ids": "rocket-pool-eth", "vs_currencies": "usd", "include_market_cap": "true"}
|
||
)
|
||
time.sleep(2.5)
|
||
|
||
# RWA 代币
|
||
rwa_coins = [
|
||
("ondo-finance", "ONDO"), ("maker", "MKR"), ("centrifuge", "CFG"),
|
||
("maple-finance", "MPL"), ("goldfinch", "GFI"),
|
||
]
|
||
for cg_id, symbol in rwa_coins:
|
||
test(
|
||
f"CoinGecko {symbol} RWA代币",
|
||
f"https://api.coingecko.com/api/v3/simple/price",
|
||
params={"ids": cg_id, "vs_currencies": "usd", "include_market_cap": "true",
|
||
"include_24hr_vol": "true"}
|
||
)
|
||
time.sleep(2.5)
|
||
|
||
# AI 代币
|
||
ai_coins = [
|
||
("fetch-ai", "FET"), ("singularitynet", "AGIX"), ("ocean-protocol", "OCEAN"),
|
||
("render-token", "RNDR"), ("bittensor", "TAO"), ("akash-network", "AKT"),
|
||
]
|
||
for cg_id, symbol in ai_coins:
|
||
test(
|
||
f"CoinGecko {symbol} AI代币",
|
||
f"https://api.coingecko.com/api/v3/simple/price",
|
||
params={"ids": cg_id, "vs_currencies": "usd", "include_market_cap": "true",
|
||
"include_24hr_vol": "true"}
|
||
)
|
||
time.sleep(2.5)
|
||
|
||
# ─── 十一、DeFiLlama 更多协议 ─────────────────────────────────────
|
||
print("\n--- DeFiLlama 更多协议 ---")
|
||
llama_protocols = [
|
||
"uniswap", "curve-dex", "pancakeswap", "gmx", "dydx",
|
||
"compound-v3", "morpho", "eigenlayer", "jito", "marinade-finance",
|
||
"raydium", "orca", "jupiter-aggregator",
|
||
]
|
||
for proto in llama_protocols:
|
||
test(
|
||
f"DeFiLlama {proto} 协议数据",
|
||
f"https://api.llama.fi/protocol/{proto}"
|
||
)
|
||
time.sleep(0.3)
|
||
|
||
# ─── 十二、Yahoo Finance 更多品种 ─────────────────────────────────
|
||
print("\n--- Yahoo Finance 更多品种 ---")
|
||
yahoo_extra = [
|
||
("NG=F", "天然气"), ("ZC=F", "玉米期货"), ("ZW=F", "小麦期货"),
|
||
("ZS=F", "大豆期货"), ("PL=F", "铂金"), ("PA=F", "钯金"),
|
||
("^FTSE", "富时100"), ("^GDAXI", "德国DAX"), ("^FCHI", "法国CAC40"),
|
||
("^KS11", "韩国KOSPI"), ("^TWII", "台湾加权"), ("^BVSP", "巴西BOVESPA"),
|
||
("000001.SS", "上证指数"), ("BTC-USD", "BTC/USD"),
|
||
("ETH-USD", "ETH/USD"), ("SOL-USD", "SOL/USD"),
|
||
("GBTC", "Grayscale BTC"), ("ARKB", "ARK BTC ETF"),
|
||
("BITB", "Bitwise BTC ETF"), ("BITO", "ProShares BTC期货ETF"),
|
||
]
|
||
for symbol, name in yahoo_extra:
|
||
test(
|
||
f"Yahoo {name} ({symbol})",
|
||
f"https://query1.finance.yahoo.com/v8/finance/chart/{symbol}",
|
||
params={"interval": "1d", "range": "5d"},
|
||
headers={"User-Agent": "Mozilla/5.0"}
|
||
)
|
||
time.sleep(0.2)
|
||
|
||
# ─── 保存结果 ─────────────────────────────────────────────────────
|
||
with open("verify_batch6_results.json", "w") as f:
|
||
json.dump(results, f, ensure_ascii=False, indent=2, default=str)
|
||
|
||
passed = sum(1 for v in results.values() if "✅" in v["status"])
|
||
failed = sum(1 for v in results.values() if "❌" in v["status"])
|
||
print(f"\n{'='*60}")
|
||
print(f"第6批验证完成: {passed} 通过 / {failed} 失败 / 总计 {len(results)}")
|
||
print(f"{'='*60}")
|