#!/bin/bash # okx_proxy_test.sh - 完整测试 OKX 在国内 VPS 的可达性 # 区分: 直连 vs 走代理 vs 不带 proxies 字段的 ccxt # 2026-08-31 实测: 国内 VPS 直连 OKX 不通 (No route to host) -> GFW 屏蔽 (DNS 劫持到 169.254.0.2) # OKX 没有"国内节点", 必须依赖代理 (mihomo/clash 127.0.0.1:7890) set -e PYTHON="/home/openclaw/.hermes/hermes-agent/venv/bin/python" echo "=== OKX 国内 VPS 可达性测试 ===" echo "" echo "--- 1. 直连 (无 proxy env, 无 curl -x) ---" unset HTTPS_PROXY HTTP_PROXY https_proxy http_proxy RESP=$(curl -sS --max-time 10 -o /tmp/okx_resp.txt -w "%{http_code}" "https://www.okx.com/api/v5/public/time" 2>&1 || echo "FAIL") echo "HTTP: $RESP" echo "body: $(cat /tmp/okx_resp.txt 2>/dev/null | head -1)" echo "" echo "--- 2. 走 127.0.0.1:7890 代理 ---" RESP=$(curl -sS --max-time 10 -x http://127.0.0.1:7890 -o /tmp/okx_resp.txt -w "%{http_code}" "https://www.okx.com/api/v5/public/time" 2>&1 || echo "FAIL") echo "HTTP: $RESP" echo "body: $(cat /tmp/okx_resp.txt 2>/dev/null | head -1)" echo "" echo "--- 3. ccxt 不带 proxies (Python 默认不捡 shell env, trust_env=False) ---" $PYTHON << 'PYEOF' import ccxt, os bashrc = open('/home/openclaw/.bashrc').read() key = bashrc.split('OKX_API_KEY=')[1].split('\n')[0].strip() sec = bashrc.split('OKX_SECRET=')[1].split('\n')[0].strip() pwd = bashrc.split('OKX_PASSPHRASE=')[1].split('\n')[0].strip() ex = ccxt.okx({'apiKey':key,'secret':sec,'password':pwd, 'options':{'defaultType':'swap'}}) try: bal = ex.fetch_balance() print(f'✅ Free: ${bal["USDT"]["free"]:.2f}') except Exception as e: print(f'❌ {type(e).__name__}') PYEOF echo "" echo "--- 4. ccxt 带 proxies 127.0.0.1:7890 (推荐方式) ---" proxychains4 -f /home/openclaw/.proxychains/proxychains.conf $PYTHON << 'PYEOF' import ccxt bashrc = open('/home/openclaw/.bashrc').read() key = bashrc.split('OKX_API_KEY=')[1].split('\n')[0].strip() sec = bashrc.split('OKX_SECRET=')[1].split('\n')[0].strip() pwd = bashrc.split('OKX_PASSPHRASE=')[1].split('\n')[0].strip() ex = ccxt.okx({'apiKey':key,'secret':sec,'password':pwd, 'proxies':{'http':'http://127.0.0.1:7890','https':'http://127.0.0.1:7890'}, 'options':{'defaultType':'swap'}}) try: bal = ex.fetch_balance() print(f'✅ Free: ${bal["USDT"]["free"]:.2f}') except Exception as e: print(f'❌ {type(e).__name__}') PYEOF echo "" echo "--- 5. DNS 验证 (理解为什么直连失败) ---" echo "国内 DNS (114):" dig @114.114.114.114 www.okx.com +short 2>&1 | head -3 echo "Google DNS (8.8.8.8):" dig @8.8.8.8 www.okx.com +short 2>&1 | head -3 echo "" echo "都解析到 169.254.0.2 (APIPA, 不可路由) = GFW 屏蔽" echo "" echo "=== 结论 ===" echo "1. 国内 VPS 必须走 127.0.0.1:7890 代理" echo "2. 不是 OKX 限制, 是 GFW 屏蔽 (DNS 劫持 169.254.0.2)" echo "3. ccxt 必须显式写 proxies 字段 (不自动捡 shell env)" echo "4. okx_position_advisor.py 的 proxies 字段必须保留" echo "5. VPS 搬海外 (东京/新加坡/香港) 才能砍掉代理"