웹소켓 연결 완료
This commit is contained in:
94
scripts/ws_handshake_test.py
Normal file
94
scripts/ws_handshake_test.py
Normal 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())
|
||||
Reference in New Issue
Block a user