import json
import websocket
import ssl
import threading

# OKX WebSocket URL
OKX_WS_URL = "wss://wseea.okx.com:8443/ws/v5/public"

# 订阅频道配置
# subscribe_message = {
#     "op": "subscribe",
#     "args": [
#         {
#             "channel": "bbo-tbt",  # 选择 bbo-tbt 频道
#             "instId": "SLP-USDT"  # 订阅的第一个交易对
#         },
#         {
#             "channel": "bbo-tbt",  # 选择 bbo-tbt 频道
#             "instId": "GODS-USDT"  # 订阅的第二个交易对
#         }
#     ]
# }
symbols = [
    'FIL', 'BTC', 'ETH', 'XRP', 'ATOM', 'BCH', 'BSV', 'EOS', 'ETC', 'LTC', 
    'TRX', 'ADA', 'KNC', 'LINK', 'NEO', 'DOGE', 'ALGO', 'COMP', 'IOST', 'IOTA', 
    'ONT', 'QTUM', 'THETA', 'XLM', 'XTZ', 'MKR', 'SNX', 'ZRX', 'DOT', 'BAT', 
    'SUSHI', 'YFI', 'CRV', 'UMA', 'BAND', 'JST', 'KSM', 'TRB', 'BAL', 'LRC', 
    'RSR', 'STORJ', 'ZIL', 'UNI', 'AVAX', 'FLM', 'AAVE', 'CVC', 'GRT', 'NEAR', 
    'BNT', 'EGLD', '1INCH', 'SOL', 'BADGER', 'MASK', 'CFX', 'CHZ', 'MANA', 'ALPHA', 
    'PERP', 'SAND', 'CRO', 'LPT', 'RVN', 'XCH', 'SHIB', 'CSPR', 'ICP', 'MINA', 
    'AXS', 'YGG', 'SLP', 'AGLD', 'DYDX', 'CELO', 'GALA', 'KISHU', 'GODS', 'ENS', 
    'IMX', 'PEOPLE', 'NFT', 'BICO', 'LOOKS', 'API3', 'APE', 'GMT', 'LUNA', 'OP', 
    'LUNC', 'SWEAT', 'ETHW', 'APT', 'USTC', 'BNB', 'TON', 'LDO', 'GMX', 'MAGIC', 
    'CORE', 'AR', 'WOO', 'BLUR', 'FLOKI', 'STX', 'ARB', 'RDNT', 'PEPE', 'AIDOGE', 
    'SUI', 'CETUS', 'ORDI', 'WLD', 'HBAR', 'VRA', 'BIGTIME', 'ORBS', 'WAXP', 'GAS', 
    'TIA', 'MEME', 'FLOW', 'PYTH', 'SSV', 'INJ', 'AUCTION', 'ID', 'RON', 'CTC', 
    'TURBO', 'ACE', 'SATS', 'METIS', 'BONK', 'JTO', 'MOVR', 'NMR', 'JOE', 'FXS', 
    'LQTY', 'LSK', 'JUP', 'ZETA', 'OM', 'ONE', 'STRK', 'ACH', 'T', 'ICX', 'DGB', 
    'ENJ', 'VELO', 'RAY', 'AEVO', 'ETHFI', 'W', 'TNSR', 'FOXY', 'MEW', 'WIF', 'PRCL', 
    'MERL', 'ZENT', 'GLM', 'NOT', 'ULTI', 'ATH', 'ZK', 'ZRO', 'CVX', 'UXLINK', 'MAX', 
    'ONDO', 'RENDER', 'BOME', 'DOGS', 'POPCAT', 'NEIROETH', 'BRETT', 'CAT', 'TAO', 
    'CATI', 'POL', 'HMSTR', 'EIGEN', 'MOODENG', 'NEIRO', 'PUFFER', 'SCR', 'GOAT', 
    'X', 'GRASS', 'PNUT', 'ACT', 'DOG', 'DEGEN', 'SLERF', 'ARKM', 'OL', 'MEMEFI', 
    'SWELL', 'MORPHO', 'MAJOR', 'ZKJ', 'MOVE', 'ME', 'VIRTUAL', 'SUNDOG', 'VANA', 
    'PENGU', 'FARTCOIN', 'AI16Z', 'GRIFFAIN', 'ZEREBRO', 'AIXBT', 'ALCH', 'BIO', 'SONIC', 
    'DUCK', 'SOLV', 'NC', 'TRUMP', 'S', 'J', 'ANIME', 'ARC', 'SWARMS', 'COOKIE', 
    'VINE', 'AVAAI', 'BUZZ', 'PIPPIN', 'BERA', 'LAYER', 'IP', 'PI', 'KAITO', 'HYPE', 
    'SHELL', 'GPS'
]
# 订阅频道配置
subscribe_message = {
    "op": "subscribe",
    "args": [{"channel": "bbo-tbt", "instId": f"{symbol}-USDT"} for symbol in symbols]
}

# WebSocket 连接成功时的回调函数
def on_open(ws):
    print("WebSocket连接已打开，开始订阅...")
    ws.send(json.dumps(subscribe_message))  # 发送订阅请求

# WebSocket 接收到消息时的回调函数
def on_message(ws, message):
    print("收到的原始消息:")
    print(message)

# WebSocket 连接关闭时的回调函数
def on_close(ws, close_status_code, close_msg):
    print("WebSocket连接已关闭")

# WebSocket 错误时的回调函数
def on_error(ws, error):
    print(f"WebSocket发生错误: {error}")

# 创建并启动WebSocket连接
def start_ws():
    ws = websocket.WebSocketApp(
        OKX_WS_URL,
        on_open=on_open,
        on_message=on_message,
        on_close=on_close,
        on_error=on_error
    )
    
    # 由于 WebSocket 的默认行为是阻塞，所以我们需要运行它在一个单独的线程中
    ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

# 启动WebSocket连接
if __name__ == "__main__":
    ws_thread = threading.Thread(target=start_ws)
    ws_thread.start()
