웹소켓 연결 완료

This commit is contained in:
2026-02-26 11:19:23 +09:00
parent ec02f27200
commit dbd2c4648b
9 changed files with 312 additions and 70 deletions

View File

@@ -0,0 +1,94 @@
#!/usr/bin/env python3
"""WebSocket handshake tester.
Usage:
python3 scripts/ws_handshake_test.py --url wss://openapivts.koreainvestment.com:29443/websocket/realtime \
--origin https://securities.koreainvestment.com --subprotocols realtime
Performs an HTTP GET diagnostic (https) and then attempts a websocket.connect()
while printing responses and exceptions.
"""
import argparse
import asyncio
import textwrap
try:
import httpx
except Exception:
httpx = None
try:
import websockets
from websockets.exceptions import InvalidStatusCode, ConnectionClosed
except Exception:
websockets = None
InvalidStatusCode = Exception
ConnectionClosed = Exception
async def main():
p = argparse.ArgumentParser()
p.add_argument("--url", required=True)
p.add_argument("--origin", required=False)
p.add_argument("--subprotocols", required=False, help="comma separated")
args = p.parse_args()
url = args.url
origin = args.origin
subs = None
if args.subprotocols:
subs = [s.strip() for s in args.subprotocols.split(",") if s.strip()]
print("-- HTTP GET diagnostic --")
if httpx is None:
print("httpx not installed. Skipping HTTP diagnostic.")
else:
http_url = url.replace("wss://", "https://").replace("ws://", "http://")
headers = {"User-Agent": "ws-handshake-test/1.0"}
if origin:
headers["Origin"] = origin
try:
async with httpx.AsyncClient(verify=True, timeout=10.0) as client:
resp = await client.get(http_url, headers=headers)
print(f"HTTP {resp.status_code}")
print("Headers:")
for k, v in list(resp.headers.items())[:10]:
print(f" {k}: {v}")
print("Body snippet:")
print(resp.text[:800])
except Exception as e:
print("HTTP diagnostic failed:", repr(e))
print("\n-- WebSocket handshake attempt --")
if websockets is None:
print("websockets package not installed. Install with: pip install websockets")
return
headers = [("User-Agent", "ws-handshake-test/1.0")]
if origin:
headers.append(("Origin", origin))
kwargs = dict(extra_headers=dict(headers))
if subs:
kwargs["subprotocols"] = subs
try:
async with websockets.connect(url, **kwargs) as ws:
print("Connected. Subprotocol:", ws.subprotocol)
await ws.send("ping")
try:
msg = await asyncio.wait_for(ws.recv(), timeout=3.0)
print("Received:", msg)
except asyncio.TimeoutError:
print("No response received (timeout)")
except InvalidStatusCode as isc:
status = getattr(isc, "status_code", None)
print(f"InvalidStatusCode: HTTP {status}")
except ConnectionClosed as cc:
print("ConnectionClosed:", cc)
except Exception as e:
print("WebSocket connect failed:", repr(e))
if __name__ == "__main__":
asyncio.run(main())